ImageList: {x,y}Bitmap, misc

Dimitrie O. Paun dpaun at rogers.com
Mon Sep 2 01:50:25 CDT 2002


ChangeLog:
  -- implement support for xBitmap and yBitmap in ImageList_DrawIndirect
  -- small code, docs, and messages cleanups

Index: dlls/comctl32/imagelist.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/imagelist.c,v
retrieving revision 1.56
diff -u -r1.56 imagelist.c
--- dlls/comctl32/imagelist.c	16 Aug 2002 01:35:43 -0000	1.56
+++ dlls/comctl32/imagelist.c	2 Sep 2002 06:30:21 -0000
@@ -21,7 +21,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  *  TODO:
- *    - Fix ImageList_DrawIndirect (xBitmap, yBitmap, rgbFg, rgbBk, dwRop).
+ *    - Fix ImageList_DrawIndirect (rgbFg, rgbBk, dwRop).
  *    - Fix ImageList_GetIcon.
  *    - Fix ImageList_SetFilter (undocumented).
  *      BTW does anybody know anything about this function???
@@ -156,7 +156,7 @@
  * PARAMS
  *     pimldp        [I] pointer to IMAGELISTDRAWPARAMS structure.
  *     cx            [I] the width of the image to display
- *     cy............[I] the height of the image to display
+ *     cy            [I] the height of the image to display
  *
  * RETURNS
  *     nothing
@@ -178,7 +178,7 @@
     BitBlt(pimldp->hdcDst,
         pimldp->x, pimldp->y, cx, cy,
         hImageDC,
-        pimldp->himl->cx * pimldp->i, 0,
+        pimldp->himl->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
         SRCCOPY);
 
     SelectObject(hImageDC, hOldBitmap);
@@ -194,7 +194,7 @@
  * PARAMS
  *     pimldp        [I] pointer to IMAGELISTDRAWPARAMS structure.
  *     cx            [I] the width of the image to display
- *     cy............[I] the height of the image to display
+ *     cy            [I] the height of the image to display
  *
  * RETURNS
  *     nothing
