Alexandre Julliard : comctl32: Also generate an alpha channel when replacing an image or icon in an imagelist .
Alexandre Julliard
julliard at winehq.org
Fri May 14 11:17:28 CDT 2010
Module: wine
Branch: master
Commit: 528722e4e16ec918d5daf3bee8bbb95fd35a7582
URL: http://source.winehq.org/git/wine.git/?a=commit;h=528722e4e16ec918d5daf3bee8bbb95fd35a7582
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 14 13:41:35 2010 +0200
comctl32: Also generate an alpha channel when replacing an image or icon in an imagelist.
---
dlls/comctl32/imagelist.c | 35 +++++++++++++++++++++++++++--------
1 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index acad6c2..1eb3bc6 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -2305,7 +2305,6 @@ ImageList_Replace (HIMAGELIST himl, INT i, HBITMAP hbmImage,
{
HDC hdcImage;
BITMAP bmp;
- HBITMAP hOldBitmap;
POINT pt;
TRACE("%p %d %p %p\n", himl, i, hbmImage, hbmMask);
@@ -2326,7 +2325,10 @@ ImageList_Replace (HIMAGELIST himl, INT i, HBITMAP hbmImage,
hdcImage = CreateCompatibleDC (0);
/* Replace Image */
- hOldBitmap = SelectObject (hdcImage, hbmImage);
+ SelectObject (hdcImage, hbmImage);
+
+ if (add_with_alpha( himl, hdcImage, i, 1, bmp.bmWidth, bmp.bmHeight, hbmImage, hbmMask ))
+ goto done;
imagelist_point_from_index(himl, i, &pt);
StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
@@ -2351,7 +2353,7 @@ ImageList_Replace (HIMAGELIST himl, INT i, HBITMAP hbmImage,
himl->hdcMask, pt.x, pt.y, 0x220326); /* NOTSRCAND */
}
- SelectObject (hdcImage, hOldBitmap);
+done:
DeleteDC (hdcImage);
return TRUE;
@@ -2378,7 +2380,6 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
{
HDC hdcImage;
HICON hBestFitIcon;
- HBITMAP hbmOldSrc;
ICONINFO ii;
BITMAP bmp;
BOOL ret;
@@ -2439,6 +2440,25 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (hdcImage == 0)
ERR("invalid hdcImage!\n");
+ if (himl->uBitsPixel == 32)
+ {
+ if (!ii.hbmColor)
+ {
+ UINT height = bmp.bmHeight / 2;
+ HDC hdcMask = CreateCompatibleDC( 0 );
+ HBITMAP color = CreateBitmap( bmp.bmWidth, height, 1, 1, NULL );
+ SelectObject( hdcImage, color );
+ SelectObject( hdcMask, ii.hbmMask );
+ BitBlt( hdcImage, 0, 0, bmp.bmWidth, height, hdcMask, 0, height, SRCCOPY );
+ add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, height, color, ii.hbmMask );
+ DeleteDC( hdcMask );
+ DeleteObject( color );
+ }
+ else add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight, ii.hbmColor, ii.hbmMask );
+
+ goto done;
+ }
+
imagelist_point_from_index(himl, nIndex, &pt);
SetTextColor(himl->hdcImage, RGB(0,0,0));
@@ -2446,7 +2466,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (ii.hbmColor)
{
- hbmOldSrc = SelectObject (hdcImage, ii.hbmColor);
+ 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)
@@ -2459,7 +2479,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
else
{
UINT height = bmp.bmHeight / 2;
- hbmOldSrc = SelectObject (hdcImage, ii.hbmMask);
+ 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)
@@ -2467,8 +2487,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
hdcImage, 0, 0, bmp.bmWidth, height, SRCCOPY);
}
- SelectObject (hdcImage, hbmOldSrc);
-
+done:
DestroyIcon(hBestFitIcon);
if (hdcImage)
DeleteDC (hdcImage);
More information about the wine-cvs
mailing list