Optimze DIB32_bitblt for both DGB=0 and DGB=1
Can not geting it faster with current c code
Modified: trunk/reactos/subsys/win32k/dib/dib.c
Modified: trunk/reactos/subsys/win32k/dib/dib.h
Modified: trunk/reactos/subsys/win32k/dib/dib16bpp.c
Modified: trunk/reactos/subsys/win32k/dib/dib1bpp.c
Modified: trunk/reactos/subsys/win32k/dib/dib24bpp.c
Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c
Modified: trunk/reactos/subsys/win32k/dib/dib4bpp.c
Modified: trunk/reactos/subsys/win32k/dib/dib8bpp.c
Modified: trunk/reactos/subsys/win32k/eng/bitblt.c

Modified: trunk/reactos/subsys/win32k/dib/dib.c
--- trunk/reactos/subsys/win32k/dib/dib.c	2005-06-07 23:11:35 UTC (rev 15839)
+++ trunk/reactos/subsys/win32k/dib/dib.c	2005-06-08 16:28:41 UTC (rev 15840)
@@ -35,57 +35,57 @@
    {
       DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine,
       DIB_1BPP_BitBlt, DIB_1BPP_BitBltSrcCopy, DIB_1BPP_StretchBlt,
-      DIB_1BPP_TransparentBlt
+      DIB_1BPP_TransparentBlt, DIB_1BPP_ColorFill
    },
    /* BMF_4BPP */
    {
       DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine,
       DIB_4BPP_BitBlt, DIB_4BPP_BitBltSrcCopy, DIB_4BPP_StretchBlt,
-      DIB_4BPP_TransparentBlt
+      DIB_4BPP_TransparentBlt, DIB_4BPP_ColorFill
    },
    /* BMF_8BPP */
    {
       DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine,
       DIB_8BPP_BitBlt, DIB_8BPP_BitBltSrcCopy, DIB_8BPP_StretchBlt,
-      DIB_8BPP_TransparentBlt
+      DIB_8BPP_TransparentBlt, DIB_8BPP_ColorFill
    },
    /* BMF_16BPP */
    {
       DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine,
       DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_16BPP_StretchBlt,
-      DIB_16BPP_TransparentBlt
+      DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill
    },
    /* BMF_24BPP */
    {
       DIB_24BPP_PutPixel, DIB_24BPP_GetPixel, DIB_24BPP_HLine, DIB_24BPP_VLine,
       DIB_24BPP_BitBlt, DIB_24BPP_BitBltSrcCopy, DIB_24BPP_StretchBlt,
-      DIB_24BPP_TransparentBlt
+      DIB_24BPP_TransparentBlt, DIB_24BPP_ColorFill
    },
    /* BMF_32BPP */
    {
       DIB_32BPP_PutPixel, DIB_32BPP_GetPixel, DIB_32BPP_HLine, DIB_32BPP_VLine,
       DIB_32BPP_BitBlt, DIB_32BPP_BitBltSrcCopy, DIB_32BPP_StretchBlt,
-      DIB_32BPP_TransparentBlt
+      DIB_32BPP_TransparentBlt, DIB_32BPP_ColorFill
    },
    /* BMF_4RLE */
    {
       Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
-      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt
+      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill
    },
    /* BMF_8RLE */
    {
       Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
-      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt
+      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill
    },
    /* BMF_JPEG */
    {
       Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
-      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt
+      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill
    },
    /* BMF_PNG */
    {
       Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
-      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt
+      Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt, Dummy_ColorFill
    }
 };
 
@@ -230,4 +230,10 @@
   return FALSE;
 }
 
+BOOLEAN Dummy_ColorFill(SURFOBJ* Dest, RECTL* DestRect, ULONG Color)
+{
+  return FALSE;
+}
+
+
 /* EOF */

