Alexandre Julliard : comctl32: Use DrawIconEx to copy icon bits and use the correct background color.
Alexandre Julliard
julliard at winehq.org
Fri Dec 16 11:22:54 CST 2011
Module: wine
Branch: master
Commit: 40cf298c7524f4475b4636301798263aed1d437c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=40cf298c7524f4475b4636301798263aed1d437c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Dec 16 14:19:38 2011 +0100
comctl32: Use DrawIconEx to copy icon bits and use the correct background color.
---
dlls/comctl32/imagelist.c | 76 +++++++++++++-------------------------------
1 files changed, 23 insertions(+), 53 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index 81ee655..4e71795 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -2531,7 +2531,6 @@ done:
INT WINAPI
ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
{
- HDC hdcImage;
HICON hBestFitIcon;
ICONINFO ii;
BITMAP bmp;
@@ -2563,23 +2562,6 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (!hBestFitIcon)
return -1;
- ret = GetIconInfo (hBestFitIcon, &ii);
- if (!ret) {
- DestroyIcon(hBestFitIcon);
- return -1;
- }
-
- ret = GetObjectW (ii.hbmMask, sizeof(BITMAP), &bmp);
- if (!ret) {
- ERR("couldn't get mask bitmap info\n");
- if (ii.hbmColor)
- DeleteObject (ii.hbmColor);
- if (ii.hbmMask)
- DeleteObject (ii.hbmMask);
- DestroyIcon(hBestFitIcon);
- return -1;
- }
-
if (nIndex == -1) {
if (himl->cCurImage + 1 > himl->cMaxImage)
IMAGELIST_InternalExpandBitmaps(himl, 1);
@@ -2588,13 +2570,11 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
himl->cCurImage++;
}
- hdcImage = CreateCompatibleDC (0);
- TRACE("hdcImage=%p\n", hdcImage);
- if (hdcImage == 0)
- ERR("invalid hdcImage!\n");
-
- if (himl->has_alpha)
+ if (himl->has_alpha && GetIconInfo (hBestFitIcon, &ii))
{
+ HDC hdcImage = CreateCompatibleDC( 0 );
+ GetObjectW (ii.hbmMask, sizeof(BITMAP), &bmp);
+
if (!ii.hbmColor)
{
UINT height = bmp.bmHeight / 2;
@@ -2606,48 +2586,38 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
ret = add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, height, color, ii.hbmMask );
DeleteDC( hdcMask );
DeleteObject( color );
- if (ret) goto done;
}
- else if (add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight,
- ii.hbmColor, ii.hbmMask )) goto done;
+ else ret = add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight,
+ ii.hbmColor, ii.hbmMask );
+
+ DeleteDC( hdcImage );
+ DeleteObject (ii.hbmMask);
+ if (ii.hbmColor) DeleteObject (ii.hbmColor);
+ if (ret) goto done;
}
imagelist_point_from_index(himl, nIndex, &pt);
- SetTextColor(himl->hdcImage, RGB(0,0,0));
- SetBkColor (himl->hdcImage, RGB(255,255,255));
-
- if (ii.hbmColor)
+ if (himl->hbmMask)
{
- SelectObject (hdcImage, ii.hbmColor);
- StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
- if (himl->hbmMask)
- {
- SelectObject (hdcImage, ii.hbmMask);
- StretchBlt (himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
- }
+ DrawIconEx( himl->hdcImage, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_IMAGE );
+ PatBlt( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, WHITENESS );
+ DrawIconEx( himl->hdcMask, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_MASK );
}
else
{
- UINT height = bmp.bmHeight / 2;
- SelectObject (hdcImage, ii.hbmMask);
- StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, height, bmp.bmWidth, height, SRCCOPY);
- if (himl->hbmMask)
- StretchBlt (himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, 0, bmp.bmWidth, height, SRCCOPY);
+ COLORREF color = himl->clrBk != CLR_NONE ? himl->clrBk : comctl32_color.clrWindow;
+ HBRUSH brush = CreateSolidBrush( GetNearestColor( himl->hdcImage, color ));
+
+ SelectObject( himl->hdcImage, brush );
+ PatBlt( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, PATCOPY );
+ SelectObject( himl->hdcImage, GetStockObject(BLACK_BRUSH) );
+ DeleteObject( brush );
+ DrawIconEx( himl->hdcImage, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_NORMAL );
}
done:
DestroyIcon(hBestFitIcon);
- if (hdcImage)
- DeleteDC (hdcImage);
- if (ii.hbmColor)
- DeleteObject (ii.hbmColor);
- if (ii.hbmMask)
- DeleteObject (ii.hbmMask);
TRACE("Insert index = %d, himl->cCurImage = %d\n", nIndex, himl->cCurImage);
return nIndex;
More information about the wine-cvs
mailing list