Dmitry Timoshkov : user32: Restore special handling of monochrome bitmaps removed by c2202929ab4b6d1ce379865dfd8904186814f265 .

Alexandre Julliard julliard at winehq.org
Mon Mar 15 12:19:39 CDT 2010


Module: wine
Branch: master
Commit: 52ebbb8aa75b8f5d8b72c48127761ceec073e071
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=52ebbb8aa75b8f5d8b72c48127761ceec073e071

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Thu Mar 11 16:22:33 2010 +0800

user32: Restore special handling of monochrome bitmaps removed by c2202929ab4b6d1ce379865dfd8904186814f265.

---

 dlls/user32/cursoricon.c |   49 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index a003cb0..0a9a895 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -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 )




More information about the wine-cvs mailing list