user32: Restore special handling of monochrome bitmaps removed by c2202929ab4b6d1ce37...
authorDmitry Timoshkov <dmitry@codeweavers.com>
Thu, 11 Mar 2010 08:22:33 +0000 (16:22 +0800)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 15 Mar 2010 14:07:15 +0000 (15:07 +0100)
dlls/user32/cursoricon.c

index a003cb06e930c8cfedbd8ec570c4387f61fb3404..0a9a89560de7835e7b5b0657b3c8ce9282de7bac 100644 (file)
@@ -765,6 +765,7 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
     int sizeAnd, sizeXor;
     HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */
     BITMAP bmpXor, bmpAnd;
+    BOOL do_stretch;
     INT size;
     BITMAPINFO *pSrcInfo, *pDestInfo;
 
@@ -788,10 +789,11 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
 
     if (!width) width = bmi->bmiHeader.biWidth;
     if (!height) height = bmi->bmiHeader.biHeight/2;
+    do_stretch = (bmi->bmiHeader.biHeight/2 != height) ||
+                 (bmi->bmiHeader.biWidth != width);
 
     /* Scale the hotspot */
-    if (((bmi->bmiHeader.biHeight/2 != height) || (bmi->bmiHeader.biWidth != width)) &&
-        hotspot.x != ICON_HOTSPOT && hotspot.y != ICON_HOTSPOT)
+    if (do_stretch && hotspot.x != ICON_HOTSPOT && hotspot.y != ICON_HOTSPOT)
     {
         hotspot.x = (hotspot.x * width) / bmi->bmiHeader.biWidth;
         hotspot.y = (hotspot.y * height) / (bmi->bmiHeader.biHeight / 2);
@@ -842,16 +844,30 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
             }
             else
             {
-                hXorBits = CreateCompatibleBitmap(screen_dc, width, height);
-
-                if(hXorBits)
+                if (do_stretch)
                 {
-                    if(!stretch_blt_icon(hXorBits, pDestInfo, pSrcInfo, (char*)bmi + size))
+                    hXorBits = CreateCompatibleBitmap(screen_dc, width, height);
+                    if (hXorBits)
                     {
-                        DeleteObject(hXorBits);
-                        hXorBits = 0;
+                        if (!stretch_blt_icon(hXorBits, pDestInfo, pSrcInfo, (char*)bmi + size))
+                        {
+                            DeleteObject(hXorBits);
+                            hXorBits = 0;
+                        }
                     }
                 }
+                else
+                {
+                    if (is_dib_monochrome(bmi))
+                    {
+                        hXorBits = CreateBitmap(width, height, 1, 1, NULL);
+                        SetDIBits(screen_dc, hXorBits, 0, height,
+                                  (char *)bmi + size, pSrcInfo, DIB_RGB_COLORS);
+                    }
+                    else
+                        hXorBits = CreateDIBitmap(screen_dc, &pSrcInfo->bmiHeader,
+                                        CBM_INIT, (char *)bmi + size, pSrcInfo, DIB_RGB_COLORS);
+                }
             }
 
             if( hXorBits )
@@ -879,12 +895,21 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
                 }
 
                 /* Create the AND bitmap */
-                hAndBits = CreateBitmap(width, height, 1, 1, NULL);
+                if (do_stretch)
+                {
+                    hAndBits = CreateBitmap(width, height, 1, 1, NULL);
 
-                if(!stretch_blt_icon(hAndBits, pDestInfo, pSrcInfo, xbits))
+                    if (!stretch_blt_icon(hAndBits, pDestInfo, pSrcInfo, xbits))
+                    {
+                        DeleteObject(hAndBits);
+                        hAndBits = 0;
+                    }
+                }
+                else
                 {
-                    DeleteObject(hAndBits);
-                    hAndBits = 0;
+                    hAndBits = CreateBitmap(width, height, 1, 1, NULL);
+                    SetDIBits(screen_dc, hAndBits, 0, height,
+                              xbits, pSrcInfo, DIB_RGB_COLORS);
                 }
 
                 if( !hAndBits )