Modified: trunk/reactos/subsys/win32k/dib/dib.h
--- trunk/reactos/subsys/win32k/dib/dib.h	2005-06-07 23:11:35 UTC (rev 15839)
+++ trunk/reactos/subsys/win32k/dib/dib.h	2005-06-08 16:28:41 UTC (rev 15840)
@@ -43,6 +43,7 @@
 typedef BOOLEAN (*PFN_DIB_BitBlt)(PBLTINFO);
 typedef BOOLEAN (*PFN_DIB_StretchBlt)(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 typedef BOOLEAN (*PFN_DIB_TransparentBlt)(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+typedef BOOLEAN (*PFN_DIB_ColorFill)(SURFOBJ*, RECTL*, ULONG);
 
 typedef struct
 {
@@ -54,6 +55,7 @@
   PFN_DIB_BitBlt         DIB_BitBltSrcCopy;
   PFN_DIB_StretchBlt     DIB_StretchBlt;
   PFN_DIB_TransparentBlt DIB_TransparentBlt;
+  PFN_DIB_ColorFill      DIB_ColorFill;
 } DIB_FUNCTIONS;
 
 extern DIB_FUNCTIONS DibFunctionsForBitmapFormat[];
@@ -65,6 +67,7 @@
 BOOLEAN Dummy_BitBlt(PBLTINFO);
 BOOLEAN Dummy_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN Dummy_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN Dummy_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 VOID DIB_1BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
 ULONG DIB_1BPP_GetPixel(SURFOBJ*,LONG,LONG);
@@ -74,6 +77,7 @@
 BOOLEAN DIB_1BPP_BitBltSrcCopy(PBLTINFO);
 BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN DIB_1BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 VOID DIB_4BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
 ULONG DIB_4BPP_GetPixel(SURFOBJ*,LONG,LONG);
@@ -83,6 +87,7 @@
 BOOLEAN DIB_4BPP_BitBltSrcCopy(PBLTINFO);
 BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN DIB_4BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 VOID DIB_8BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
 ULONG DIB_8BPP_GetPixel(SURFOBJ*,LONG,LONG);
@@ -92,6 +97,7 @@
 BOOLEAN DIB_8BPP_BitBltSrcCopy(PBLTINFO);
 BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN DIB_8BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 VOID DIB_16BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
 ULONG DIB_16BPP_GetPixel(SURFOBJ*,LONG,LONG);
@@ -101,6 +107,7 @@
 BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO);
 BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN DIB_16BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
 ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG);
@@ -110,6 +117,7 @@
 BOOLEAN DIB_24BPP_BitBltSrcCopy(PBLTINFO);
 BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN DIB_24BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 VOID DIB_32BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
 ULONG DIB_32BPP_GetPixel(SURFOBJ*,LONG,LONG);
@@ -119,17 +127,14 @@
 BOOLEAN DIB_32BPP_BitBltSrcCopy(PBLTINFO);
 BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG);
 BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
+BOOLEAN DIB_32BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
 
 BOOLEAN FASTCALL DIB_32DstInvert(PBLTINFO);
-BOOLEAN FASTCALL DIB32_Srccopy(PBLTINFO);
-BOOLEAN FASTCALL DIB32_ColorFill(PBLTINFO, ULONG);
+
 BOOLEAN FASTCALL DIB32_SrcPaint(PBLTINFO);
 BOOLEAN FASTCALL DIB32_NotSrcErase(PBLTINFO);
 BOOLEAN FASTCALL DIB32_SrcErase(PBLTINFO);
 
-BOOLEAN FASTCALL DIB_32PatCopy(PBLTINFO);
-
-
 extern unsigned char notmask[2];
 extern unsigned char altnotmask[2];
 #define MASK1BPP(x) (1<<(7-((x)&7)))