@@ -208,42 +208,27 @@
 static VOID
 IMAGELIST_InternalDrawMask(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
 {
-    BOOL bUseCustomBackground, bBlendFlag;
-    HBRUSH hBrush, hOldBrush;
-    HDC     hMaskDC, hImageDC;
     HBITMAP hOldBitmapImage, hOldBitmapMask;
     HIMAGELIST himlLocal = pimldp->himl;
-    COLORREF oldBkColor, oldFgColor;
     UINT fStyle = pimldp->fStyle & (~ILD_OVERLAYMASK);
 
     /*
      * We need a dc and bitmap to draw on that is
      * not on the screen.
      */
-    HDC hOffScreenDC = 0;
-    HBITMAP hOffScreenBmp = 0;
+    HDC hOffScreenDC = CreateCompatibleDC( pimldp->hdcDst );
+    HBITMAP hOffScreenBmp = CreateCompatibleBitmap( pimldp->hdcDst, cx, cy );
 
-    bUseCustomBackground = (himlLocal->clrBk != CLR_NONE);
-    bBlendFlag = (fStyle & ILD_BLEND50 ) || (fStyle & ILD_BLEND25);
+    BOOL bUseCustomBackground = (himlLocal->clrBk != CLR_NONE);
+    BOOL bBlendFlag = (fStyle & ILD_BLEND50 ) || (fStyle & ILD_BLEND25);
 
-    hImageDC = CreateCompatibleDC(0);
-    hMaskDC = CreateCompatibleDC(0);
+    HDC hImageDC = CreateCompatibleDC(0);
+    HDC hMaskDC = CreateCompatibleDC(0);
 
     /* Create a compatible DC. */
-    hOffScreenDC = CreateCompatibleDC( pimldp->hdcDst );
-
-    if ( hOffScreenDC )
-    {
-        hOffScreenBmp = CreateCompatibleBitmap( pimldp->hdcDst, cx, cy );
-
-        if ( hOffScreenBmp )
-            SelectObject( hOffScreenDC, hOffScreenBmp  );
-        else
-            goto cleanup;
-    }
-    else
-        goto cleanup;
-
+    if (!hOffScreenDC || !hOffScreenBmp || !hImageDC || !hMaskDC) goto cleanup;
+    SelectObject( hOffScreenDC, hOffScreenBmp  );
+    
     hOldBitmapImage = SelectObject(hImageDC, himlLocal->hbmImage);
     hOldBitmapMask = SelectObject(hMaskDC, himlLocal->hbmMask);
 
@@ -263,8 +248,8 @@
          || bBlendFlag) )
     {
 
-        hBrush = CreateSolidBrush (himlLocal->clrBk);
-        hOldBrush = SelectObject (pimldp->hdcDst, hBrush);
+        HBRUSH hBrush = CreateSolidBrush (himlLocal->clrBk);
+        HBRUSH hOldBrush = SelectObject (pimldp->hdcDst, hBrush);
 
         PatBlt( hOffScreenDC, pimldp->x, pimldp->y, cx, cy, PATCOPY );
 
@@ -282,15 +267,19 @@
          * monochrome mask.
          */
 
-        oldBkColor = SetBkColor( hOffScreenDC, RGB( 0xff, 0xff, 0xff ) );
-        oldFgColor = SetTextColor( hOffScreenDC, RGB( 0, 0, 0 ) );
+        COLORREF oldBk = SetBkColor( hOffScreenDC, RGB( 0xff, 0xff, 0xff ) );
+        COLORREF oldFg = SetTextColor( hOffScreenDC, RGB( 0, 0, 0 ) );
 
-        BitBlt( hOffScreenDC, 0, 0, cx, cy,hMaskDC, himlLocal->cx * pimldp->i,
-                0, SRCAND );
+        BitBlt( hOffScreenDC, 0, 0, cx, cy, hMaskDC, 
+		himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap, 
+		SRCAND );
 
-        BitBlt( hOffScreenDC, 0, 0, cx, cy, hImageDC,himlLocal->cx * pimldp->i,
-                0, SRCPAINT );
+        BitBlt( hOffScreenDC, 0, 0, cx, cy, hImageDC,
+		himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap, 
+                SRCPAINT );
 
+	SetBkColor( hOffScreenDC, oldBk);
+	SetBkColor( hOffScreenDC, oldFg);
     }
 
     /*
@@ -299,15 +288,17 @@
     else if((fStyle & ILD_IMAGE) && !bUseCustomBackground)
     {
         BitBlt( hOffScreenDC, 0, 0, cx, cy, hImageDC,
-                himlLocal->cx * pimldp->i, 0, SRCCOPY);
+                himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap, 
+		SRCCOPY);
     }
     /*
      * Draw the mask with or without a background
      */
     else if(fStyle & ILD_MASK)
     {
-        BitBlt( hOffScreenDC, 0, 0, cx, cy, hMaskDC, himlLocal->cx * pimldp->i,
-                0, bUseCustomBackground ? SRCCOPY : SRCAND);
+        BitBlt( hOffScreenDC, 0, 0, cx, cy, hMaskDC,
+                himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap, 
+                bUseCustomBackground ? SRCCOPY : SRCAND);
     }
 
     /*
@@ -339,7 +330,7 @@
  * PARAMS
  *     pimldp        [I] pointer to IMAGELISTDRAWPARAMS structure.
  *     cx            [I] the width of the image to display
- *     cy............[I] the height of the image to display
+ *     cy            [I] the height of the image to display
  *
  * RETURNS
  *     nothing
@@ -353,10 +344,10 @@
 IMAGELIST_InternalDrawBlend(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
 {
 
-    HDC         hBlendMaskDC,hMaskDC;
+    HDC         hBlendMaskDC;
     HBRUSH      hBlendColorBrush, hBlendBrush, hOldBrush;
     HBITMAP     hBlendMaskBitmap, hOldBitmap;
-    COLORREF    clrBlend, OldTextColor, OldBkColor;
+    COLORREF    clrBlend, oldFgColor, oldBkColor;
     HIMAGELIST  himlLocal = pimldp->himl;
 
     clrBlend = GetSysColor (COLOR_HIGHLIGHT);
@@ -382,20 +373,16 @@
     if(pimldp->himl->hbmMask != 0)
     {
         HBITMAP hOldMaskBitmap;
-        hMaskDC = CreateCompatibleDC(0);
+        HDC hMaskDC = CreateCompatibleDC(0);
         hOldMaskBitmap = (HBITMAP) SelectObject(hMaskDC, himlLocal->hbmMask);
 
-        BitBlt(hBlendMaskDC,
-            0,0, cx, cy,
-            hMaskDC,
-            himlLocal->cx * pimldp->i,0,
-            0x220326); /* NOTSRCAND */
-
-        BitBlt(hBlendMaskDC,
-            0,0, cx, cy,
-            hBlendMaskDC,
-            0,0,
-            NOTSRCCOPY);
+        BitBlt(hBlendMaskDC, 0, 0, cx, cy, hMaskDC,
+               himlLocal->cx * pimldp->i + pimldp->xBitmap, pimldp->yBitmap,
+               0x220326); /* NOTSRCAND */
+
+        BitBlt(hBlendMaskDC, 0, 0, cx, cy, hBlendMaskDC,
+               0, 0,
+               NOTSRCCOPY);
 
         SelectObject(hMaskDC, hOldMaskBitmap);
         DeleteDC(hMaskDC);
