fix new strechblt code for dib32, left todo dib1, dib4, dib24
Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c

Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c
--- trunk/reactos/subsys/win32k/dib/dib32bpp.c	2006-01-05 00:56:44 UTC (rev 20566)
+++ trunk/reactos/subsys/win32k/dib/dib32bpp.c	2006-01-05 01:49:00 UTC (rev 20567)
@@ -528,7 +528,6 @@
   return TRUE;
 }
 
-
 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
 BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
                             RECTL* DestRect, RECTL *SourceRect,
@@ -537,21 +536,18 @@
                             ULONG Mode)
 {
   
-   int SrcSizeY;
-   int SrcSizeX;
-   int DesSizeY;
-   int DesSizeX;      
-   int sx;
-   int sy;
-   int DesX;
-   int DesY;
-   int color;
-   int zoomX;
-   int zoomY;
-   int count;
-   int saveX;
-   int saveY;
-   BOOLEAN DesIsBiggerY=FALSE;
+   LONG SrcSizeY;
+   LONG SrcSizeX;
+   LONG DesSizeY;
+   LONG DesSizeX;      
+   LONG sx;
+   LONG sy;
+   LONG DesX;
+   LONG DesY;
+   LONG color;
+   PULONG DestBits;
+   LONG DifflDelta;
+
       
    DPRINT("DIB_32BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
             BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, 
@@ -560,654 +556,136 @@
     SrcSizeY = SourceRect->bottom - SourceRect->top;
     SrcSizeX = SourceRect->right - SourceRect->left;
   
-    DesSizeY = DestRect->bottom ;
-    DesSizeX = DestRect->right;   
+    DesSizeY = DestRect->bottom - DestRect->top;
+    DesSizeX = DestRect->right - DestRect->left;   
 
-    zoomX = DesSizeX / SrcSizeX;
-    if (zoomX==0) zoomX=1;
-    
-    zoomY = DesSizeY / SrcSizeY;
-    if (zoomY==0) zoomY=1;
 
-    if (DesSizeY>SrcSizeY)
-      DesIsBiggerY = TRUE;  
-
     switch(SourceSurf->iBitmapFormat)
     {
-      case BMF_1BPP:		
-  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
-   		   /* This is a reference implementation, it hasn't been optimized for speed */
-           if (zoomX>1)
-		   {
-		     /* Draw one Hline on X - Led to the Des Zoom In*/
-		     if (DesSizeX>SrcSizeX)
-			 {
-		  		for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
+     case BMF_1BPP:
+	  /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+      /* This is a reference implementation, it hasn't been optimized for speed */
+                      
+      DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) +
+                  DestRect->top * DestSurf->lDelta);
+       
+	   DifflDelta = DestSurf->lDelta -  (DesSizeX << 1); 
+	                
+       for (DesY=0; DesY<DesSizeY; DesY++)
+       {			 
+           sy = ((DesY  * SrcSizeY) / DesSizeY) + SourceRect->top;
+                     
+            for (DesX=0; DesX<DesSizeX; DesX++, DestBits++ )
+            {			
+                 sx = ((DesX  * SrcSizeX) / DesSizeX) + SourceRect->left;  		
+                   		
+                  if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+				  {
+					*DestBits =  XLATEOBJ_iXlate(ColorTranslation, 0);
+                  } 
+				  else 
+				  {
+                    *DestBits =  XLATEOBJ_iXlate(ColorTranslation, 1);
+                  }
+            }
+            DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
+       }		
 
-					saveY = DesY+zoomY;
+	  break;
 
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						saveX = DesX + zoomX;
+      case BMF_4BPP:		
+      /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+      /* This is a reference implementation, it hasn't been optimized for speed */
+                      
+      DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) +
+                  DestRect->top * DestSurf->lDelta);
+       
+	   DifflDelta = DestSurf->lDelta -  (DesSizeX << 1); 
+	                
+       for (DesY=0; DesY<DesSizeY; DesY++)
+       {			 
+           sy = ((DesY  * SrcSizeY) / DesSizeY) + SourceRect->top;
+                     
+            for (DesX=0; DesX<DesSizeX; DesX++, DestBits++ )
+            {			
+                 sx = ((DesX  * SrcSizeX) / DesSizeX) + SourceRect->left;  		
+                 color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+                 *DestBits =  XLATEOBJ_iXlate(ColorTranslation, color);
+            }
+            
+            DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
+       }	  	   
+      break;
 
-						if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) 
-						   for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, 0);
-						else
-							for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, 1);
-					                    																	
-					  }										
-				  }
-			    }
-			 else
-			 {
-			   /* Draw one Hline on X - Led to the Des Zoom Out*/
+      case BMF_8BPP:
+      /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+      /* This is a reference implementation, it hasn't been optimized for speed */
+      
+      DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) +
+                  DestRect->top * DestSurf->lDelta);
+       
+	   DifflDelta = DestSurf->lDelta -  (DesSizeX << 1); 
+	                
+       for (DesY=0; DesY<DesSizeY; DesY++)
+       {			 
+           sy = ((DesY  * SrcSizeY) / DesSizeY) + SourceRect->top;
+                     
+            for (DesX=0; DesX<DesSizeX; DesX++, DestBits++)
+            {			
+                 sx = ((DesX  * SrcSizeX) / DesSizeX) + SourceRect->left;  		
+                 color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
+                 *DestBits =  XLATEOBJ_iXlate(ColorTranslation, color);
+            }
+            DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
+       }	  	   		
+      break;
 
-               for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						saveX = DesX + zoomX;
-
-						if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) 
-						   for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, 0);
-						else
-							for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, 1);
-					                    																	
-					  }										
-				  }
-			 }
-		   }			
-		   else
-		   {
-		    
-		    if (DesSizeX>SrcSizeX)
-			{
-				/* Draw one pixel on X - Led to the Des Zoom In*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) 
-						   for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, 0);										
-						else
-							for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, 1);										
-					                    
-						
-					 }
-		          }
-			 }
-			else
-			{
-				/* Draw one pixel on X - Led to the Des Zoom Out*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) 
-						   for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, 0);										
-						else
-							for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, 1);										
-					                    						
-					 }
-		          }
-			}
-		   }
-		break;
-
- case BMF_4BPP:		
-  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
-   		   /* This is a reference implementation, it hasn't been optimized for speed */
-           if (zoomX>1)
-		   {
-		     /* Draw one Hline on X - Led to the Des Zoom In*/
-		     if (DesSizeX>SrcSizeX)
-			 {
-		  		for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			    }
-			 else
-			 {
-			   /* Draw one Hline on X - Led to the Des Zoom Out*/
-
-               for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			 }
-		   }
-			
-		   else
-		   {
-		    
-		    if (DesSizeX>SrcSizeX)
-			{
-				/* Draw one pixel on X - Led to the Des Zoom In*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			 }
-			else
-			{
-				/* Draw one pixel on X - Led to the Des Zoom Out*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			}
-		   }
-		break;
-
-      case BMF_8BPP:		
-  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
-   		   /* This is a reference implementation, it hasn't been optimized for speed */
-           if (zoomX>1)
-		   {
-		     /* Draw one Hline on X - Led to the Des Zoom In*/
-		     if (DesSizeX>SrcSizeX)
-			 {
-		  		for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			    }
-			 else
-			 {
-			   /* Draw one Hline on X - Led to the Des Zoom Out*/
-
-               for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			 }
-		   }
-			
-		   else
-		   {
-		    
-		    if (DesSizeX>SrcSizeX)
-			{
-				/* Draw one pixel on X - Led to the Des Zoom In*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			 }
-			else
-			{
-				/* Draw one pixel on X - Led to the Des Zoom Out*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			}
-		   }
-		break;
-
       case BMF_16BPP:		
-  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
-   		   /* This is a reference implementation, it hasn't been optimized for speed */
-           if (zoomX>1)
-		   {
-		     /* Draw one Hline on X - Led to the Des Zoom In*/
-		     if (DesSizeX>SrcSizeX)
-			 {
-		  		for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
+      /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+      /* This is a reference implementation, it hasn't been optimized for speed */
+                      
+      DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) +
+                  DestRect->top * DestSurf->lDelta);
+       
+	   DifflDelta = DestSurf->lDelta -  (DesSizeX << 1); 
+	                
+       for (DesY=0; DesY<DesSizeY; DesY++)
+       {			 
+           sy = ((DesY  * SrcSizeY) / DesSizeY) + SourceRect->top;
+                     
+            for (DesX=0; DesX<DesSizeX; DesX++, DestBits++)
+            {			
+                 sx = ((DesX  * SrcSizeX) / DesSizeX) + SourceRect->left;  		
+                 color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
+                 *DestBits =  XLATEOBJ_iXlate(ColorTranslation, color);
+            }
+            DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
+       }	  	   
+	  break;
 
-					saveY = DesY+zoomY;
+      case BMF_24BPP:
+      /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+      /* This is a reference implementation, it hasn't been optimized for speed */
+                      
+      DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) +
+                  DestRect->top * DestSurf->lDelta);
+       
+	   DifflDelta = DestSurf->lDelta -  (DesSizeX << 1); 
+	                
+       for (DesY=0; DesY<DesSizeY; DesY++)
+       {			 
+           sy = ((DesY  * SrcSizeY) / DesSizeY) + SourceRect->top;
+                     
+            for (DesX=0; DesX<DesSizeX; DesX++, DestBits++)
+            {			
+                 sx = ((DesX  * SrcSizeX) / DesSizeX) + SourceRect->left;  		
+                 color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
+                 *DestBits =  XLATEOBJ_iXlate(ColorTranslation, color);
+            }
+            DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
+       }	  
+	   break;
 
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			    }
-			 else
-			 {
-			   /* Draw one Hline on X - Led to the Des Zoom Out*/
-
-               for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			 }
-		   }
-			
-		   else
-		   {
-		    
-		    if (DesSizeX>SrcSizeX)
-			{
-				/* Draw one pixel on X - Led to the Des Zoom In*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			 }
-			else
-			{
-				/* Draw one pixel on X - Led to the Des Zoom Out*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			}
-		   }
-		break;
-
-      case BMF_24BPP:		
-  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
-   		   /* This is a reference implementation, it hasn't been optimized for speed */
-           if (zoomX>1)
-		   {
-		     /* Draw one Hline on X - Led to the Des Zoom In*/
-		     if (DesSizeX>SrcSizeX)
-			 {
-		  		for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			    }
-			 else
-			 {
-			   /* Draw one Hline on X - Led to the Des Zoom Out*/
-
-               for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
-					                    					
-						saveX = DesX + zoomX;
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_HLine(DestSurf, DesX, saveX, count, color);
-					  }										
-				  }
-			 }
-		   }
-			
-		   else
-		   {
-		    
-		    if (DesSizeX>SrcSizeX)
-			{
-				/* Draw one pixel on X - Led to the Des Zoom In*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{						
-						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
-						
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			 }
-			else
-			{
-				/* Draw one pixel on X - Led to the Des Zoom Out*/
-				for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY)
-				{
-					if (DesIsBiggerY)
-						sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
-					else
-						sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
-                				
-					if (sy > SourceRect->bottom) break;
-
-					saveY = DesY+zoomY;
-
-					for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX)				
-					{
-						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
-					
-						if (sx > SourceRect->right) break;
-					
-						color =  XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
-					                    
-						for (count=DesY;count<saveY;count++)
-							DIB_32BPP_PutPixel(DestSurf, DesX, count, color);										
-					 }
-		          }
-			}
-		   }
-		break;
-
       case BMF_32BPP:
         return ScaleRectAvg32(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin,
                               ClipRegion, ColorTranslation, Mode);