implement strechblt for all 8bpp this code are not optimze. 
tested with winquake 8bpp to 16/32bpp. 
/* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */
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/dib/dib16bpp.c
--- trunk/reactos/subsys/win32k/dib/dib16bpp.c	2005-05-31 13:49:41 UTC (rev 15696)
+++ trunk/reactos/subsys/win32k/dib/dib16bpp.c	2005-05-31 14:11:02 UTC (rev 15697)
@@ -617,21 +617,176 @@
                              CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
                              ULONG Mode)
 {
+   int SrcSizeY;
+   int SrcSizeX;
+   int DesSizeY;
+   int DesSizeX;      
+   int sx;
+   int sy;
+   int DesX;
+   int DesY;
+   int color;
+
   DPRINT("DIB_16BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
      BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
      DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
 
+     SrcSizeY = SourceRect->bottom;
+     SrcSizeX = SourceRect->right;
+  
+     DesSizeY = DestRect->bottom;
+     DesSizeX = DestRect->right;   
+
+
     switch(SourceSurf->iBitmapFormat)
     {
-      case BMF_1BPP:
+            case BMF_1BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+ 		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);                 				
+
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+				    if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+					{
+					 DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
+					 } else {
+                     DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1));
+                     }					
+					}
+				}
+      break;
+
       case BMF_4BPP:
-      case BMF_8BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+
+				if (sy > SourceRect->bottom) break;
+
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+      break;
+
+      case BMF_8BPP:		
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+		break;
+
       case BMF_24BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+	  break;
+
       case BMF_32BPP:
-        /* Not implemented yet. */
-        return FALSE;
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}		  
       break;
 
+
       case BMF_16BPP:
         return ScaleRectAvg16(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin,
                               ClipRegion, ColorTranslation, Mode);

Modified: trunk/reactos/subsys/win32k/dib/dib1bpp.c
--- trunk/reactos/subsys/win32k/dib/dib1bpp.c	2005-05-31 13:49:41 UTC (rev 15696)
+++ trunk/reactos/subsys/win32k/dib/dib1bpp.c	2005-05-31 14:11:02 UTC (rev 15697)
@@ -478,16 +478,208 @@
    return TRUE;
 }
 
-BOOLEAN
-DIB_1BPP_StretchBlt (
-	SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
-	RECTL* DestRect, RECTL *SourceRect,
-	POINTL* MaskOrigin, POINTL BrushOrigin,
-	CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
-        ULONG Mode)
+//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,
+                            POINTL* MaskOrigin, POINTL BrushOrigin,
+                            CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
+                            ULONG Mode)
 {
-	DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
-	return FALSE;
+   int SrcSizeY;
+   int SrcSizeX;
+   int DesSizeY;
+   int DesSizeX;      
+   int sx;
+   int sy;
+   int DesX;
+   int DesY;
+   int color;
+
+   SrcSizeY = SourceRect->bottom;
+   SrcSizeX = SourceRect->right;
+  
+   DesSizeY = DestRect->bottom;
+   DesSizeX = DestRect->right;   
+
+    switch(SourceSurf->iBitmapFormat)
+    {
+      case BMF_1BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+
+				if (sy > SourceRect->bottom) break;
+
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_1BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_1BPP_PutPixel(DestSurf, DesX, DesY, color);
+					}
+				}
+      break;
+
+      case BMF_4BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+
+				if (sy > SourceRect->bottom) break;
+
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+      break;
+
+      case BMF_8BPP:		
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+		break;
+
+      case BMF_16BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+	  break;
+
+      case BMF_24BPP:
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}		  
+      break;
+      case BMF_32BPP:
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}		  
+      break;
+
+      default:
+      //DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
+      return FALSE;
+    }
+  
+  return TRUE;
 }
 
 BOOLEAN

