Dmitry Timoshkov : user32:
Do not use DIB APIs for bitmap bits in a device dependent format.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 24 06:18:04 CST 2007
Module: wine
Branch: master
Commit: 7670d76690f12a240ec0241a4bd96b8f5f5a7c6a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7670d76690f12a240ec0241a4bd96b8f5f5a7c6a
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Tue Jan 23 16:47:45 2007 +0800
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
* 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;
}
More information about the wine-cvs
mailing list