Alexandre Julliard : user32: Fix drawing of 1-bpp icons in DrawIconEx.

Alexandre Julliard julliard at winehq.org
Fri May 7 09:41:13 CDT 2010


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May  7 12:08:29 2010 +0200

user32: Fix drawing of 1-bpp icons in DrawIconEx.

---

 dlls/user32/cursoricon.c |   43 +++++++++++++++++++++++++++----------------
 1 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index 60ff29f..f4bdcdb 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -2294,28 +2294,40 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
 
         if (flags & DI_IMAGE)
         {
-            BITMAPINFOHEADER bmih;
-            unsigned char *dibBits;
-
-            memset(&bmih, 0, sizeof(BITMAPINFOHEADER));
-            bmih.biSize = sizeof(BITMAPINFOHEADER);
-            bmih.biWidth = ptr->nWidth;
-            bmih.biHeight = -ptr->nHeight;
-            bmih.biPlanes = ptr->bPlanes;
-            bmih.biBitCount = ptr->bBitsPerPixel;
-            bmih.biCompression = BI_RGB;
-
-            hXorBits = CreateDIBSection(hdc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS,
-                                        (void*)&dibBits, NULL, 0);
+            if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
+            {
+                hXorBits = CreateBitmap( ptr->nWidth, ptr->nHeight, 1, 1, xorBitmapBits );
+            }
+            else
+            {
+                unsigned char *dibBits;
+                BITMAPINFO *bmi = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                             FIELD_OFFSET( BITMAPINFO, bmiColors[256] ));
+                bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+                bmi->bmiHeader.biWidth = ptr->nWidth;
+                bmi->bmiHeader.biHeight = -ptr->nHeight;
+                bmi->bmiHeader.biPlanes = ptr->bPlanes;
+                bmi->bmiHeader.biBitCount = ptr->bBitsPerPixel;
+                bmi->bmiHeader.biCompression = BI_RGB;
+                /* FIXME: color table */
+
+                hXorBits = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, (void*)&dibBits, NULL, 0);
+                if (hXorBits)
+                {
+                    if(has_alpha)
+                        premultiply_alpha_channel(dibBits, xorBitmapBits, xorLength);
+                    else
+                        memcpy(dibBits, xorBitmapBits, xorLength);
+                }
+            }
 
-            if (hXorBits && dibBits)
+            if (hXorBits)
             {
                 if(has_alpha)
                 {
                     BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
 
                     /* Do the alpha blending render */
-                    premultiply_alpha_channel(dibBits, xorBitmapBits, xorLength);
                     hBitTemp = SelectObject( hMemDC, hXorBits );
 
                     if (DoOffscreen)
@@ -2329,7 +2341,6 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
                 }
                 else
                 {
-                    memcpy(dibBits, xorBitmapBits, xorLength);
                     hBitTemp = SelectObject( hMemDC, hXorBits );
                     if (DoOffscreen)
                         StretchBlt (hDC_off, 0, 0, cxWidth, cyWidth,




More information about the wine-cvs mailing list