[2/2] user32: Do not use DIB APIs for bitmap bits in a device dependent format

Dmitry Timoshkov dmitry at codeweavers.com
Tue Jan 23 02:47:45 CST 2007


[2/2] user32: Do not use DIB APIs for bitmap bits in a device dependent format

Hello,

CreateIcon is another API that uses DIB APIs inappropriately, although
it clearly states that the provided bitmaps must be in a device dependent
format.

Changelog:
    user32: Do not use DIB APIs for bitmap bits in a device dependent format.

---
 dlls/user32/cursoricon.c |   80 ++++++++--------------------------------------
 1 files changed, 14 insertions(+), 66 deletions(-)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index a5e0d00..7bbb79a 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -1236,24 +1236,7 @@ HICON16 WINAPI CreateIcon16( HINSTANCE16 hInstance, INT16 nWidth,
  *  Success: handle to an icon
  *  Failure: NULL
  *
- * BUGS
- *
- *  - The provided bitmaps are not resized!
- *  - The documentation says the lpXORbits bitmap must be in a device
- *    dependent format. But we must still resize it and perform depth
- *    conversions if necessary.
- *  - I'm a bit unsure about the how the 'device dependent format' thing works.
- *    I did some tests on windows and found that if you provide a 16bpp bitmap
- *    in lpXORbits, then its format but be 565 RGB if the screen's bit depth
- *    is 16bpp but it must be 555 RGB if the screen's bit depth is anything
- *    else. I don't know if this is part of the GDI specs or if this is a
- *    quirk of the graphics card driver.
- *  - You may think that we check whether the bit depths match or not
- *    as an optimization. But the truth is that the conversion using
- *    CreateDIBitmap does not work for some bit depth (e.g. 8bpp) and I have
- *    no idea why.
- *  - I'm pretty sure that all the things we do in CreateIcon should
- *    also be done in CreateIconIndirect...
+ * FIXME: Do we need to resize the bitmaps?
  */
 HICON WINAPI CreateIcon(
     HINSTANCE hInstance,  /* [in] the application's hInstance */
@@ -1264,58 +1247,23 @@ HICON WINAPI CreateIcon(
     LPCVOID   lpANDbits,  /* [in] a monochrome bitmap representing the icon's mask */
     LPCVOID   lpXORbits)  /* [in] the icon's 'color' bitmap */
 {
+    ICONINFO iinfo;
     HICON hIcon;
-    HDC hdc;
 
-    TRACE_(icon)("%dx%dx%d, xor=%p, and=%p\n",
-                 nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
+    TRACE_(icon)("%dx%d, planes %d, bpp %d, xor %p, and %p\n",
+                 nWidth, nHeight, bPlanes, bBitsPixel, lpXORbits, lpANDbits);
 
-    hdc=GetDC(0);
-    if (!hdc)
-        return 0;
+    iinfo.fIcon = TRUE;
+    iinfo.xHotspot = ICON_HOTSPOT;
+    iinfo.yHotspot = ICON_HOTSPOT;
+    iinfo.hbmMask = CreateBitmap( nWidth, nHeight, 1, 1, lpANDbits );
+    iinfo.hbmColor = CreateBitmap( nWidth, nHeight, bPlanes, bBitsPixel, lpXORbits );
+
+    hIcon = CreateIconIndirect( &iinfo );
+
+    DeleteObject( iinfo.hbmMask );
+    DeleteObject( iinfo.hbmColor );
 
-    if (GetDeviceCaps(hdc,BITSPIXEL)==bBitsPixel) {
-        CURSORICONINFO info;
-
-        info.ptHotSpot.x = ICON_HOTSPOT;
-        info.ptHotSpot.y = ICON_HOTSPOT;
-        info.nWidth = nWidth;
-        info.nHeight = nHeight;
-        info.nWidthBytes = 0;
-        info.bPlanes = bPlanes;
-        info.bBitsPerPixel = bBitsPixel;
-
-        hIcon=HICON_32(CreateCursorIconIndirect16(0, &info, lpANDbits, lpXORbits));
-    } else {
-        ICONINFO iinfo;
-        BITMAPINFO bmi;
-
-        iinfo.fIcon=TRUE;
-        iinfo.xHotspot=ICON_HOTSPOT;
-        iinfo.yHotspot=ICON_HOTSPOT;
-        iinfo.hbmMask=CreateBitmap(nWidth,nHeight,1,1,lpANDbits);
-
-        bmi.bmiHeader.biSize=sizeof(bmi.bmiHeader);
-        bmi.bmiHeader.biWidth=nWidth;
-        bmi.bmiHeader.biHeight=-nHeight;
-        bmi.bmiHeader.biPlanes=bPlanes;
-        bmi.bmiHeader.biBitCount=bBitsPixel;
-        bmi.bmiHeader.biCompression=BI_RGB;
-        bmi.bmiHeader.biSizeImage=0;
-        bmi.bmiHeader.biXPelsPerMeter=0;
-        bmi.bmiHeader.biYPelsPerMeter=0;
-        bmi.bmiHeader.biClrUsed=0;
-        bmi.bmiHeader.biClrImportant=0;
-
-        iinfo.hbmColor = CreateDIBitmap( hdc, &bmi.bmiHeader,
-                                         CBM_INIT, lpXORbits,
-                                         &bmi, DIB_RGB_COLORS );
-
-        hIcon=CreateIconIndirect(&iinfo);
-        DeleteObject(iinfo.hbmMask);
-        DeleteObject(iinfo.hbmColor);
-    }
-    ReleaseDC(0,hdc);
     return hIcon;
 }
 
-- 
1.4.4.4






More information about the wine-patches mailing list