fix bug in color fill inline asm code. Did crash cirrus drv, vmware 5 drv and if the buffer was not align. Clean up inline asm code. Modified: trunk/reactos/subsys/win32k/dib/dib16bpp.c _____
Modified: trunk/reactos/subsys/win32k/dib/dib16bpp.c --- trunk/reactos/subsys/win32k/dib/dib16bpp.c 2005-06-12 19:06:38 UTC (rev 15878) +++ trunk/reactos/subsys/win32k/dib/dib16bpp.c 2005-06-12 19:23:40 UTC (rev 15879) @@ -344,24 +344,6 @@
PULONG DestBits; ULONG RoundedRight;
- /* - switch (BltInfo->Rop4) - { - case ROP4_PATCOPY: - if (!BltInfo->PatternSurface) - { - Pattern = BltInfo->Brush->iSolidColor | (BltInfo->Brush->iSolidColor << 16); - DIB_16BPP_ColorFill(BltInfo->DestSurface, BltInfo->DestRect, Pattern); - return TRUE; - } - - break; - - default: - break; - } -*/ - UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4); UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4);
@@ -454,31 +436,34 @@ ULONG delta = DestSurface->lDelta; ULONG width = (DestRect->right - DestRect->left) ; PULONG pos = (PULONG) (DestSurface->pvScan0 + DestRect->top * delta + (DestRect->left<<1)); - color = (color<<16)|(color&0xffff); /* If the color value is "abcd", put "abcdabcd" into color */ + color = (color&0xffff); /* If the color value is "abcd", put "abcdabcd" into color */ + color += (color<<16);
for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++) - { - int d0, d1, d2; + { __asm__ __volatile__ ( " cld\n" + " mov %0,%%eax\n" + " mov %1,%%ebx\n" " test $0x03, %%edi\n" /* Align to fullword boundary */ " jz .FL1\n" " stosw\n" - " dec %4\n" + " dec %%ebx\n" " jz .FL2\n" ".FL1:\n" - " mov %4,%%ecx\n" /* Setup count of fullwords to fill */ + " mov %%ebx,%%ecx\n" /* Setup count of fullwords to fill */ " shr $1,%%ecx\n" " rep stosl\n" /* The actual fill */ - " test $0x01, %4\n" /* One left to do at the right side? */ + " test $0x01, %%ebx\n" /* One left to do at the right side? */ " jz .FL2\n" " stosw\n" ".FL2:\n" - : "=&A" (d0), "=&r" (d1), "=&D" (d2) - : "0"(color), "1"(width), "2"(pos) - : "%ecx"); + : + : "r" (color), "r" (width), "D" (pos) + : "%eax", "%ecx","%ebx"); pos =(PULONG)((ULONG_PTR)pos + delta); } + #else /* _M_IX86 */
for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)