[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