Modified: trunk/reactos/subsys/win32k/dib/dib16bpp.c
--- trunk/reactos/subsys/win32k/dib/dib16bpp.c	2005-06-07 23:11:35 UTC (rev 15839)
+++ trunk/reactos/subsys/win32k/dib/dib16bpp.c	2005-06-08 16:28:41 UTC (rev 15840)
@@ -42,6 +42,7 @@
 {
   PDWORD addr = (PDWORD)((PWORD)(SurfObj->pvScan0 + y * SurfObj->lDelta) + x1);
 
+ 
 #ifdef _M_IX86
   /* This is about 10% faster than the generic C code below */
   LONG Count = x2 - x1;
@@ -65,7 +66,7 @@
 "  jz   .L2\n"
 "  stosw\n"
 ".L2:\n"
-  : /* no output */
+  : // no output */
   : "r"(c), "r"(Count), "D"(addr)
   : "%eax", "%ecx");
 #else /* _M_IX86 */
@@ -88,6 +89,7 @@
 #endif /* _M_IX86 */
 }
 
+
 VOID
 DIB_16BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
 {
@@ -423,7 +425,17 @@
    return TRUE;
 }
 
-
+/* Optimze for bitBlt */
+BOOLEAN
+DIB_16BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
+{
+  ULONG DestY;	
+	for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
+  {
+    DIB_16BPP_HLine (DestSurface, DestRect->left, DestRect->right, DestY, color);
+  }
+return TRUE;
+}
 /*
 =======================================
  Stretching functions goes below

Modified: trunk/reactos/subsys/win32k/dib/dib1bpp.c
--- trunk/reactos/subsys/win32k/dib/dib1bpp.c	2005-06-07 23:11:35 UTC (rev 15839)
+++ trunk/reactos/subsys/win32k/dib/dib1bpp.c	2005-06-08 16:28:41 UTC (rev 15840)
@@ -478,6 +478,20 @@
    return TRUE;
 }
 
+/* Optimze for bitBlt */
+BOOLEAN 
+DIB_1BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
+{
+  ULONG DestY;	
+
+	 for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
+	{			 				
+		DIB_1BPP_HLine(DestSurface, DestRect->left, DestRect->right, DestY, color);			  				
+	}
+
+return TRUE;
+}
+
 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
 BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
                             RECTL* DestRect, RECTL *SourceRect,

Modified: trunk/reactos/subsys/win32k/dib/dib24bpp.c
--- trunk/reactos/subsys/win32k/dib/dib24bpp.c	2005-06-07 23:11:35 UTC (rev 15839)
+++ trunk/reactos/subsys/win32k/dib/dib24bpp.c	2005-06-08 16:28:41 UTC (rev 15840)
@@ -302,6 +302,20 @@
    return TRUE;
 }
 
+/* BitBlt Optimze */
+BOOLEAN 
+DIB_24BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
+{
+  ULONG DestY;	
+
+	 for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
+	{			 				
+		DIB_24BPP_HLine(DestSurface, DestRect->left, DestRect->right, DestY, color);			  				
+	}
+
+return TRUE;
+}
+
 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
 BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
                             RECTL* DestRect, RECTL *SourceRect,

Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c
--- trunk/reactos/subsys/win32k/dib/dib32bpp.c	2005-06-07 23:11:35 UTC (rev 15839)
+++ trunk/reactos/subsys/win32k/dib/dib32bpp.c	2005-06-08 16:28:41 UTC (rev 15840)
@@ -45,54 +45,46 @@
 VOID
 DIB_32BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
 {      
-  LONG cx  = (x2 - x1) ;
-  if (cx>0)
-  {
+  LONG cx  = (x2 - x1) ;  
    PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta;  
    PDWORD addr = (PDWORD)byteaddr + x1;
    memset4(addr, c, cx);  
-  }
-  else if (cx<0)
-  {
-   PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta;  
-   PDWORD addr = (PDWORD)byteaddr + x2;
-   cx = (x1 - x2) ;
-   memset4(addr, c, cx);  
-  }
   
+  
+  
 }
 #else
 VOID
 DIB_32BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
 {
- 
- 
-	PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta;  
-	PDWORD addr = (PDWORD)byteaddr + x1;		
-	LONG cx = x1;
-	while(cx < x2) 
-	{
-		*addr = (DWORD)c;
-		++addr;
-		++cx;
-	}	  
+  PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta;  
+  PDWORD addr = (PDWORD)byteaddr + x1;		
+  LONG cx = x1;
+  while(cx < x2) 
+  {
+    *addr = (DWORD)c;
+    ++addr;
+    ++cx;
+   }	  
 }
 #endif
 
 VOID
 DIB_32BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
 {
+
+  
   PBYTE byteaddr = SurfObj->pvScan0 + y1 * SurfObj->lDelta;
   PDWORD addr = (PDWORD)byteaddr + x;
-  LONG lDelta = SurfObj->lDelta >> 2; /* >> 2 == / sizeof(DWORD) */
+  LONG lDelta = SurfObj->lDelta >> 2; // >> 2 == / sizeof(DWORD) 
 
   byteaddr = (PBYTE)addr;
   while(y1++ < y2) 
   {
-	*addr = (DWORD)c;
-	addr += lDelta;
-	}
-   
+    *addr = (DWORD)c;
+    addr += lDelta;
+  } 
+  
 }
 
 BOOLEAN
@@ -315,236 +307,241 @@
 BOOLEAN
 DIB_32BPP_BitBlt(PBLTINFO BltInfo)
 {
-   ULONG DestX, DestY;
-   ULONG SourceX, SourceY;
-   ULONG PatternY = 0;
-   ULONG Dest, Source = 0, Pattern = 0;
-   BOOL UsesSource;
-   BOOL UsesPattern;
-   PULONG DestBits;
+  ULONG DestX, DestY;
+  ULONG SourceX, SourceY;
+  ULONG PatternY = 0, PatternX = 0, orgPatternX = 0;
+  ULONG Source = 0, Pattern = 0;
+  BOOL UsesSource;
+  BOOL UsesPattern;
+  PULONG DestBits;
+  ULONG Delta;
 
-   switch (BltInfo->Rop4)
-	{
+  switch (BltInfo->Rop4)
+  {  
+    case ROP4_DSTINVERT:		
+         return DIB_32DstInvert(BltInfo);
+    break;	
 
-		 case  ROP4_BLACKNESS:  
-			 //return(0x00000000);	
-			 return DIB32_ColorFill(BltInfo, 0x00000000);
-		 break;
+    case  ROP4_SRCPAINT:    	
+	    return DIB32_SrcPaint(BltInfo);
+    break;
 
-		 case ROP4_WHITENESS:   
-			 //return(0xFFFFFFFF);
-			  return DIB32_ColorFill(BltInfo, 0xFFFFFFFF);
-		 break;
+    case ROP4_NOTSRCERASE:  
+         return DIB32_NotSrcErase(BltInfo);
+    break; 
 
-		case  ROP4_SRCCOPY:     
-			  // return(Source);
-              return DIB32_Srccopy(BltInfo); 
-		break;	
-        
-		case ROP4_DSTINVERT:
-			 // return(~Dest);
-			 return DIB_32DstInvert(BltInfo);
-		break;	
-
-		case  ROP4_SRCPAINT:    
-			 // return(Dest | Source);	
-		     return DIB32_SrcPaint(BltInfo);
-		break;
-
-		case ROP4_NOTSRCERASE:  
-			 return DIB32_NotSrcErase(BltInfo);
-        break; 
-		case ROP4_SRCERASE:  
-			 return DIB32_SrcErase(BltInfo);
-        break; 
-
-		 case  ROP4_PATCOPY:     
-			 // return(Pattern);
-			 return DIB_32PatCopy(BltInfo);
-		 break;
+    case ROP4_SRCERASE:  
+         return DIB32_SrcErase(BltInfo);
+    break; 
 				
-		default:
-		break;
-         }	
+    default:
+    break;
+   }	
 
    UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4);
    UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4);
 
    SourceY = BltInfo->SourcePoint.y;
-   DestBits = (PULONG)(
-      BltInfo->DestSurface->pvScan0 +
-      (BltInfo->DestRect.left << 2) +
-      BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
+   DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
+                       BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
 
-   if (UsesPattern)
+   Delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 2); 
+          
+   if ((UsesSource) && (BltInfo->PatternSurface))
    {
-      if (BltInfo->PatternSurface)
+      if (UsesPattern)
       {
-         PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
-                    BltInfo->PatternSurface->sizlBitmap.cy;
+      PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
+                   BltInfo->PatternSurface->sizlBitmap.cy;
       }
-      else
+
+      orgPatternX = (BltInfo->DestRect.left + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx;
+       
+
+      for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
       {
-         Pattern = BltInfo->Brush->iSolidColor;
-      }
-   }
+        SourceX = BltInfo->SourcePoint.x;
 
-   for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
-   {
-      SourceX = BltInfo->SourcePoint.x;
+        PatternX = orgPatternX;
 
-      for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++, SourceX++)
+        for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++, SourceX++)
+        {
+         
+          Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
+        
+          Pattern = DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest);
+          
+          *DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, Source, Pattern);
+
+          PatternX++;
+          PatternX %= BltInfo->PatternSurface->sizlBitmap.cx;
+
+          }
+
+        SourceY++;
+        
+        PatternY++;
+        PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
+        
+        DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
+      }
+    }
+       
+    else if ((UsesSource) && (!BltInfo->PatternSurface))
+    {
+      if (UsesPattern)
       {
-         Dest = *DestBits;
+        Pattern = BltInfo->Brush->iSolidColor;
+      }
 
-         if (UsesSource)
-         {
-            Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
-         }
+      for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
+      {
+        SourceX = BltInfo->SourcePoint.x;        
 
-         if (BltInfo->PatternSurface)
-	 {
-            Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest);
+        for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++, SourceX++)
+        {                 
+          Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
+                
+          *DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, Source, Pattern);
          }
 
-         *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern);
+        SourceY++;        
+        DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
       }
+    }
 
-      SourceY++;
-      if (BltInfo->PatternSurface)
+    else if ((!UsesSource) && (BltInfo->PatternSurface))
+    {
+      if (UsesPattern)
       {
-         PatternY++;
-         PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
+       PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
+                   BltInfo->PatternSurface->sizlBitmap.cy;
       }
-      DestBits = (PULONG)(
-         (ULONG_PTR)DestBits -
-         ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 2) +
-         BltInfo->DestSurface->lDelta);
-   }
 
-   return TRUE;
-}
+      orgPatternX = (BltInfo->DestRect.left + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx;
+ 
+      for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
+      {       
 
-/* optimze functions for bitblt */
+        PatternX = orgPatternX;
 
-BOOLEAN
-FASTCALL
-DIB_32PatCopy(PBLTINFO BltInfo)   
-{
-	ULONG delta;
-	ULONG DestX, DestY, PatternY;    
-	PULONG DestBits; 	 
+        for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++)
+        {
+          
+          Pattern = DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest);
+          *DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, 0, Pattern);
 
-    if (!BltInfo->PatternSurface)
-	{	
-		return DIB32_ColorFill(BltInfo, XLATEOBJ_iXlate(BltInfo->XlatePatternToDest, BltInfo->Brush->iSolidColor));
-	}
+          PatternX++;
+          PatternX %= BltInfo->PatternSurface->sizlBitmap.cx;
+         }
+                
+        PatternY++;
+        PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
+        
+        DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
+      }
+    }
+    else if ((!UsesSource) && (!BltInfo->PatternSurface))
+    {
 
+      if (UsesPattern)
+      {
+        Pattern = BltInfo->Brush->iSolidColor;
+      }
 
-	DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
-					   BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
+      for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
+      {
 
-	delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2);
-   
-	PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % BltInfo->PatternSurface->sizlBitmap.cy;
-   
-   for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
-   {
+        for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++)
+        {                  
+          *DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, 0, Pattern);
+        }
 