Modified: trunk/reactos/subsys/win32k/dib/dib24bpp.c
--- trunk/reactos/subsys/win32k/dib/dib24bpp.c	2005-05-31 13:49:41 UTC (rev 15696)
+++ trunk/reactos/subsys/win32k/dib/dib24bpp.c	2005-05-31 14:11:02 UTC (rev 15697)
@@ -302,14 +302,211 @@
    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,
                             POINTL* MaskOrigin, POINTL BrushOrigin,
                             CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
                             ULONG Mode)
 {
-  DbgPrint("DIB_24BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
-  return FALSE;
+   int SrcSizeY;
+   int SrcSizeX;
+   int DesSizeY;
+   int DesSizeX;      
+   int sx;
+   int sy;
+   int DesX;
+   int DesY;
+   int color;
+
+   SrcSizeY = SourceRect->bottom;
+   SrcSizeX = SourceRect->right;
+  
+   DesSizeY = DestRect->bottom;
+   DesSizeX = DestRect->right;   
+
+    switch(SourceSurf->iBitmapFormat)
+    {
+      case BMF_1BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+ 		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);                 				
+
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+				    if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+					{
+					 DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
+					 } else {
+                     DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1));
+                     }					
+					}
+				}
+      break;
+
+      case BMF_4BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+
+				if (sy > SourceRect->bottom) break;
+
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+      break;
+
+      case BMF_8BPP:		
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+		break;
+
+      case BMF_16BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+	  break;
+
+      case BMF_24BPP:
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color);
+					}
+				}		  
+      break;
+
+      case BMF_32BPP:
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}		  
+      break;
+
+      default:
+      //DPRINT1("DIB_24BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
+      return FALSE;
+    }
+  
+  return TRUE;
 }
 
 BOOLEAN

Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c
--- trunk/reactos/subsys/win32k/dib/dib32bpp.c	2005-05-31 13:49:41 UTC (rev 15696)
+++ trunk/reactos/subsys/win32k/dib/dib32bpp.c	2005-05-31 14:11:02 UTC (rev 15697)
@@ -79,6 +79,7 @@
   switch(BltInfo->SourceSurface->iBitmapFormat)
   {
     case BMF_1BPP:
+	  
       sx = BltInfo->SourcePoint.x;
       sy = BltInfo->SourcePoint.y;
 
@@ -541,6 +542,7 @@
   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,
@@ -548,19 +550,173 @@
                             CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
                             ULONG Mode)
 {
-  DPRINT("DIB_32BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
+  
+   int SrcSizeY;
+   int SrcSizeX;
+   int DesSizeY;
+   int DesSizeX;      
+   int sx;
+   int sy;
+   int DesX;
+   int DesY;
+   int color;
+
+   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, SourceRect->bottom,
      DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
 
+   SrcSizeY = SourceRect->bottom;
+   SrcSizeX = SourceRect->right;
+  
+   DesSizeY = DestRect->bottom;
+   DesSizeX = DestRect->right;   
+
     switch(SourceSurf->iBitmapFormat)
     {
       case BMF_1BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+ 		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);                 				
+
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+				    if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+					{
+					 DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
+					 } else {
+                     DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1));
+                     }					
+					}
+				}
+      break;
+
       case BMF_4BPP:
-      case BMF_8BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+
+				if (sy > SourceRect->bottom) break;
+
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+      break;
+
+      case BMF_8BPP:		
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+		break;
+
       case BMF_16BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+	  break;
+
       case BMF_24BPP:
-         /* Not implemented yet. */
-         return FALSE;
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}		  
       break;
 
       case BMF_32BPP:

Modified: trunk/reactos/subsys/win32k/dib/dib4bpp.c
--- trunk/reactos/subsys/win32k/dib/dib4bpp.c	2005-05-31 13:49:41 UTC (rev 15696)
+++ trunk/reactos/subsys/win32k/dib/dib4bpp.c	2005-05-31 14:11:02 UTC (rev 15697)
@@ -356,14 +356,211 @@
    return TRUE;
 }
 
+//NOTE: If you change something here, please do the same in other dibXXbpp.c files!
 BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
                             RECTL* DestRect, RECTL *SourceRect,
                             POINTL* MaskOrigin, POINTL BrushOrigin,
                             CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
                             ULONG Mode)
 {
-  DbgPrint("DIB_4BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
-  return FALSE;
+   int SrcSizeY;
+   int SrcSizeX;
+   int DesSizeY;
+   int DesSizeX;      
+   int sx;
+   int sy;
+   int DesX;
+   int DesY;
+   int color;
+
+   SrcSizeY = SourceRect->bottom;
+   SrcSizeX = SourceRect->right;
+  
+   DesSizeY = DestRect->bottom;
+   DesSizeX = DestRect->right;   
+
+    switch(SourceSurf->iBitmapFormat)
+    {
+      case BMF_1BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+ 		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);                 				
+
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+				    if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+					{
+					 DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
+					 } else {
+                     DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1));
+                     }					
+					}
+				}
+      break;
+
+      case BMF_4BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{				
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+
+				if (sy > SourceRect->bottom) break;
+
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_4BPP_PutPixel(DestSurf, DesX, DesY, color);
+					}
+				}
+      break;
+
+      case BMF_8BPP:		
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+		break;
+
+      case BMF_16BPP:
+		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
+					}
+				}
+	  break;
+
+       case BMF_24BPP:
+  		   /* FIXME :  MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+   		   /* This is a reference implementation, it hasn't been optimized for speed */
+
+		  	for (DesY=0; DesY<DestRect->bottom; DesY++)
+			{
+				if (DesSizeY>SrcSizeY)
+				    sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
+				else
+                    sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); 
+                				
+				if (sy > SourceRect->bottom) break;
+
+				for (DesX=0; DesX<DestRect->right; DesX++)
+				{
+					if (DesSizeY>SrcSizeY)
+						sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+					else
+						sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);                 				       	            
+					
+					if (sx > SourceRect->right) break;
+
+					color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
+					DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
[truncated at 1000 lines; 223 more skipped]