Mike McCormack : comctl32: Fix Nx1 assumptions when adding multiple bitmaps with ImageList_Add.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 6 05:48:33 CST 2006


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

Author: Mike McCormack <mike at codeweavers.com>
Date:   Sun Nov  5 17:12:18 2006 +0900

comctl32: Fix Nx1 assumptions when adding multiple bitmaps with ImageList_Add.

---

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

diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index b82863e..e8654e1 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -202,10 +202,10 @@ IMAGELIST_InternalExpandBitmaps (HIMAGEL
 INT WINAPI
 ImageList_Add (HIMAGELIST himl,	HBITMAP hbmImage, HBITMAP hbmMask)
 {
-    HDC     hdcBitmap;
-    INT     nFirstIndex, nImageCount;
+    HDC     hdcBitmap, hdcTemp;
+    INT     nFirstIndex, nImageCount, i;
     BITMAP  bmp;
-    HBITMAP hOldBitmap;
+    HBITMAP hOldBitmap, hOldBitmapTemp;
     POINT   pt;
 
     TRACE("himl=%p hbmimage=%p hbmmask=%p\n", himl, hbmImage, hbmMask);
@@ -217,41 +217,35 @@ ImageList_Add (HIMAGELIST himl,	HBITMAP
 
     IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmWidth, bmp.bmHeight);
 
-    imagelist_point_from_index( himl, himl->cCurImage, &pt );
-
     hdcBitmap = CreateCompatibleDC(0);
 
     hOldBitmap = SelectObject(hdcBitmap, hbmImage);
 
-    /* Copy result to the imagelist
-    */
-    BitBlt (himl->hdcImage, pt.x, pt.y, bmp.bmWidth, bmp.bmHeight,
-        hdcBitmap, 0, 0, SRCCOPY);
-
-    if(himl->hbmMask)
+    for (i=0; i<nImageCount; i++)
     {
-	HDC hdcTemp;
-	HBITMAP hOldBitmapTemp;
+        imagelist_point_from_index( himl, himl->cCurImage + i, &pt );
+
+        /* Copy result to the imagelist
+        */
+        BitBlt( himl->hdcImage, pt.x, pt.y, himl->cx, bmp.bmHeight,
+                hdcBitmap, i*himl->cx, 0, SRCCOPY );
+
+        if (!himl->hbmMask)
+             continue;
 
         hdcTemp   = CreateCompatibleDC(0);
         hOldBitmapTemp = SelectObject(hdcTemp, hbmMask);
 
-        BitBlt (himl->hdcMask,
-            pt.x, pt.y, bmp.bmWidth, bmp.bmHeight,
-            hdcTemp,
-            0, 0,
-            SRCCOPY);
+        BitBlt( himl->hdcMask, pt.x, pt.y, himl->cx, bmp.bmHeight,
+                hdcTemp, i*himl->cx, 0, SRCCOPY );
 
         SelectObject(hdcTemp, hOldBitmapTemp);
         DeleteDC(hdcTemp);
 
         /* Remove the background from the image
         */
-        BitBlt (himl->hdcImage,
-            pt.x, pt.y, bmp.bmWidth, bmp.bmHeight,
-            himl->hdcMask,
-            pt.x, pt.y,
-            0x220326); /* NOTSRCAND */
+        BitBlt( himl->hdcImage, pt.x, pt.y, himl->cx, bmp.bmHeight,
+                himl->hdcMask, pt.x, pt.y, 0x220326 ); /* NOTSRCAND */
     }
 
     SelectObject(hdcBitmap, hOldBitmap);




More information about the wine-cvs mailing list