Index: subsystems/win32/win32k/ntuser/cursoricon.c =================================================================== --- subsystems/win32/win32k/ntuser/cursoricon.c (revision 40114) +++ subsystems/win32/win32k/ntuser/cursoricon.c (working copy) @@ -1414,7 +1414,9 @@ HGDIOBJ hOldOffBmp = 0; HBITMAP hbmOff = 0; HDC hdcMem = 0; - HGDIOBJ hOldMem; + HGDIOBJ hOldMem = NULL; + HDC hdcMem2 = 0; + HGDIOBJ hOldMem2 = NULL; BOOL bAlpha = FALSE; hbmMask = pIcon->IconInfo.hbmMask; @@ -1452,7 +1454,8 @@ PFN_DIB_GetPixel fnSource_GetPixel = NULL; INT x, y; - //Find alpha into icon + //In order to correctly display 32 bit icons Windows first scans the image, + //because information about transparency is not stored in any image's headers. psurfOff = SURFACE_LockSurface(hbmColor ? hbmColor : hbmMask); if (psurfOff) { @@ -1549,61 +1552,59 @@ else hdcOff = hDc; - hdcMem = NtGdiCreateCompatibleDC(hDc); - if (!hdcMem) + oldFg = IntGdiSetTextColor(hdcOff, RGB(0, 0, 0)); + oldBg = IntGdiSetBkColor(hdcOff, RGB(255, 255, 255)); + + if (diFlags & DI_IMAGE) { - DPRINT1("NtGdiCreateCompatibleDC() failed!\n"); - goto cleanup; + hdcMem2 = NtGdiCreateCompatibleDC(hDc); + if (!hdcMem2) + { + DPRINT1("NtGdiCreateCompatibleDC() failed!\n"); + goto cleanup; + } + hOldMem2 = NtGdiSelectBitmap(hdcMem2, (hbmColor ? hbmColor : hbmMask)); } - oldFg = IntGdiSetTextColor(hdcOff, RGB(0, 0, 0)); - oldBg = IntGdiSetBkColor(hdcOff, RGB(255, 255, 255)); - if (diFlags & DI_MASK) { + hdcMem = NtGdiCreateCompatibleDC(hDc); + if (!hdcMem) + { + DPRINT1("NtGdiCreateCompatibleDC() failed!\n"); + goto cleanup; + } + hOldMem = NtGdiSelectBitmap(hdcMem, hbmMask); if (!hOldMem) { DPRINT("NtGdiSelectBitmap() failed!\n"); goto cleanup; } + } - NtGdiStretchBlt(hdcOff, + if (hdcMem || hdcMem2) + { + IntNtGdiStretchBlt(hdcOff, (DoFlickerFree || bAlpha ? 0 : xLeft), (DoFlickerFree || bAlpha ? 0 : yTop), cxWidth, cyHeight, - hdcMem, + hdcMem2 ? hdcMem2 : hdcMem, 0, - 0, + (diFlags & DI_IMAGE && hbmColor ? 0 : IconSize.cy), IconSize.cx, IconSize.cy, - ((diFlags & DI_IMAGE) ? SRCAND : SRCCOPY), - 0); - - NtGdiSelectBitmap(hdcMem, hOldMem); + SRCCOPY, + 0, + hdcMem2 ? hdcMem : NULL); } - if(diFlags & DI_IMAGE) - { - hOldMem = NtGdiSelectBitmap(hdcMem, (hbmColor ? hbmColor : hbmMask)); + if (hOldMem) NtGdiSelectBitmap(hdcMem, hOldMem); + if (hOldMem2) NtGdiSelectBitmap(hdcMem2, hOldMem2); + if (hdcMem2) NtGdiDeleteObjectApp(hdcMem2); + if (hdcMem) NtGdiDeleteObjectApp(hdcMem); - NtGdiStretchBlt(hdcOff, - (DoFlickerFree || bAlpha ? 0 : xLeft), - (DoFlickerFree || bAlpha ? 0 : yTop), - cxWidth, - cyHeight, - hdcMem, - 0, - (hbmColor ? 0 : IconSize.cy), - IconSize.cx, - IconSize.cy, - ((diFlags & DI_MASK) ? SRCINVERT : SRCCOPY), - 0); - - NtGdiSelectBitmap(hdcMem, hOldMem); - } - if (bAlpha) { BITMAP bm; @@ -1687,7 +1688,6 @@ if(hdcOff) NtGdiDeleteObjectApp(hdcOff); } - if(hdcMem) NtGdiDeleteObjectApp(hdcMem); return Ret; }