comctl32:toolbar: [2/2] CopyBitmap function modification

Oleg Krylov oleg.krylov at gmail.com
Thu Jul 27 08:09:22 CDT 2006


comctl32:toolbar: [2/2] CopyBitmap function modification

changelog: 27.07.2006. by Oleg Krylov <oleg.krylov at gmail.com>

Modifies CopyBitmap (introduced in previous patch) to support DIB bitmaps
Behavior got tracing windows implementation.
FIXES Bug#: 1715

===============
diff -urN wine/dlls/comctl32/toolbar.c wineNew/dlls/comctl32/toolbar.c
--- wine/dlls/comctl32/toolbar.c        2006-07-27 13:45:36.000000000 +0300
+++ wineNew/dlls/comctl32/toolbar.c     2006-07-27 13:47:16.000000000 +0300
@@ -2577,16 +2577,45 @@
     BITMAP  bmp;
     HBITMAP hOldBitmapBitmap, hOldBitmapLoad, hbmLoad;
     HDC     hdcImage, hdcBitmap;
-
-    GetObjectW (hbm, sizeof(BITMAP), (LPVOID)&bmp);
+
+    if (!GetObjectW (hbm, sizeof(BITMAP), (LPVOID)&bmp))
+        return NULL;

     hdcImage  = CreateCompatibleDC(0);
     hdcBitmap = CreateCompatibleDC(0);

     /* create new bitmap */
-    hbmLoad = CreateBitmap (bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes,
bmp.bmBitsPixel, NULL);
-    hOldBitmapBitmap = SelectObject(hdcBitmap, hbm);
+    if(bmp.bmBits != NULL && bmp.bmBitsPixel <= 8)
+    {
+        struct
+        {
+            BITMAPINFOHEADER bmiHeader;
+            RGBQUAD bmiColors[256];
+        } bmi;
+        VOID *bits;
+
+        ZeroMemory (&bmi, sizeof(bmi));
+        bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+        bmi.bmiHeader.biWidth = bmp.bmWidth;
+        bmi.bmiHeader.biHeight = bmp.bmHeight;
+        bmi.bmiHeader.biPlanes = 1;
+        bmi.bmiHeader.biBitCount = bmp.bmBitsPixel;
+        if(bmp.bmBitsPixel<=1)
+            bmi.bmiHeader.biBitCount=1;
+        else if(bmp.bmBitsPixel<=4)
+            bmi.bmiHeader.biBitCount=4;
+        else
+            bmi.bmiHeader.biBitCount=8;
+        bmi.bmiHeader.biCompression = BI_RGB;
+
+        bmi.bmiHeader.biClrUsed = GetDIBColorTable (hdcBitmap, 0,
1<<bmi.bmiHeader.biBitCount, bmi.bmiColors);
+        hbmLoad = CreateDIBSection (hdcImage, (BITMAPINFO*)&bmi,
DIB_RGB_COLORS, &bits, 0, 0);
+    }
+    else
+        hbmLoad = CreateBitmapIndirect(&bmp);
+
     hOldBitmapLoad = SelectObject(hdcImage, hbmLoad);
+    hOldBitmapBitmap = SelectObject (hdcBitmap, hbm);

     /* Copy the user's image */
     BitBlt (hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight,



More information about the wine-patches mailing list