-      for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++)
-      {       
-       *DestBits = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest);                  
+        DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
       }
-      
-      PatternY++;
-      PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;      
+    }
 
-      DestBits = (PULONG)((ULONG_PTR)DestBits + delta);	
-   }
-
-   
    return TRUE;
 }
 
+/* optimze functions for bitblt */
+
 BOOLEAN
 FASTCALL
 DIB_32DstInvert(PBLTINFO BltInfo)   
 {
-			ULONG DestX, DestY;		
-			PULONG DestBits;
+  ULONG DestX, DestY;		
+  PULONG DestBits;
 
-			ULONG bottom = BltInfo->DestRect.bottom;
-			ULONG right  = BltInfo->DestRect.right; 
-			ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
+  ULONG bottom = BltInfo->DestRect.bottom;
+  ULONG right  = BltInfo->DestRect.right; 
+  ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
 
-			 DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 +
-                      (BltInfo->DestRect.left << 2) +
-                       BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
+  DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
+                      BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
 												
-			for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
-			{											
-				for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++)
-				{
-										
-					*DestBits = ~*DestBits ;
-				}
+  for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
+  {											
+    for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++)
+    {
+      *DestBits = ~*DestBits ;
+    }
 				
-			 DestBits = (PULONG)((ULONG_PTR)DestBits + delta);				
-			 }
+    DestBits = (PULONG)((ULONG_PTR)DestBits + delta);				
+  }
 		
     
-    /* Return TRUE */
-    return TRUE;
+  /* Return TRUE */
+  return TRUE;
 }
 
 BOOLEAN 
 FASTCALL 
 DIB32_SrcErase(PBLTINFO BltInfo)
 {
-	BOOLEAN status = FALSE;
+  BOOLEAN status = FALSE;
 	
-	switch (BltInfo->SourceSurface->iBitmapFormat)
-	{			   
-		case BMF_1BPP:
-		case BMF_4BPP:						
-		case BMF_16BPP:
-		case BMF_24BPP:				
-		case BMF_32BPP:
-		{
-			ULONG DestX, DestY;
-			ULONG SourceX, SourceY;
-			PULONG DestBits;
+  switch (BltInfo->SourceSurface->iBitmapFormat)
+  {			   
+    case BMF_1BPP:
+    case BMF_4BPP:						
+    case BMF_16BPP:
+    case BMF_24BPP:				
+    case BMF_32BPP:
+    {
+      ULONG DestX, DestY;
+      ULONG SourceX, SourceY;
+      PULONG DestBits;
 
-			ULONG bottom = BltInfo->DestRect.bottom;
-			ULONG right  = BltInfo->DestRect.right; 
-			ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
+      ULONG bottom = BltInfo->DestRect.bottom;
+      ULONG right  = BltInfo->DestRect.right; 
+      ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
 
-			DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
-                                BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
+      DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
+                          BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
 									
-			SourceY =  BltInfo->SourcePoint.y;
+      SourceY = BltInfo->SourcePoint.y;
 
-			for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
-			{							
-				SourceX = BltInfo->SourcePoint.x;
-				for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
-				{						
-					*DestBits = ~(*DestBits & DIB_GetSource(BltInfo->SourceSurface,  SourceX, 
-                                               SourceY, BltInfo->XlateSourceToDest));
-				}
+      for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
+      {							
+        SourceX = BltInfo->SourcePoint.x;
+        for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
+        {						
+          *DestBits = ~(*DestBits & DIB_GetSource(BltInfo->SourceSurface,  SourceX, 
+          SourceY, BltInfo->XlateSourceToDest));
+        }
 				
-			 DestBits = (PULONG)((ULONG_PTR)DestBits + delta);				 
-			 SourceY++;	 
-			 }
-		
-		}
-		status = TRUE;
-	    break;			
+        DestBits = (PULONG)((ULONG_PTR)DestBits + delta);				 
+        SourceY++;	 
+       }		
+     }
+     status = TRUE;
+     break;			
 
 
-		default:
-		break;
-	}
+     default:
+     break;
+	   }
 
  return status;
 }
