fix wallpaper style center and implement tile.
Modified: trunk/reactos/subsys/win32k/ntuser/desktop.c

Modified: trunk/reactos/subsys/win32k/ntuser/desktop.c
--- trunk/reactos/subsys/win32k/ntuser/desktop.c	2005-11-27 23:36:55 UTC (rev 19713)
+++ trunk/reactos/subsys/win32k/ntuser/desktop.c	2005-11-28 01:09:27 UTC (rev 19714)
@@ -1227,35 +1227,118 @@
 
          sz.cx = DeskWin->WindowRect.right - DeskWin->WindowRect.left;
          sz.cy = DeskWin->WindowRect.bottom - DeskWin->WindowRect.top;
-
-
-         x = (sz.cx / 2) - (WinSta->cxWallpaper / 2);
-         y = (sz.cy / 2) - (WinSta->cyWallpaper / 2);
-
+ 
+         if(WinSta->WallpaperMode == wmStretch ||
+            WinSta->WallpaperMode == wmTile)
+         {
+            x = 0;
+            y = 0;
+         }
+         else
+         {
+            x = (sz.cx / 2) - (WinSta->cxWallpaper / 2);
+            y = (sz.cy / 2) - (WinSta->cyWallpaper / 2);
+         }
+ 
          hWallpaperDC = NtGdiCreateCompatibleDC(hDC);
          if(hWallpaperDC != NULL)
          {
             HBITMAP hOldBitmap;
-
+ 
             if(x > 0 || y > 0)
             {
-               /* FIXME - clip out the bitmap */
-               PreviousBrush = NtGdiSelectObject(hDC, DesktopBrush);
-               NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom, PATCOPY);
-               NtGdiSelectObject(hDC, PreviousBrush);
+               /* FIXME - clip out the bitmap 
+                                            can be replaced with "NtGdiPatBlt(hDC, x, y, WinSta->cxWallpaper, WinSta->cyWallpaper, PATCOPY | DSTINVERT);"
+                                            once we support DSTINVERT */
+              PreviousBrush = NtGdiSelectObject(hDC, DesktopBrush);
+              NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom, PATCOPY);
+              NtGdiSelectObject(hDC, PreviousBrush);
             }
+ 
+            //Do not fill the background after it is painted no matter the size of the picture
+            doPatBlt = FALSE;
+ 
+            hOldBitmap = NtGdiSelectObject(hWallpaperDC, WinSta->hbmWallpaper);
+ 
+            if(WinSta->WallpaperMode == wmStretch)
+            {
+#if 0 //Broken Stretch Code
+                /* Fix me, stretch the bitmap to fit the screen.  I'm not smart enough to do this  :( */
+                BITMAPINFO bmINFO;
+                LPVOID pBits;
+                bmINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+                /* Get bits */
+                NtGdiGetDIBits(hDC,
+                               WinSta->hbmWallpaper,
+                               0,
+                               WinSta->cyWallpaper,
+                               NULL, // what goes here?
+                               &bmINFO,
+                               DIB_RGB_COLORS);
+                               
+                bmINFO.bmiHeader.biCompression = BI_RGB;
+                
+                pBits = ExAllocatePool(PagedPool,bmINFO.bmiHeader.biSizeImage);
+                
+                if(pBits == NULL)
+                {
+                    doPatBlt = TRUE;                
+                }
+                else
+                {
+                
+                    NtGdiGetDIBits(hDC,
+                                   WinSta->hbmWallpaper,
+                                   0,
+                                   WinSta->cyWallpaper,
+                                   (LPVOID)pBits, // what goes here?
+                                   &bmINFO,
+                                   DIB_RGB_COLORS);
+                    DPRINT1("Before Draw\n");               
+                    
+                    /* Stretch it to fit the screen */
+                    NtGdiStretchDIBits(hDC,
+                                       0,
+                                       0,
+                                       Rect.right, 
+                                       Rect.bottom,
+                                       0,
+                                       0,
+                                       WinSta->cxWallpaper, 
+                                       WinSta->cyWallpaper,
+                                       (LPVOID)pBits, // get this from NtGdiGetDiBits?
+                                       &bmINFO, // get this from NtGdiGetDiBits?
+                                       DIB_RGB_COLORS,
+                                       SRCCOPY);
+                    ExFreePool(pBits);
+                }
+#else
+                /* Draw nothing */
+                doPatBlt = TRUE;
+#endif //Broken Stretch Code
+            }
+            else if(WinSta->WallpaperMode == wmTile)
+            {
+            
+                for(y = 0; y < Rect.bottom; y += WinSta->cyWallpaper)
+                {
+                    for(x = 0; x < Rect.right; x += WinSta->cxWallpaper)
+                    {
+                        NtGdiBitBlt(hDC, x, y, WinSta->cxWallpaper, WinSta->cyWallpaper, hWallpaperDC, 0, 0, SRCCOPY);
+                    }
+                }
+            }
             else
-               doPatBlt = FALSE;
-
-            hOldBitmap = NtGdiSelectObject(hWallpaperDC, WinSta->hbmWallpaper);
-            NtGdiBitBlt(hDC, x, y, WinSta->cxWallpaper, WinSta->cyWallpaper, hWallpaperDC, 0, 0, SRCCOPY);
-            NtGdiSelectObject(hWallpaperDC, hOldBitmap);
-
+            {
+                NtGdiBitBlt(hDC, x, y, WinSta->cxWallpaper, WinSta->cyWallpaper, hWallpaperDC, 0, 0, SRCCOPY);
+            } 
+            NtGdiSelectObject(hWallpaperDC, hOldBitmap); 
             NtGdiDeleteDC(hWallpaperDC);
          }
       }
    }
 
+   /* Back ground is set to none, clear the screen */
    if (doPatBlt)
    {
       PreviousBrush = NtGdiSelectObject(hDC, DesktopBrush);