mirror of
https://github.com/reactos/reactos.git
synced 2024-08-12 06:06:27 +00:00
Evgeniy Boltik <bstsoft@narod.ru>
- Enable and use mask support in UserDrawIconEx, fully compatible with Windows, based on tests in bug 4336. - Remove IntSet[Text/Bk]Color hacks from UserDrawIconEx, no longer required due to fix in CreateCompatibleDC. - Change a few comments in the code of UserDrawIconEx. See issue #4336 for more details. svn path=/trunk/; revision=40363
This commit is contained in:
parent
fe2cbf3735
commit
47325e09c4
|
@ -1388,8 +1388,6 @@ NtUserSetSystemCursor(
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: ReactOS specific hack */
|
|
||||||
BOOL
|
BOOL
|
||||||
UserDrawIconEx(
|
UserDrawIconEx(
|
||||||
HDC hDc,
|
HDC hDc,
|
||||||
|
@ -1405,7 +1403,6 @@ UserDrawIconEx(
|
||||||
BOOL Ret = FALSE;
|
BOOL Ret = FALSE;
|
||||||
HBITMAP hbmMask, hbmColor;
|
HBITMAP hbmMask, hbmColor;
|
||||||
BITMAP bmpMask, bmpColor;
|
BITMAP bmpMask, bmpColor;
|
||||||
COLORREF oldFg, oldBg;
|
|
||||||
BOOL DoFlickerFree;
|
BOOL DoFlickerFree;
|
||||||
SIZE IconSize;
|
SIZE IconSize;
|
||||||
|
|
||||||
|
@ -1413,8 +1410,10 @@ UserDrawIconEx(
|
||||||
HGDIOBJ hOldOffBrush = 0;
|
HGDIOBJ hOldOffBrush = 0;
|
||||||
HGDIOBJ hOldOffBmp = 0;
|
HGDIOBJ hOldOffBmp = 0;
|
||||||
HBITMAP hbmOff = 0;
|
HBITMAP hbmOff = 0;
|
||||||
HDC hdcMem = 0;
|
HDC hdcMask = 0;
|
||||||
HGDIOBJ hOldMem;
|
HGDIOBJ hOldMask = NULL;
|
||||||
|
HDC hdcImage = 0;
|
||||||
|
HGDIOBJ hOldImage = NULL;
|
||||||
BOOL bAlpha = FALSE;
|
BOOL bAlpha = FALSE;
|
||||||
|
|
||||||
hbmMask = pIcon->IconInfo.hbmMask;
|
hbmMask = pIcon->IconInfo.hbmMask;
|
||||||
|
@ -1452,7 +1451,8 @@ UserDrawIconEx(
|
||||||
PFN_DIB_GetPixel fnSource_GetPixel = NULL;
|
PFN_DIB_GetPixel fnSource_GetPixel = NULL;
|
||||||
INT x, y;
|
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);
|
psurfOff = SURFACE_LockSurface(hbmColor ? hbmColor : hbmMask);
|
||||||
if (psurfOff)
|
if (psurfOff)
|
||||||
{
|
{
|
||||||
|
@ -1549,61 +1549,63 @@ UserDrawIconEx(
|
||||||
else
|
else
|
||||||
hdcOff = hDc;
|
hdcOff = hDc;
|
||||||
|
|
||||||
hdcMem = NtGdiCreateCompatibleDC(hDc);
|
if (diFlags & DI_IMAGE)
|
||||||
if (!hdcMem)
|
|
||||||
{
|
{
|
||||||
DPRINT1("NtGdiCreateCompatibleDC() failed!\n");
|
hdcImage = NtGdiCreateCompatibleDC(hDc);
|
||||||
goto cleanup;
|
if (!hdcImage)
|
||||||
}
|
{
|
||||||
|
DPRINT1("NtGdiCreateCompatibleDC() failed!\n");
|
||||||
oldFg = IntGdiSetTextColor(hdcOff, RGB(0, 0, 0));
|
goto cleanup;
|
||||||
oldBg = IntGdiSetBkColor(hdcOff, RGB(255, 255, 255));
|
}
|
||||||
|
hOldImage = NtGdiSelectBitmap(hdcImage, (hbmColor ? hbmColor : hbmMask));
|
||||||
if (diFlags & DI_MASK)
|
if (!hOldImage)
|
||||||
{
|
|
||||||
hOldMem = NtGdiSelectBitmap(hdcMem, hbmMask);
|
|
||||||
if (!hOldMem)
|
|
||||||
{
|
{
|
||||||
DPRINT("NtGdiSelectBitmap() failed!\n");
|
DPRINT("NtGdiSelectBitmap() failed!\n");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
NtGdiStretchBlt(hdcOff,
|
|
||||||
(DoFlickerFree || bAlpha ? 0 : xLeft),
|
|
||||||
(DoFlickerFree || bAlpha ? 0 : yTop),
|
|
||||||
cxWidth,
|
|
||||||
cyHeight,
|
|
||||||
hdcMem,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
IconSize.cx,
|
|
||||||
IconSize.cy,
|
|
||||||
((diFlags & DI_IMAGE) ? SRCAND : SRCCOPY),
|
|
||||||
0);
|
|
||||||
|
|
||||||
NtGdiSelectBitmap(hdcMem, hOldMem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(diFlags & DI_IMAGE)
|
/* If DI_IMAGE flag is specified and hbmMask exists, then always use mask for drawing */
|
||||||
|
if (diFlags & DI_MASK || (diFlags & DI_IMAGE && hbmMask))
|
||||||
{
|
{
|
||||||
hOldMem = NtGdiSelectBitmap(hdcMem, (hbmColor ? hbmColor : hbmMask));
|
hdcMask = NtGdiCreateCompatibleDC(hDc);
|
||||||
|
if (!hdcMask)
|
||||||
|
{
|
||||||
|
DPRINT1("NtGdiCreateCompatibleDC() failed!\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
NtGdiStretchBlt(hdcOff,
|
hOldMask = NtGdiSelectBitmap(hdcMask, hbmMask);
|
||||||
(DoFlickerFree || bAlpha ? 0 : xLeft),
|
if (!hOldMask)
|
||||||
(DoFlickerFree || bAlpha ? 0 : yTop),
|
{
|
||||||
cxWidth,
|
DPRINT("NtGdiSelectBitmap() failed!\n");
|
||||||
cyHeight,
|
goto cleanup;
|
||||||
hdcMem,
|
}
|
||||||
0,
|
|
||||||
(hbmColor ? 0 : IconSize.cy),
|
|
||||||
IconSize.cx,
|
|
||||||
IconSize.cy,
|
|
||||||
((diFlags & DI_MASK) ? SRCINVERT : SRCCOPY),
|
|
||||||
0);
|
|
||||||
|
|
||||||
NtGdiSelectBitmap(hdcMem, hOldMem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hdcMask || hdcImage)
|
||||||
|
{
|
||||||
|
GreStretchBltMask(hdcOff,
|
||||||
|
(DoFlickerFree || bAlpha) ? 0 : xLeft,
|
||||||
|
(DoFlickerFree || bAlpha) ? 0 : yTop,
|
||||||
|
cxWidth,
|
||||||
|
cyHeight,
|
||||||
|
hdcImage ? hdcImage : hdcMask,
|
||||||
|
0,
|
||||||
|
((diFlags & DI_MASK && !(diFlags & DI_IMAGE)) ||
|
||||||
|
(diFlags & DI_IMAGE && hbmColor) ? 0 : IconSize.cy),
|
||||||
|
IconSize.cx,
|
||||||
|
IconSize.cy,
|
||||||
|
SRCCOPY,
|
||||||
|
0,
|
||||||
|
hdcImage ? hdcMask : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hOldMask) NtGdiSelectBitmap(hdcMask, hOldMask);
|
||||||
|
if (hOldImage) NtGdiSelectBitmap(hdcImage, hOldImage);
|
||||||
|
if (hdcImage) NtGdiDeleteObjectApp(hdcImage);
|
||||||
|
if (hdcMask) NtGdiDeleteObjectApp(hdcMask);
|
||||||
|
|
||||||
if (bAlpha)
|
if (bAlpha)
|
||||||
{
|
{
|
||||||
BITMAP bm;
|
BITMAP bm;
|
||||||
|
@ -1673,9 +1675,6 @@ UserDrawIconEx(
|
||||||
cyHeight, hdcOff, 0, 0, SRCCOPY, 0, 0);
|
cyHeight, hdcOff, 0, 0, SRCCOPY, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
IntGdiSetTextColor(hdcOff, oldFg);
|
|
||||||
IntGdiSetBkColor(hdcOff, oldBg);
|
|
||||||
|
|
||||||
Ret = TRUE;
|
Ret = TRUE;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -1687,7 +1686,6 @@ cleanup:
|
||||||
if(hdcOff) NtGdiDeleteObjectApp(hdcOff);
|
if(hdcOff) NtGdiDeleteObjectApp(hdcOff);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(hdcMem) NtGdiDeleteObjectApp(hdcMem);
|
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue