user32: Fallback to normal icon drawing if AlphaBlend fails.
This commit is contained in:
parent
7e23f9ce08
commit
f5f3426c87
|
@ -2030,11 +2030,11 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
|
||||||
r.right = cxWidth;
|
r.right = cxWidth;
|
||||||
r.bottom = cxWidth;
|
r.bottom = cxWidth;
|
||||||
|
|
||||||
if (!(hdc_dest = CreateCompatibleDC(hdc))) goto done;
|
if (!(hdc_dest = CreateCompatibleDC(hdc))) goto failed;
|
||||||
if (!(hB_off = CreateCompatibleBitmap(hdc, cxWidth, cyWidth)))
|
if (!(hB_off = CreateCompatibleBitmap(hdc, cxWidth, cyWidth)))
|
||||||
{
|
{
|
||||||
DeleteDC( hdc_dest );
|
DeleteDC( hdc_dest );
|
||||||
goto done;
|
goto failed;
|
||||||
}
|
}
|
||||||
SelectObject(hdc_dest, hB_off);
|
SelectObject(hdc_dest, hB_off);
|
||||||
FillRect(hdc_dest, &r, hbr);
|
FillRect(hdc_dest, &r, hbr);
|
||||||
|
@ -2052,7 +2052,16 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
|
||||||
oldFg = SetTextColor( hdc, RGB(0,0,0) );
|
oldFg = SetTextColor( hdc, RGB(0,0,0) );
|
||||||
oldBg = SetBkColor( hdc, RGB(255,255,255) );
|
oldBg = SetBkColor( hdc, RGB(255,255,255) );
|
||||||
|
|
||||||
if ((flags & DI_MASK) && (!ptr->alpha || !(flags & DI_IMAGE)))
|
if (ptr->alpha && (flags & DI_IMAGE))
|
||||||
|
{
|
||||||
|
BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
|
||||||
|
|
||||||
|
SelectObject( hMemDC, ptr->alpha );
|
||||||
|
if (GdiAlphaBlend( hdc_dest, x, y, cxWidth, cyWidth, hMemDC,
|
||||||
|
0, 0, ptr->width, ptr->height, pixelblend )) goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & DI_MASK)
|
||||||
{
|
{
|
||||||
SelectObject( hMemDC, ptr->mask );
|
SelectObject( hMemDC, ptr->mask );
|
||||||
StretchBlt( hdc_dest, x, y, cxWidth, cyWidth,
|
StretchBlt( hdc_dest, x, y, cxWidth, cyWidth,
|
||||||
|
@ -2061,15 +2070,7 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
|
||||||
|
|
||||||
if (flags & DI_IMAGE)
|
if (flags & DI_IMAGE)
|
||||||
{
|
{
|
||||||
if (ptr->alpha)
|
if (ptr->color)
|
||||||
{
|
|
||||||
BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
|
|
||||||
|
|
||||||
SelectObject( hMemDC, ptr->alpha );
|
|
||||||
GdiAlphaBlend( hdc_dest, x, y, cxWidth, cyWidth, hMemDC,
|
|
||||||
0, 0, ptr->width, ptr->height, pixelblend );
|
|
||||||
}
|
|
||||||
else if (ptr->color)
|
|
||||||
{
|
{
|
||||||
DWORD rop = (flags & DI_MASK) ? SRCINVERT : SRCCOPY;
|
DWORD rop = (flags & DI_MASK) ? SRCINVERT : SRCCOPY;
|
||||||
SelectObject( hMemDC, ptr->color );
|
SelectObject( hMemDC, ptr->color );
|
||||||
|
@ -2085,6 +2086,7 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
if (DoOffscreen) BitBlt( hdc, x0, y0, cxWidth, cyWidth, hdc_dest, 0, 0, SRCCOPY );
|
if (DoOffscreen) BitBlt( hdc, x0, y0, cxWidth, cyWidth, hdc_dest, 0, 0, SRCCOPY );
|
||||||
|
|
||||||
SetTextColor( hdc, oldFg );
|
SetTextColor( hdc, oldFg );
|
||||||
|
@ -2093,7 +2095,7 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
if (hdc_dest != hdc) DeleteDC( hdc_dest );
|
if (hdc_dest != hdc) DeleteDC( hdc_dest );
|
||||||
if (hB_off) DeleteObject(hB_off);
|
if (hB_off) DeleteObject(hB_off);
|
||||||
done:
|
failed:
|
||||||
DeleteDC( hMemDC );
|
DeleteDC( hMemDC );
|
||||||
release_icon_ptr( hIcon, ptr );
|
release_icon_ptr( hIcon, ptr );
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Reference in New Issue