@@ -553,51 +550,50 @@
 FASTCALL 
 DIB32_NotSrcErase(PBLTINFO BltInfo)
 {
-	BOOLEAN status = FALSE;
+  BOOLEAN status = FALSE;
 	
-	switch (BltInfo->SourceSurface->iBitmapFormat)
-	{			   
-		case BMF_1BPP:
-		case BMF_4BPP:						
-		case BMF_16BPP:
-		case BMF_24BPP:				
-		case BMF_32BPP:
-		{
-			ULONG DestX, DestY;
-			ULONG SourceX, SourceY;
-			PULONG DestBits;
+  switch (BltInfo->SourceSurface->iBitmapFormat)
+  {			   
+    case BMF_1BPP:
+    case BMF_4BPP:						
+    case BMF_16BPP:
+    case BMF_24BPP:				
+    case BMF_32BPP:
+    {
+      ULONG DestX, DestY;
+      ULONG SourceX, SourceY;
+      PULONG DestBits;
 
-			ULONG bottom = BltInfo->DestRect.bottom;
-			ULONG right  = BltInfo->DestRect.right; 
-			ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
+      ULONG bottom = BltInfo->DestRect.bottom;
+      ULONG right  = BltInfo->DestRect.right; 
+      ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2);
 
-			DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
+      DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
                                 BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
 									
-			SourceY =  BltInfo->SourcePoint.y;
+      SourceY =  BltInfo->SourcePoint.y;
 
-			for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
-			{							
-				SourceX = BltInfo->SourcePoint.x;
-				for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
-				{						
-					*DestBits = ~(*DestBits | DIB_GetSource(BltInfo->SourceSurface,  SourceX, 
-                                               SourceY, BltInfo->XlateSourceToDest));
-				}
+      for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
+      {							
+        SourceX = BltInfo->SourcePoint.x;
+        for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
+        {						
+         *DestBits = ~(*DestBits | DIB_GetSource(BltInfo->SourceSurface,  SourceX, 
+                     SourceY, BltInfo->XlateSourceToDest));
+        }
 				
-			 DestBits = (PULONG)((ULONG_PTR)DestBits + delta);				 
-			 SourceY++;	 
-			 }
+      DestBits = (PULONG)((ULONG_PTR)DestBits + delta);				 
+      SourceY++;	 
+      }
 		
-		}
-		status = TRUE;
-	    break;			
+    }
+    status = TRUE;
+    break;			
 
+    default:
+    break;
+    }
 
-		default:
-		break;
-	}
-
  return status;
 }
 
@@ -605,214 +601,107 @@
 FASTCALL 
 DIB32_SrcPaint(PBLTINFO BltInfo)
 {
-	BOOLEAN status = FALSE;
+  BOOLEAN status = FALSE;
+	
+  switch (BltInfo->SourceSurface->iBitmapFormat)
+  {			   
+    case BMF_1BPP:
+    case BMF_4BPP:						
+    case BMF_16BPP:
+    case BMF_24BPP:				
+    {
+      ULONG DestX, DestY;
+      ULONG SourceX, SourceY;
+      PULONG DestBits;
 
-	// return(Source);
-	switch (BltInfo->SourceSurface->iBitmapFormat)
-	{			   
-		case BMF_1BPP:
-		case BMF_4BPP:						
-		case BMF_16BPP:
-		case BMF_24BPP:				
-		{
-			ULONG DestX, DestY;
-			ULONG SourceX, SourceY;
-			PULONG DestBits;
+      ULONG bottom = BltInfo->DestRect.bottom;
+      ULONG right  = BltInfo->DestRect.right; 
+      ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
 
-			ULONG bottom = BltInfo->DestRect.bottom;
-			ULONG right  = BltInfo->DestRect.right; 
-			ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
-
-			 DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 +
-                      (BltInfo->DestRect.left << 2) +
-                       BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
+      DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
+                  BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
 									
-			SourceY =  BltInfo->SourcePoint.y;
+      SourceY =  BltInfo->SourcePoint.y;
 
-			for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
-			{							
-				SourceX = BltInfo->SourcePoint.x;
-				for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
-				{
-										
-					*DestBits = (*DestBits | DIB_GetSource(BltInfo->SourceSurface,  SourceX, 
-                                               SourceY, BltInfo->XlateSourceToDest));
-				}
+      for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
+      {							
+        SourceX = BltInfo->SourcePoint.x;
+        for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
+        {										
+          *DestBits = (*DestBits | DIB_GetSource(BltInfo->SourceSurface,  SourceX, 
+                        SourceY, BltInfo->XlateSourceToDest));
+        }
 				
-			 DestBits = (PULONG)((ULONG_PTR)DestBits + delta);	
-			 SourceY++;	 
-			 }
+        DestBits = (PULONG)((ULONG_PTR)DestBits + delta);	
+        SourceY++;	 
+        }
 		
-		}
-		status = TRUE;
-	    break;			
+      }
+      status = TRUE;
+      break;			
 
-        case BMF_32BPP:
-		{
-			ULONG DestX, DestY;
-			ULONG SourceX, SourceY;			
-			PULONG DestBits;
+      case BMF_32BPP:
+      {
+        ULONG DestX, DestY;
+        ULONG SourceX, SourceY;			
+        PULONG DestBits;
 
-			ULONG bottom = BltInfo->DestRect.bottom;
-			ULONG right  = BltInfo->DestRect.right; 
-			ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
+        ULONG bottom = BltInfo->DestRect.bottom;
+        ULONG right  = BltInfo->DestRect.right; 
+        ULONG delta  = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2)  ;
 
-			 DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 +
-                      (BltInfo->DestRect.left << 2) +
-                       BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
+        DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
+                            BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
 									
-			SourceY =  BltInfo->SourcePoint.y;
+        SourceY =  BltInfo->SourcePoint.y;
 
-			for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
-			{
-							
-				SourceX = BltInfo->SourcePoint.x;
-				for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
-				{										
-					*DestBits = (*DestBits | DIB_32BPP_GetPixel(BltInfo->SourceSurface,  SourceX, SourceY));
-				}
+        for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
+	  {
+          SourceX = BltInfo->SourcePoint.x;
+          for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
+          {										
+            *DestBits = (*DestBits | DIB_32BPP_GetPixel(BltInfo->SourceSurface,  SourceX, SourceY));
+          }
 				
-			 DestBits = (PULONG)((ULONG_PTR)DestBits + delta);	
-			 SourceY++;	 
-			 }
+          DestBits = (PULONG)((ULONG_PTR)DestBits + delta);	
+          SourceY++;	 
+         }
 		
-		}
-		status = TRUE;
-	    break;
+       }
+       status = TRUE;
+       break;
 
-		default:
-		break;
+       default:
+       break;
 	}
 
  return status;
 }
 
 BOOLEAN 
-FASTCALL 
-DIB32_Srccopy(PBLTINFO BltInfo)
-{
-	BOOLEAN status = FALSE;
-
-	// return(Source);
-	switch (BltInfo->SourceSurface->iBitmapFormat)
-	{			   
-		case BMF_1BPP:
-		case BMF_4BPP:						
-		case BMF_16BPP:
-		case BMF_24BPP:
-		{
[truncated at 1000 lines; 237 more skipped]