@@ -403,8 +390,8 @@
     }
     /* Apply blend to the current image given the BlendMask
     */
-    OldTextColor = SetTextColor(pimldp->hdcDst, 0);
-    OldBkColor = SetBkColor(pimldp->hdcDst, RGB(255,255,255));
+    oldFgColor = SetTextColor(pimldp->hdcDst, RGB(0, 0, 0));
+    oldBkColor = SetBkColor(pimldp->hdcDst, RGB(255,255,255));
     hBlendColorBrush = CreateSolidBrush(clrBlend);
     hOldBrush = (HBRUSH) SelectObject (pimldp->hdcDst, hBlendColorBrush);
 
@@ -415,8 +402,8 @@
         0xB8074A); /* PSDPxax */
 
     SelectObject(pimldp->hdcDst, hOldBrush);
-    SetTextColor(pimldp->hdcDst, OldTextColor);
-    SetBkColor(pimldp->hdcDst, OldBkColor);
+    SetTextColor(pimldp->hdcDst, oldFgColor);
+    SetBkColor(pimldp->hdcDst, oldBkColor);
     SelectObject(hBlendMaskDC, hOldBitmap);
     DeleteDC(hBlendMaskDC);
     DeleteObject(hBlendMaskBitmap);
@@ -431,7 +418,7 @@
  * PARAMS
  *     pimldp        [I] pointer to IMAGELISTDRAWPARAMS structure.
  *     cx            [I] the width of the image to display
- *     cy............[I] the height of the image to display
+ *     cy            [I] the height of the image to display
  *
  * RETURNS
  *     nothing
@@ -445,42 +432,36 @@
 static VOID
 IMAGELIST_InternalDrawOverlay(IMAGELISTDRAWPARAMS *pimldp, INT cx, INT cy)
 {
-    INT     nOvlIdx;
-    HDC     hImageDC;
+    INT nOvlIdx;
+    HDC hImageDC;
     HBITMAP hOldBitmap;
-
+    
     nOvlIdx = (pimldp->fStyle & ILD_OVERLAYMASK) >> 8;
-    if ((nOvlIdx >= 1) && (nOvlIdx <= MAX_OVERLAYIMAGE))
-    {
-        nOvlIdx = pimldp->himl->nOvlIdx[nOvlIdx - 1];
-        if ((nOvlIdx >= 0) && (nOvlIdx <= pimldp->himl->cCurImage))
-        {
-            hImageDC = CreateCompatibleDC(0);
-            if (pimldp->himl->hbmMask)
-            {
-                hOldBitmap = (HBITMAP) SelectObject (hImageDC,
-                    pimldp->himl->hbmMask);
-
-                BitBlt (pimldp->hdcDst,
-                    pimldp->x, pimldp->y, cx, cy,
-                    hImageDC, pimldp->himl->cx * nOvlIdx, 0,
-                    SRCAND);
-
-                SelectObject(hImageDC, hOldBitmap);
-            }
-            hOldBitmap = (HBITMAP) SelectObject (hImageDC,
-                pimldp->himl->hbmImage);
-
-            BitBlt (pimldp->hdcDst,
-                pimldp->x, pimldp->y, cx, cy,
-                hImageDC,
-                pimldp->himl->cx * nOvlIdx, 0,
-                SRCPAINT);
+    if ( (nOvlIdx < 1) || (nOvlIdx > MAX_OVERLAYIMAGE)) return;
+    
+    nOvlIdx = pimldp->himl->nOvlIdx[nOvlIdx - 1];
+    if ((nOvlIdx < 0) || (nOvlIdx > pimldp->himl->cCurImage)) return;
+
+    if (!(hImageDC = CreateCompatibleDC(0))) return;
+    
+    if (pimldp->himl->hbmMask) {
+        hOldBitmap = (HBITMAP) SelectObject (hImageDC, pimldp->himl->hbmMask);
+
+        BitBlt (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy, hImageDC,
+		pimldp->himl->cx * nOvlIdx + pimldp->xBitmap, pimldp->yBitmap,
+	       	SRCAND);
+
+        SelectObject(hImageDC, hOldBitmap);
+    }
+    
+    hOldBitmap = (HBITMAP) SelectObject (hImageDC, pimldp->himl->hbmImage);
+
+    BitBlt (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy, hImageDC,
+	    pimldp->himl->cx * nOvlIdx + pimldp->xBitmap, pimldp->yBitmap,
+	    SRCPAINT);
 
-            SelectObject(hImageDC, hOldBitmap);
-            DeleteDC(hImageDC);
-        }
-    }
+    SelectObject(hImageDC, hOldBitmap);
+    DeleteDC(hImageDC);
 }
 
 
@@ -743,7 +724,7 @@
 
     InternalDrag.himl = ImageList_Create (cx, cy, himlTrack->flags, 1, 1);
     if (InternalDrag.himl == NULL) {
-        ERR("Error creating drag image list!\n");
+        WARN("Error creating drag image list!\n");
         return FALSE;
     }
 
@@ -1332,8 +1313,8 @@
  *     hdc    [I] handle to device context
  *     x      [I] X position
  *     y      [I] Y position
- *     xOffs  [I] X offset
- *     yOffs  [I] Y offset
+ *     dx     [I] X offset
+ *     dy     [I] Y offset
  *     rgbBk  [I] background color
  *     rgbFg  [I] foreground color
  *     fStyle [I] drawing flags
@@ -1402,7 +1383,6 @@
     if (pimldp->himl == NULL)
         return FALSE;
     if ((pimldp->i < 0) || (pimldp->i >= pimldp->himl->cCurImage)) {
-	ERR("%d not within range (max %d)\n",pimldp->i,pimldp->himl->cCurImage-1);
         return FALSE;
     }
     /*
@@ -1625,7 +1605,6 @@
     HDC    hdcSrc, hdcDst;
 
     if ((himl == NULL) || (i < 0) || (i >= himl->cCurImage)) {
-	FIXME("(%p,%d,%x), params out of range!\n",himl,i,fStyle);
 	return 0;
    }
 




More information about the wine-patches mailing list