Alexandre Julliard : comctl32: Store an alpha channel present flag for each image in an imagelist.

Alexandre Julliard julliard at winehq.org
Fri May 14 11:17:28 CDT 2010


Module: wine
Branch: master
Commit: 33e7d0282b926106957c358e000fb566556ba5dd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=33e7d0282b926106957c358e000fb566556ba5dd

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 14 13:44:20 2010 +0200

comctl32: Store an alpha channel present flag for each image in an imagelist.

---

 dlls/comctl32/imagelist.c |   23 ++++++++++++++++++++++-
 dlls/comctl32/imagelist.h |    1 +
 2 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index 1eb3bc6..2083d39 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -207,6 +207,7 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count,
         }
         else
         {
+            if (himl->has_alpha) himl->has_alpha[pos + n] = 1;
             StretchBlt( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
                         hdc, n * width, 0, width, height, SRCCOPY );
         }
@@ -294,6 +295,18 @@ IMAGELIST_InternalExpandBitmaps(HIMAGELIST himl, INT nImageCount)
         himl->hbmMask = hbmNewBitmap;
     }
 
+    if (himl->has_alpha)
+    {
+        char *new_alpha = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                       himl->has_alpha, himl->cMaxImage );
+        if (new_alpha) himl->has_alpha = new_alpha;
+        else
+        {
+            HeapFree( GetProcessHeap(), 0, himl->has_alpha );
+            himl->has_alpha = NULL;
+        }
+    }
+
     himl->cMaxImage = nNewCount;
 
     DeleteDC (hdcBitmap);
@@ -728,6 +741,11 @@ ImageList_Create (INT cx, INT cy, UINT flags,
     else
         himl->hbmMask = 0;
 
+    if (himl->uBitsPixel == 32)
+        himl->has_alpha = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, himl->cMaxImage );
+    else
+        himl->has_alpha = NULL;
+
     /* create blending brushes */
     hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend25);
     himl->hbrBlend25 = CreatePatternBrush (hbmTemp);
@@ -1430,7 +1448,7 @@ ImageList_Duplicate (HIMAGELIST himlSrc)
     }
 
     himlDst = ImageList_Create (himlSrc->cx, himlSrc->cy, himlSrc->flags,
-                                himlSrc->cInitial, himlSrc->cGrow);
+                                himlSrc->cCurImage, himlSrc->cGrow);
 
     if (himlDst)
     {
@@ -1446,6 +1464,8 @@ ImageList_Duplicate (HIMAGELIST himlSrc)
 
 	himlDst->cCurImage = himlSrc->cCurImage;
 	himlDst->cMaxImage = himlSrc->cMaxImage;
+        if (himlSrc->has_alpha && himlDst->has_alpha)
+            memcpy( himlDst->has_alpha, himlSrc->has_alpha, himlDst->cCurImage );
     }
     return himlDst;
 }
@@ -3132,6 +3152,7 @@ static ULONG WINAPI ImageListImpl_Release(IImageList *iface)
         if (This->hbrBlend50) DeleteObject (This->hbrBlend50);
 
         This->lpVtbl = NULL;
+        HeapFree(GetProcessHeap(), 0, This->has_alpha);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
diff --git a/dlls/comctl32/imagelist.h b/dlls/comctl32/imagelist.h
index a979ebf..f6f1d1b 100644
--- a/dlls/comctl32/imagelist.h
+++ b/dlls/comctl32/imagelist.h
@@ -53,6 +53,7 @@ struct _IMAGELIST
     HBRUSH  hbrBlend50;
     INT     cInitial;
     UINT    uBitsPixel;
+    char   *has_alpha;
 
     LONG        ref;                     /* reference count */
 };




More information about the wine-cvs mailing list