user32: Do not use DIB APIs for bitmap bits in a device dependent format.
This commit is contained in:
parent
81a294f76d
commit
7670d76690
|
@ -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 */
|
||||
{
|
||||
HICON hIcon;
|
||||
HDC hdc;
|
||||
|
||||
TRACE_(icon)("%dx%dx%d, xor=%p, and=%p\n",
|
||||
nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
|
||||
|
||||
hdc=GetDC(0);
|
||||
if (!hdc)
|
||||
return 0;
|
||||
|
||||
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;
|
||||
HICON hIcon;
|
||||
|
||||
iinfo.fIcon=TRUE;
|
||||
iinfo.xHotspot=ICON_HOTSPOT;
|
||||
iinfo.yHotspot=ICON_HOTSPOT;
|
||||
iinfo.hbmMask=CreateBitmap(nWidth,nHeight,1,1,lpANDbits);
|
||||
TRACE_(icon)("%dx%d, planes %d, bpp %d, xor %p, and %p\n",
|
||||
nWidth, nHeight, bPlanes, bBitsPixel, lpXORbits, 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.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 );
|
||||
|
||||
iinfo.hbmColor = CreateDIBitmap( hdc, &bmi.bmiHeader,
|
||||
CBM_INIT, lpXORbits,
|
||||
&bmi, DIB_RGB_COLORS );
|
||||
hIcon = CreateIconIndirect( &iinfo );
|
||||
|
||||
DeleteObject( iinfo.hbmMask );
|
||||
DeleteObject( iinfo.hbmColor );
|
||||
|
||||
hIcon=CreateIconIndirect(&iinfo);
|
||||
DeleteObject(iinfo.hbmMask);
|
||||
DeleteObject(iinfo.hbmColor);
|
||||
}
|
||||
ReleaseDC(0,hdc);
|
||||
return hIcon;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue