Hi,
This patch is a rewrite of the imagelist handling to not use a Nx1 grid, but a NxM grid with M definable in the source (currently 4).
I have tested against winrar, "file open" and "make check".
It is not completely regression tested, so I am not wanting to submit it right now.
But I welcome comments. :)
Ciao, Marcus
Index: dlls/comctl32/imagelist.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/imagelist.c,v retrieving revision 1.101 diff -u -r1.101 imagelist.c --- dlls/comctl32/imagelist.c 14 Nov 2005 11:20:10 -0000 1.101 +++ dlls/comctl32/imagelist.c 28 Nov 2005 06:21:43 -0000 @@ -55,6 +55,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(imagelist);
+#define PER_ROW 4
#define MAX_OVERLAYIMAGE 15
@@ -84,6 +85,12 @@ return himl && himl->magic == IMAGELIST_MAGIC; }
+static DWORD index2x(INT index, INT cx) { return cx*(index/PER_ROW); } +static DWORD index2y(INT index, INT cy) { return cy*(index%PER_ROW); } + +static DWORD count2x(INT count, INT cx) { + return cx*((count+PER_ROW-1)/PER_ROW); +}
/************************************************************************* * IMAGELIST_InternalExpandBitmaps [Internal] @@ -93,6 +100,8 @@ * PARAMS * himl [I] handle to image list * nImageCount [I] number of images to add + * cx [I] width of image + * cy [I] height of image * * RETURNS * nothing @@ -113,21 +122,22 @@
if (cy == 0) cy = himl->cy; nNewCount = himl->cCurImage + nImageCount + himl->cGrow; - nNewWidth = nNewCount * himl->cx; + nNewWidth = count2x(nNewCount,himl->cx);
- TRACE("Create expanded bitmaps : himl=%p x=%d y=%d count=%d\n", himl, nNewWidth, cy, nNewCount); + TRACE("Create expanded bitmaps : himl=%p x=%d y=%d count=%d\n", himl, + nNewWidth, cy*PER_ROW, nNewCount); hdcBitmap = CreateCompatibleDC (0);
- hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewWidth, cy); + hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewWidth, cy*PER_ROW);
if (hbmNewBitmap == 0) - ERR("creating new image bitmap (x=%d y=%d)!\n", nNewWidth, cy); + ERR("creating new image bitmap (x=%d y=%d)!\n", nNewWidth, cy*PER_ROW);
if(himl->cCurImage) { hbmNull = SelectObject (hdcBitmap, hbmNewBitmap); - BitBlt (hdcBitmap, 0, 0, himl->cCurImage * himl->cx, cy, - himl->hdcImage, 0, 0, SRCCOPY); + BitBlt (hdcBitmap, 0, 0, count2x(himl->cCurImage,himl->cx), + cy*PER_ROW, himl->hdcImage, 0, 0, SRCCOPY); SelectObject (hdcBitmap, hbmNull); } SelectObject (himl->hdcImage, hbmNewBitmap); @@ -136,7 +146,7 @@
if (himl->flags & ILC_MASK) { - hbmNewBitmap = CreateBitmap (nNewWidth, cy, 1, 1, NULL); + hbmNewBitmap = CreateBitmap (nNewWidth, cy*PER_ROW, 1, 1, NULL);
if (hbmNewBitmap == 0) ERR("creating new mask bitmap!\n"); @@ -144,8 +154,8 @@ if(himl->cCurImage) { hbmNull = SelectObject (hdcBitmap, hbmNewBitmap); - BitBlt (hdcBitmap, 0, 0, himl->cCurImage * himl->cx, cy, - himl->hdcMask, 0, 0, SRCCOPY); + BitBlt (hdcBitmap, 0, 0, count2x(himl->cCurImage,himl->cx), + cy*PER_ROW, himl->hdcMask, 0, 0, SRCCOPY); SelectObject (hdcBitmap, hbmNull); } SelectObject (himl->hdcMask, hbmNewBitmap); @@ -179,7 +189,7 @@ { HDC hdcBitmap; INT nFirstIndex, nImageCount; - INT nStartX; + INT i; BITMAP bmp; HBITMAP hOldBitmap;
@@ -192,43 +202,42 @@
IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmWidth, bmp.bmHeight);
- nStartX = himl->cCurImage * himl->cx; - hdcBitmap = CreateCompatibleDC(0); - hOldBitmap = SelectObject(hdcBitmap, hbmImage);
- /* Copy result to the imagelist - */ - BitBlt (himl->hdcImage, nStartX, 0, bmp.bmWidth, bmp.bmHeight, - hdcBitmap, 0, 0, SRCCOPY); - - if(himl->hbmMask) - { - HDC hdcTemp; - HBITMAP hOldBitmapTemp; - - hdcTemp = CreateCompatibleDC(0); - hOldBitmapTemp = SelectObject(hdcTemp, hbmMask); + for (i=himl->cCurImage;i<himl->cCurImage+nImageCount;i++) { + /* Copy result to the imagelist */ + BitBlt (himl->hdcImage, index2x(i,himl->cx), index2y(i,himl->cy), + himl->cx, himl->cy, hdcBitmap, himl->cx*(i-himl->cCurImage), 0, SRCCOPY);
- BitBlt (himl->hdcMask, - nStartX, 0, bmp.bmWidth, bmp.bmHeight, - hdcTemp, - 0, 0, - SRCCOPY); + if(himl->hbmMask) + { + HDC hdcTemp; + HBITMAP hOldBitmapTemp;
- SelectObject(hdcTemp, hOldBitmapTemp); - DeleteDC(hdcTemp); + hdcTemp = CreateCompatibleDC(0); + hOldBitmapTemp = SelectObject(hdcTemp, hbmMask);
- /* Remove the background from the image - */ - BitBlt (himl->hdcImage, - nStartX, 0, bmp.bmWidth, bmp.bmHeight, - himl->hdcMask, - nStartX, 0, - 0x220326); /* NOTSRCAND */ + BitBlt (himl->hdcMask, + index2x(i,himl->cx), index2y(i,himl->cy), + himl->cx, himl->cy, + hdcTemp, + himl->cx*(i-himl->cCurImage), 0, + SRCCOPY); + + SelectObject(hdcTemp, hOldBitmapTemp); + DeleteDC(hdcTemp); + + /* Remove the background from the image + */ + BitBlt (himl->hdcImage, + index2x(i,himl->cx), index2y(i,himl->cy), + bmp.bmWidth, bmp.bmHeight, + himl->hdcMask, + index2x(i,himl->cx), index2y(i,himl->cy), + 0x220326); /* NOTSRCAND */ + } } - SelectObject(hdcBitmap, hOldBitmap); DeleteDC(hdcBitmap);
@@ -278,12 +287,12 @@ INT WINAPI ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask) { - HDC hdcMask, hdcBitmap; - INT nIndex, nImageCount, nMaskXOffset=0; + HDC hdcBitmap; + INT nIndex, nImageCount; BITMAP bmp; HBITMAP hOldBitmap; - HBITMAP hMaskBitmap=0; COLORREF bkColor; + int i;
TRACE("himl=%p hbitmap=%p clrmask=%lx\n", himl, hBitmap, clrMask); if (!is_valid(himl)) @@ -292,6 +301,8 @@ if (!GetObjectA (hBitmap, sizeof(BITMAP), &bmp)) return -1;
+ TRACE("bitmap is %d x %d, himl is %d x %d\n", + bmp.bmWidth, bmp.bmHeight, himl->cx, himl->cy); if (himl->cx > 0) nImageCount = bmp.bmWidth / himl->cx; else @@ -304,67 +315,55 @@
hdcBitmap = CreateCompatibleDC(0);
- hOldBitmap = SelectObject(hdcBitmap, hBitmap); - if(himl->hbmMask) - { - hdcMask = himl->hdcMask; - nMaskXOffset = nIndex * himl->cx; - } - else - { - /* - Create a temp Mask so we can remove the background of - the Image (Windows does this even if there is no mask) - */ - hdcMask = CreateCompatibleDC(0); - hMaskBitmap = CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, NULL); - SelectObject(hdcMask, hMaskBitmap); - nMaskXOffset = 0; - } + /* create monochrome image to the mask bitmap */ bkColor = (clrMask != CLR_DEFAULT) ? clrMask : GetPixel (hdcBitmap, 0, 0); - SetBkColor (hdcBitmap, bkColor); - BitBlt (hdcMask, - nMaskXOffset, 0, bmp.bmWidth, bmp.bmHeight, - hdcBitmap, 0, 0, - SRCCOPY);
- SetBkColor(hdcBitmap, RGB(255,255,255)); - /*Remove the background from the image - */ - /* - WINDOWS BUG ALERT!!!!!! - The statement below should not be done in common practice - but this is how ImageList_AddMasked works in Windows. - It overwrites the original bitmap passed, this was discovered - by using the same bitmap to iterate the different styles - on windows where it failed (BUT ImageList_Add is OK) - This is here in case some apps rely on this bug - */ - BitBlt(hdcBitmap, - 0, 0, bmp.bmWidth, bmp.bmHeight, - hdcMask, - nMaskXOffset, 0, - 0x220326); /* NOTSRCAND */ - /* Copy result to the imagelist - */ - BitBlt (himl->hdcImage, - nIndex * himl->cx, 0, bmp.bmWidth, bmp.bmHeight, - hdcBitmap, - 0, 0, - SRCCOPY); + for (i=nIndex; i<himl->cCurImage; i++) { + if (himl->hbmMask) { + SetBkColor (hdcBitmap, bkColor); + + BitBlt (himl->hdcMask, + index2x(i,himl->cx), index2y(i,himl->cy), + himl->cx, himl->cy, + hdcBitmap, himl->cx*(i-nIndex), 0, + SRCCOPY); + + SetBkColor(hdcBitmap, RGB(255,255,255)); + /*Remove the background from the image + */ + /* + WINDOWS BUG ALERT!!!!!! + The statement below should not be done in common practice + but this is how ImageList_AddMasked works in Windows. + It overwrites the original bitmap passed, this was discovered + by using the same bitmap to iterate the different styles + on windows where it failed (BUT ImageList_Add is OK) + This is here in case some apps rely on this bug + */ + BitBlt(hdcBitmap, + himl->cx*(i-nIndex), 0, himl->cx, himl->cy, + himl->hdcMask, + index2x(i,himl->cx), index2y(i,himl->cy), + 0x220326); /* NOTSRCAND */ + } + /* Copy result to the imagelist + */ + BitBlt (himl->hdcImage, + index2x(i,himl->cx), index2y(i,himl->cy), + himl->cx, himl->cy, + hdcBitmap, + himl->cx*(i-nIndex), 0, + SRCCOPY); + } + /* Clean up */ + SelectObject(hdcBitmap, hOldBitmap); DeleteDC(hdcBitmap); - if(!himl->hbmMask) - { - DeleteObject(hMaskBitmap); - DeleteDC(hdcMask); - } - return nIndex; }
@@ -478,19 +477,20 @@ /* image */ SelectObject (hdcBmp, hbmTempImage); StretchBlt (hdcBmp, 0, 0, himlSrc->cx, himlSrc->cy, - himlDst->hdcImage, iDst * himlDst->cx, 0, himlDst->cx, himlDst->cy, - SRCCOPY); + himlDst->hdcImage, index2x(iDst,himlDst->cx), index2y(iDst,himlDst->cy), + himlDst->cx, himlDst->cy, SRCCOPY); /* mask */ SelectObject (hdcBmp, hbmTempMask); StretchBlt (hdcBmp, 0, 0, himlSrc->cx, himlSrc->cy, - himlDst->hdcMask, iDst * himlDst->cx, 0, himlDst->cx, himlDst->cy, - SRCCOPY); + himlDst->hdcMask, index2x(iDst,himlDst->cx), index2y(iDst,himlDst->cy), + himlDst->cx, himlDst->cy, SRCCOPY);
/* copy (and stretch) source to destination */ /* image */ - StretchBlt (himlDst->hdcImage, iDst * himlDst->cx, 0, himlDst->cx, himlDst->cy, - himlSrc->hdcImage, iSrc * himlSrc->cx, 0, himlSrc->cx, himlSrc->cy, - SRCCOPY); + StretchBlt (himlDst->hdcImage, index2x(iDst,himlDst->cx), index2y(iDst,himlDst->cy), + himlDst->cx, himlDst->cy, + himlSrc->hdcImage, index2x(iSrc,himlSrc->cx), index2y(iSrc,himlSrc->cy), + himlSrc->cx, himlSrc->cy, SRCCOPY); /* mask */ StretchBlt (himlDst->hdcMask, iDst * himlDst->cx, 0, himlDst->cx, himlDst->cy, himlSrc->hdcMask, iSrc * himlSrc->cx, 0, himlSrc->cx, himlSrc->cy, @@ -511,13 +511,17 @@ } else { /* copy image */ - StretchBlt (himlDst->hdcImage, iDst * himlDst->cx, 0, himlDst->cx, himlDst->cy, - himlSrc->hdcImage, iSrc * himlSrc->cx, 0, himlSrc->cx, himlSrc->cy, + StretchBlt (himlDst->hdcImage, + index2x(iDst,himlDst->cx), index2y(iDst,himlDst->cy), himlDst->cx, himlDst->cy, + himlSrc->hdcImage, + index2x(iSrc,himlSrc->cx), index2y(iSrc,himlSrc->cy), himlSrc->cx, himlSrc->cy, SRCCOPY);
/* copy mask */ - StretchBlt (himlDst->hdcMask, iDst * himlDst->cx, 0, himlDst->cx, himlDst->cy, - himlSrc->hdcMask, iSrc * himlSrc->cx, 0, himlSrc->cx, himlSrc->cy, + StretchBlt (himlDst->hdcMask, + index2x(iDst,himlDst->cx), index2y(iDst,himlDst->cy), himlDst->cx, himlDst->cy, + himlSrc->hdcMask, + index2x(iSrc,himlSrc->cx), index2y(iSrc,himlSrc->cy), himlSrc->cx, himlSrc->cy, SRCCOPY); }
@@ -597,15 +601,15 @@ himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL);
if (himl->cMaxImage > 0) { - himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, cx * himl->cMaxImage, cy); + himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, + count2x(himl->cMaxImage,cx), cy*PER_ROW); SelectObject(himl->hdcImage, himl->hbmImage); } else himl->hbmImage = 0;
if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) { - himl->hbmMask = - CreateBitmap (himl->cx * himl->cMaxImage, himl->cy, - 1, 1, NULL); + himl->hbmMask = CreateBitmap (count2x(himl->cMaxImage,himl->cx), + himl->cy * PER_ROW, 1, 1, NULL); if (himl->hbmMask == 0) { ERR("Error creating mask bitmap!\n"); goto cleanup; @@ -1053,7 +1057,7 @@ */
BOOL WINAPI -ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) +ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) { INT cx, cy, lx, ly, nOvlIdx; DWORD fState, dwRop; @@ -1068,8 +1072,8 @@ if (!is_valid(himl)) return FALSE; if ((pimldp->i < 0) || (pimldp->i >= himl->cCurImage)) return FALSE;
- lx = himl->cx * pimldp->i + pimldp->xBitmap; - ly = pimldp->yBitmap; + lx = index2x(pimldp->i,himl->cx) + pimldp->xBitmap; + ly = index2y(pimldp->i,himl->cy) + pimldp->yBitmap;
fState = pimldp->cbSize < sizeof(IMAGELISTDRAWPARAMS) ? ILS_NORMAL : pimldp->fState; fStyle = pimldp->fStyle & ~ILD_OVERLAYMASK; @@ -1187,10 +1191,11 @@ if ( (nOvlIdx >= 1) && (nOvlIdx <= MAX_OVERLAYIMAGE)) { nOvlIdx = himl->nOvlIdx[nOvlIdx - 1]; if ((nOvlIdx >= 0) && (nOvlIdx < himl->cCurImage)) { - const INT ox = himl->cx * nOvlIdx + pimldp->xBitmap; + const INT ox = index2x(nOvlIdx,himl->cx) + pimldp->xBitmap; + const INT oy = index2y(nOvlIdx,himl->cy) + pimldp->yBitmap; if (himl->hbmMask && !(fStyle & ILD_IMAGE)) - BitBlt (hImageDC, 0, 0, cx, cy, hMaskListDC, ox, ly, SRCAND); - BitBlt (hImageDC, 0, 0, cx, cy, hImageListDC, ox, ly, SRCPAINT); + BitBlt (hImageDC, 0, 0, cx, cy, hMaskListDC, ox, oy, SRCAND); + BitBlt (hImageDC, 0, 0, cx, cy, hImageListDC, ox, oy, SRCPAINT); } }
@@ -1259,11 +1264,13 @@
if (himlDst) { - BitBlt (himlDst->hdcImage, 0, 0, himlSrc->cCurImage * himlSrc->cx, himlSrc->cy, + BitBlt (himlDst->hdcImage, 0, 0, + count2x(himlSrc->cCurImage,himlSrc->cx), himlSrc->cy*PER_ROW, himlSrc->hdcImage, 0, 0, SRCCOPY);
if (himlDst->hbmMask) - BitBlt (himlDst->hdcMask, 0, 0, himlSrc->cCurImage * himlSrc->cx, himlSrc->cy, + BitBlt (himlDst->hdcMask, 0, 0, + count2x(himlSrc->cCurImage,himlSrc->cx), himlSrc->cy*PER_ROW, himlSrc->hdcMask, 0, 0, SRCCOPY);
himlDst->cCurImage = himlSrc->cCurImage; @@ -1421,7 +1428,9 @@ hOldDstBitmap = SelectObject (hdcDst, ii.hbmMask); if (himl->hbmMask) { BitBlt (hdcDst, 0, 0, himl->cx, himl->cy, - himl->hdcMask, i * himl->cx, 0, SRCCOPY); + himl->hdcMask, + index2x(i,himl->cx), index2y(i,himl->cy), + SRCCOPY); } else PatBlt (hdcDst, 0, 0, himl->cx, himl->cy, BLACKNESS); @@ -1429,7 +1438,8 @@ /* draw image*/ SelectObject (hdcDst, ii.hbmColor); BitBlt (hdcDst, 0, 0, himl->cx, himl->cy, - himl->hdcImage, i * himl->cx, 0, SRCCOPY); + himl->hdcImage, + index2x(i,himl->cx), index2y(i,himl->cy), SRCCOPY);
/* * CreateIconIndirect requires us to deselect the bitmaps from @@ -1531,11 +1541,10 @@ pImageInfo->hbmImage = himl->hbmImage; pImageInfo->hbmMask = himl->hbmMask;
- pImageInfo->rcImage.top = 0; - pImageInfo->rcImage.bottom = himl->cy; - pImageInfo->rcImage.left = i * himl->cx; - pImageInfo->rcImage.right = (i+1) * himl->cx; - + pImageInfo->rcImage.top = index2y(i,himl->cy); + pImageInfo->rcImage.bottom = index2y(i,himl->cy)+himl->cy; + pImageInfo->rcImage.left = index2x(i,himl->cx); + pImageInfo->rcImage.right = index2x(i,himl->cx)+himl->cx; return TRUE; }
@@ -1566,11 +1575,10 @@ if ((i < 0) || (i >= himl->cCurImage)) return FALSE;
- lpRect->left = i * himl->cx; - lpRect->top = 0; + lpRect->left = index2x(i,himl->cx); lpRect->right = lpRect->left + himl->cx; - lpRect->bottom = himl->cy; - + lpRect->top = index2y(i,himl->cy); + lpRect->bottom = lpRect->top + himl->cy; return TRUE; }
@@ -1724,7 +1732,6 @@ HIMAGELIST himlDst = NULL; INT cxDst, cyDst; INT xOff1, yOff1, xOff2, yOff2; - INT nX1, nX2;
TRACE("(himl1=%p i1=%d himl2=%p i2=%d dx=%d dy=%d)\n", himl1, i1, himl2, i2, dx, dy); @@ -1768,25 +1775,29 @@
if (himlDst) { - nX1 = i1 * himl1->cx; - nX2 = i2 * himl2->cx; + int x1, x2, y1, y2; + + x1 = index2x(i1,himl1->cx); + y1 = index2y(i1,himl1->cy); + x2 = index2x(i2,himl2->cx); + y2 = index2y(i2,himl2->cy);
/* copy image */ BitBlt (himlDst->hdcImage, 0, 0, cxDst, cyDst, himl1->hdcImage, 0, 0, BLACKNESS); if (i1 >= 0 && i1 < himl1->cCurImage) - BitBlt (himlDst->hdcImage, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcImage, nX1, 0, SRCCOPY); + BitBlt (himlDst->hdcImage, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcImage, x1, y1, SRCCOPY); if (i2 >= 0 && i2 < himl2->cCurImage) { - BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask , nX2, 0, SRCAND); - BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, nX2, 0, SRCPAINT); + BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask , x2, y2, SRCAND); + BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, x2, y2, SRCPAINT); }
/* copy mask */ BitBlt (himlDst->hdcMask, 0, 0, cxDst, cyDst, himl1->hdcMask, 0, 0, WHITENESS); if (i1 >= 0 && i1 < himl1->cCurImage) - BitBlt (himlDst->hdcMask, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcMask, nX1, 0, SRCCOPY); + BitBlt (himlDst->hdcMask, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcMask, x1, y1, SRCCOPY); if (i2 >= 0 && i2 < himl2->cCurImage) - BitBlt (himlDst->hdcMask, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask, nX2, 0, SRCAND); + BitBlt (himlDst->hdcMask, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask, x2, y2, SRCAND);
himlDst->cCurImage = 1; } @@ -1862,6 +1873,7 @@ nheight = cy; nRows = (height/cy);
+ FIXME("nwidth %d, nheight %d, cy %d\n", nwidth, nheight, cy); if (bitsperpixel==1) hbitmap = CreateBitmap(nwidth,nheight,1,1,NULL); else @@ -2048,36 +2060,36 @@ for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) himl->nOvlIdx[nCount] = -1;
- hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage * himl->cx, himl->cy); + hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, + count2x(himl->cMaxImage,himl->cx), himl->cy*PER_ROW); SelectObject (himl->hdcImage, hbmNewImage); DeleteObject (himl->hbmImage); himl->hbmImage = hbmNewImage;
if (himl->hbmMask) { - hbmNewMask = CreateBitmap (himl->cMaxImage * himl->cx, himl->cy, + hbmNewMask = CreateBitmap (count2x(himl->cMaxImage,himl->cx), himl->cy*PER_ROW, 1, 1, NULL); SelectObject (himl->hdcMask, hbmNewMask); DeleteObject (himl->hbmMask); himl->hbmMask = hbmNewMask; } - } - else { + } else { /* delete one image */ TRACE("Remove single image! %d\n", i);
/* create new bitmap(s) */ nCount = (himl->cCurImage + himl->cGrow - 1); - cxNew = nCount * himl->cx; + cxNew = count2x(nCount , himl->cx);
TRACE(" - Number of images: %d / %d (Old/New)\n", himl->cCurImage, himl->cCurImage - 1); TRACE(" - Max. number of images: %d / %d (Old/New)\n", himl->cMaxImage, himl->cCurImage + himl->cGrow - 1);
- hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, cxNew, himl->cy); + hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, cxNew, himl->cy*PER_ROW);
if (himl->hbmMask) - hbmNewMask = CreateBitmap (cxNew, himl->cy, 1, 1, NULL); + hbmNewMask = CreateBitmap (cxNew, himl->cy*PER_ROW, 1, 1, NULL); else hbmNewMask = 0; /* Just to keep compiler happy! */
@@ -2085,31 +2097,45 @@
/* copy all images and masks prior to the "removed" image */ if (i > 0) { - TRACE("Pre image copy: Copy %d images\n", i); + int n = count2x(i,1);
- SelectObject (hdcBmp, hbmNewImage); - BitBlt (hdcBmp, 0, 0, i * himl->cx, himl->cy, - himl->hdcImage, 0, 0, SRCCOPY); - - if (himl->hbmMask) { - SelectObject (hdcBmp, hbmNewMask); - BitBlt (hdcBmp, 0, 0, i * himl->cx, himl->cy, - himl->hdcMask, 0, 0, SRCCOPY); + TRACE("Pre image copy: Copy %d images\n", i); + if (n) { /* copy started rows */ + SelectObject (hdcBmp, hbmNewImage); + BitBlt (hdcBmp, 0, 0, n * himl->cx, himl->cy * PER_ROW, + himl->hdcImage, 0, 0, SRCCOPY); + + if (himl->hbmMask) { + SelectObject (hdcBmp, hbmNewMask); + BitBlt (hdcBmp, 0, 0, n * himl->cx, himl->cy * PER_ROW, + himl->hdcMask, 0, 0, SRCCOPY); + } } + /* this might copy some images more. But we will + * overwrite them right afterwards */ }
/* copy all images and masks behind the removed image */ if (i < himl->cCurImage - 1) { + int j; + TRACE("Post image copy!\n"); - SelectObject (hdcBmp, hbmNewImage); - BitBlt (hdcBmp, i * himl->cx, 0, (himl->cCurImage - i - 1) * himl->cx, - himl->cy, himl->hdcImage, (i + 1) * himl->cx, 0, SRCCOPY); + + /* copy the post-i images one-by-one */ + SelectObject (hdcBmp, hbmNewImage); + for (j=i;j<himl->cCurImage -1;j++) + BitBlt (hdcBmp, index2x(j,himl->cx), index2y(j,himl->cy), himl->cx, himl->cy, + himl->hdcImage, index2x(j+1,himl->cx), index2y(j+1,himl->cy), SRCCOPY);
if (himl->hbmMask) { SelectObject (hdcBmp, hbmNewMask); - BitBlt (hdcBmp, i * himl->cx, 0, - (himl->cCurImage - i - 1) * himl->cx, - himl->cy, himl->hdcMask, (i + 1) * himl->cx, 0, SRCCOPY); + for (j=i;j<himl->cCurImage -1;j++) + BitBlt (hdcBmp, + index2x(j,himl->cx), index2y(j,himl->cy), + himl->cx, himl->cy, + himl->hdcMask, + index2x(j+1,himl->cx), index2y(j+1,himl->cy), + SRCCOPY); } }
@@ -2290,12 +2316,16 @@ SetBkColor (himl->hdcImage, RGB(255,255,255)); hbmOldSrc = SelectObject (hdcImage, ii.hbmColor);
- StretchBlt (himl->hdcImage, nIndex * himl->cx, 0, himl->cx, himl->cy, - hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); + StretchBlt (himl->hdcImage, + index2x(nIndex,himl->cx), index2y(nIndex,himl->cy), + himl->cx, himl->cy, + hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
if (himl->hbmMask) { SelectObject (hdcImage, ii.hbmMask); - StretchBlt (himl->hdcMask, nIndex * himl->cx, 0, himl->cx, himl->cy, + StretchBlt (himl->hdcMask, + index2x(nIndex,himl->cx), index2y(nIndex,himl->cy), + himl->cx, himl->cy, hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); }