From 978137dc607f7e6ed10436cf961cf0bb38f3e905 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 11 Oct 1998 13:12:54 +0000 Subject: [PATCH] Some minor improvements. --- dlls/comctl32/imagelist.c | 218 ++++++++++++++++++++++---------------- include/imagelist.h | 4 +- 2 files changed, 128 insertions(+), 94 deletions(-) diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c index 0aec07d139b..867c326a1f4 100644 --- a/dlls/comctl32/imagelist.c +++ b/dlls/comctl32/imagelist.c @@ -4,7 +4,7 @@ * Copyright 1998 Eric Kohl * * TODO: - * - Fix xBitmap and yBitmap in ImageList_DrawIndirect. + * - Fix ImageList_DrawIndirect (xBitmap, yBitmap, rgbFg, rgbBk, dwRop). * - Fix ImageList_GetIcon. * - Fix drag functions. * - Fix ImageList_Read and ImageList_Write. @@ -382,9 +382,12 @@ ImageList_Copy (HIMAGELIST himlDst, INT32 iDst, HIMAGELIST himlSrc, TRACE(imagelist, "iDst=%d iSrc=%d\n", iDst, iSrc); - if ((himlSrc == NULL) || (himlDst == NULL)) return (FALSE); - if ((iDst < 0) || (iDst >= himlDst->cCurImage)) return (FALSE); - if ((iSrc < 0) || (iSrc >= himlSrc->cCurImage)) return (FALSE); + if ((himlSrc == NULL) || (himlDst == NULL)) + return FALSE; + if ((iDst < 0) || (iDst >= himlDst->cCurImage)) + return FALSE; + if ((iSrc < 0) || (iSrc >= himlSrc->cCurImage)) + return FALSE; hdcSrc = CreateCompatibleDC32 (0); if (himlDst == himlSrc) @@ -472,14 +475,12 @@ ImageList_Copy (HIMAGELIST himlDst, INT32 iDst, HIMAGELIST himlSrc, if (himlSrc != himlDst) DeleteDC32 (hdcDst); - return (TRUE); + return TRUE; } /************************************************************************* - * ImageList_Create [COMCTL32.44] - * - * Creates a new image list. + * ImageList_Create [COMCTL32.44] Creates a new image list. * * PARAMS * cx [I] image height @@ -489,8 +490,8 @@ ImageList_Copy (HIMAGELIST himlDst, INT32 iDst, HIMAGELIST himlSrc, * cGrow [I] number of images by which image list grows * * RETURNS - * Success: Handle of the created image list - * Failure: 0 + * Success: Handle to the created image list + * Failure: NULL */ HIMAGELIST WINAPI @@ -501,27 +502,27 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags, HDC32 hdc; INT32 nCount; HBITMAP32 hbmTemp; - WORD aBitBlend25[16] = - {0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, - 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD}; - WORD aBitBlend50[16] = - {0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, - 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA}; + static WORD aBitBlend25[] = + {0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00}; + + static WORD aBitBlend50[] = + {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA}; TRACE (imagelist, "(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow); - himl = (HIMAGELIST)LocalAlloc32 (LMEM_FIXED | LMEM_ZEROINIT, - sizeof(struct _IMAGELIST)); + himl = (HIMAGELIST)COMCTL32_Alloc (sizeof(struct _IMAGELIST)); if (!himl) - return (NULL); - himl->cx = cx; - himl->cy = cy; - himl->flags = flags; + return NULL; + + himl->cx = cx; + himl->cy = cy; + himl->flags = flags; himl->cMaxImage = cInitial + cGrow; - himl->cInitial = cInitial; - himl->cGrow = cGrow; + himl->cInitial = cInitial; + himl->cGrow = cGrow; himl->cCurImage = 0; - himl->clrBk = CLR_NONE; + himl->clrFg = CLR_DEFAULT; + himl->clrBk = CLR_NONE; /* initialize overlay mask indices */ for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) @@ -538,7 +539,7 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags, 1, himl->uBitsPixel, NULL); if (himl->hbmImage == 0) { ERR(imagelist, "Error creating image bitmap!\n"); - return (0); + return NULL; } if (himl->flags & ILC_MASK) { @@ -548,22 +549,22 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags, ERR(imagelist, "Error creating mask bitmap!\n"); if (himl->hbmImage) DeleteObject32 (himl->hbmImage); - return (0); + return NULL; } } else himl->hbmMask = 0; /* create blending brushes */ - hbmTemp = CreateBitmap32 (16, 16, 1, 1, &aBitBlend25); + hbmTemp = CreateBitmap32 (8, 8, 1, 1, &aBitBlend25); himl->hbrBlend25 = CreatePatternBrush32 (hbmTemp); DeleteObject32 (hbmTemp); - hbmTemp = CreateBitmap32 (16, 16, 1, 1, &aBitBlend50); + hbmTemp = CreateBitmap32 (8, 8, 1, 1, &aBitBlend50); himl->hbrBlend50 = CreatePatternBrush32 (hbmTemp); DeleteObject32 (hbmTemp); - return (himl); + return himl; } @@ -583,15 +584,24 @@ ImageList_Create (INT32 cx, INT32 cy, UINT32 flags, BOOL32 WINAPI ImageList_Destroy (HIMAGELIST himl) { - if (himl == NULL) return (FALSE); + if (!himl) + return FALSE; + /* delete image bitmaps */ if (himl->hbmImage) DeleteObject32 (himl->hbmImage); if (himl->hbmMask) DeleteObject32 (himl->hbmMask); + + /* delete blending brushes */ + if (himl->hbrBlend25) + DeleteObject32 (himl->hbrBlend25); + if (himl->hbrBlend50) + DeleteObject32 (himl->hbrBlend50); - LocalFree32 ((HLOCAL32)himl); - return (TRUE); + COMCTL32_Free (himl); + + return TRUE; } @@ -633,7 +643,7 @@ ImageList_DragEnter (HWND32 hwndLock, INT32 x, INT32 y) ImageList_DragShowNolock (TRUE); - return (FALSE); + return FALSE; } @@ -878,11 +888,14 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) BOOL32 bBlend25; BOOL32 bBlend50; - if (pimldp == NULL) return (FALSE); - if (pimldp->cbSize < sizeof(IMAGELISTDRAWPARAMS)) return (FALSE); - if (pimldp->himl == NULL) return (FALSE); - if ((pimldp->i < 0) || (pimldp->i >= pimldp->himl->cCurImage)) + if (pimldp == NULL) + return FALSE; + if (pimldp->cbSize < sizeof(IMAGELISTDRAWPARAMS)) return (FALSE); + if (pimldp->himl == NULL) + return FALSE; + if ((pimldp->i < 0) || (pimldp->i >= pimldp->himl->cCurImage)) + return FALSE; himlLocal = pimldp->himl; @@ -1197,8 +1210,8 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle) HDC32 hdcSrc, hdcDst; INT32 nWidth, nHeight; - if (himl == NULL) return 0; - if ((i < 0) || (i >= himl->cCurImage)) return 0; + if ((himl == NULL) ||(i < 0) || (i >= himl->cCurImage)) + return 0; nWidth = GetSystemMetrics32 (SM_CXICON); nHeight = GetSystemMetrics32 (SM_CYICON); @@ -1207,8 +1220,8 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle) hdcDst = CreateCompatibleDC32(0); ii.fIcon = TRUE; - ii.xHotspot = 0; - ii.yHotspot = 0; + ii.xHotspot = nWidth / 2; + ii.yHotspot = nHeight / 2; ii.hbmMask = CreateCompatibleBitmap32 (hdcDst, nWidth, nHeight); ii.hbmColor = CreateCompatibleBitmap32 (hdcDst, nWidth, nHeight); @@ -1236,7 +1249,7 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle) DeleteObject32 (ii.hbmMask); DeleteObject32 (ii.hbmColor); - return (hIcon); + return hIcon; } @@ -1261,15 +1274,17 @@ ImageList_GetIcon (HIMAGELIST himl, INT32 i, UINT32 fStyle) BOOL32 WINAPI ImageList_GetIconSize (HIMAGELIST himl, INT32 *cx, INT32 *cy) { - - if (himl == NULL) return (FALSE); + if (himl == NULL) + return FALSE; + if ((himl->cx <= 0) || (himl->cy <= 0)) + return FALSE; if (cx) - *cx = himl->cx; - + *cx = himl->cx; if (cy) - *cy = himl->cy; - return (TRUE); + *cy = himl->cy; + + return TRUE; } @@ -1292,7 +1307,7 @@ ImageList_GetImageCount (HIMAGELIST himl) if (himl == NULL) return 0; - return (himl->cCurImage); + return himl->cCurImage; } @@ -1314,8 +1329,10 @@ ImageList_GetImageCount (HIMAGELIST himl) BOOL32 WINAPI ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo) { - if ((himl == NULL) || (pImageInfo == NULL)) return (FALSE); - if ((i < 0) || (i >= himl->cCurImage)) return (FALSE); + if ((himl == NULL) || (pImageInfo == NULL)) + return FALSE; + if ((i < 0) || (i >= himl->cCurImage)) + return FALSE; pImageInfo->hbmImage = himl->hbmImage; pImageInfo->hbmMask = himl->hbmMask; @@ -1325,7 +1342,7 @@ ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo) pImageInfo->rcImage.left = i * himl->cx; pImageInfo->rcImage.right = (i+1) * himl->cx; - return (TRUE); + return TRUE; } @@ -1335,7 +1352,7 @@ ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo) * Retrieves the rectangle of the specified image in an image list. * * PARAMS - * himl [I] image list handle + * himl [I] handle to the image list * i [I] image index * lpRect [O] pointer to the image rectangle * @@ -1350,15 +1367,17 @@ ImageList_GetImageInfo (HIMAGELIST himl, INT32 i, IMAGEINFO *pImageInfo) BOOL32 WINAPI ImageList_GetImageRect (HIMAGELIST himl, INT32 i, LPRECT32 lpRect) { - if ((himl == NULL) || (lpRect == NULL)) return (FALSE); - if ((i < 0) || (i >= himl->cCurImage)) return (FALSE); + if ((himl == NULL) || (lpRect == NULL)) + return FALSE; + if ((i < 0) || (i >= himl->cCurImage)) + return FALSE; - lpRect->left = i * himl->cx; - lpRect->top = 0; - lpRect->right = lpRect->left + himl->cx; + lpRect->left = i * himl->cx; + lpRect->top = 0; + lpRect->right = lpRect->left + himl->cx; lpRect->bottom = himl->cy; - return (TRUE); + return TRUE; } @@ -1516,17 +1535,18 @@ ImageList_Merge (HIMAGELIST himl1, INT32 i1, HIMAGELIST himl2, INT32 i2, INT32 xOff1, yOff1, xOff2, yOff2; INT32 nX1, nX2; - if ((himl1 == NULL) || (himl2 == NULL)) return (NULL); + if ((himl1 == NULL) || (himl2 == NULL)) + return NULL; /* check indices */ if ((i1 < 0) || (i1 >= himl1->cCurImage)) { ERR (imagelist, "Index 1 out of range! %d\n", i1); - return (NULL); + return NULL; } if ((i2 < 0) || (i2 >= himl2->cCurImage)) { ERR (imagelist, "Index 2 out of range! %d\n", i2); - return (NULL); + return NULL; } if (dx > 0) { @@ -1601,7 +1621,7 @@ ImageList_Merge (HIMAGELIST himl1, INT32 i1, HIMAGELIST himl2, INT32 i2, DeleteDC32 (hdcDstImage); } - return (himlDst); + return himlDst; } @@ -1619,7 +1639,7 @@ ImageList_Merge (HIMAGELIST himl1, INT32 i1, HIMAGELIST himl2, INT32 i2, * * NOTES * This function can not be implemented yet, because - * IStream32::Read is not implemented. + * IStream32::Read is not implemented yet. * * BUGS * empty stub. @@ -1655,12 +1675,12 @@ ImageList_Remove (HIMAGELIST himl, INT32 i) if ((i < -1) || (i >= himl->cCurImage)) { ERR (imagelist, "index out of range! %d\n", i); - return (FALSE); + return FALSE; } if (himl->cCurImage == 0) { ERR (imagelist, "image list is already empty!\n"); - return (FALSE); + return FALSE; } if (i == -1) { @@ -1756,7 +1776,7 @@ ImageList_Remove (HIMAGELIST himl, INT32 i) himl->cMaxImage = himl->cCurImage + himl->cGrow; } - return (TRUE); + return TRUE; } @@ -1785,12 +1805,12 @@ ImageList_Replace (HIMAGELIST himl, INT32 i, HBITMAP32 hbmImage, if (himl == NULL) { ERR (imagelist, "Invalid image list handle!\n"); - return (FALSE); + return FALSE; } if ((i >= himl->cCurImage) || (i < 0)) { ERR (imagelist, "Invalid image index!\n"); - return (FALSE); + return FALSE; } hdcImageList = CreateCompatibleDC32 (0); @@ -1817,7 +1837,7 @@ ImageList_Replace (HIMAGELIST himl, INT32 i, HBITMAP32 hbmImage, DeleteDC32 (hdcImage); DeleteDC32 (hdcImageList); - return (TRUE); + return TRUE; } @@ -1842,13 +1862,15 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT32 i, HICON32 hIcon) HDC32 hdcImageList, hdcImage; INT32 nIndex; HBITMAP32 hbmOldSrc, hbmOldDst; - ICONINFO ii; - BITMAP32 bmp; + ICONINFO ii; + BITMAP32 bmp; TRACE (imagelist, "(0x%lx 0x%x 0x%x)\n", (DWORD)himl, i, hIcon); - if (himl == NULL) return (-1); - if ((i >= himl->cCurImage) || (i < -1)) return (-1); + if (himl == NULL) + return -1; + if ((i >= himl->cCurImage) || (i < -1)) + return -1; GetIconInfo (hIcon, &ii); if (ii.hbmMask == 0) @@ -1898,15 +1920,12 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT32 i, HICON32 hIcon) DeleteDC32 (hdcImageList); if (hdcImage) DeleteDC32 (hdcImage); - -// FIXME (imagelist, "deleting hbmColor!\n"); if (ii.hbmColor) DeleteObject32 (ii.hbmColor); -// FIXME (imagelist, "deleted hbmColor!\n"); if (ii.hbmMask) DeleteObject32 (ii.hbmMask); - return (nIndex); + return nIndex; } @@ -1930,11 +1949,11 @@ ImageList_SetBkColor (HIMAGELIST himl, COLORREF clrBk) COLORREF clrOldBk; if (himl == NULL) - return (CLR_NONE); + return CLR_NONE; clrOldBk = himl->clrBk; himl->clrBk = clrBk; - return (clrOldBk); + return clrOldBk; } @@ -1965,7 +1984,8 @@ ImageList_SetDragCursorImage (HIMAGELIST himlDrag, INT32 iDrag, FIXME (imagelist, "semi-stub!\n"); - if (himlInternalDrag == NULL) return (FALSE); + if (himlInternalDrag == NULL) + return FALSE; TRACE (imagelist, " dxH=%d dyH=%d nX=%d nY=%d\n", dxHotspot, dyHotspot, nInternalDragHotspotX, nInternalDragHotspotY); @@ -1979,7 +1999,7 @@ ImageList_SetDragCursorImage (HIMAGELIST himlDrag, INT32 iDrag, nInternalDragHotspotX = dxHotspot; nInternalDragHotspotY = dyHotspot; - return (FALSE); + return FALSE; } @@ -2036,10 +2056,10 @@ ImageList_SetIconSize (HIMAGELIST himl, INT32 cx, INT32 cy) return FALSE; /* remove all images*/ - himl->cMaxImage = himl->cInitial + himl->cGrow; - himl->cCurImage = 0; - himl->cx = cx; - himl->cy = cy; + himl->cMaxImage = himl->cInitial + himl->cGrow; + himl->cCurImage = 0; + himl->cx = cx; + himl->cy = cy; /* initialize overlay mask indices */ for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) @@ -2057,7 +2077,7 @@ ImageList_SetIconSize (HIMAGELIST himl, INT32 cx, INT32 cy) 1, 1, NULL); } - return (TRUE); + return TRUE; } @@ -2101,15 +2121,22 @@ ImageList_SetImageCount (HIMAGELIST himl, INT32 iImageCount) { SelectObject32 (hdcImageList, himl->hbmImage); SelectObject32 (hdcBitmap, hbmNewBitmap); + + /* copy images */ BitBlt32 (hdcBitmap, 0, 0, nCopyCount * himl->cx, himl->cy, hdcImageList, 0, 0, SRCCOPY); + + /* delete 'empty' image space */ + SetBkColor32 (hdcBitmap, RGB(255, 255, 255)); + SetTextColor32 (hdcBitmap, RGB(0, 0, 0)); + PatBlt32 (hdcBitmap, nCopyCount * himl->cx, 0, + (nNewCount - nCopyCount) * himl->cx, himl->cy, BLACKNESS); + DeleteObject32 (himl->hbmImage); himl->hbmImage = hbmNewBitmap; } else - { ERR (imagelist, "Could not create new image bitmap !\n"); - } if (himl->hbmMask) { @@ -2119,15 +2146,22 @@ ImageList_SetImageCount (HIMAGELIST himl, INT32 iImageCount) { SelectObject32 (hdcImageList, himl->hbmMask); SelectObject32 (hdcBitmap, hbmNewBitmap); + + /* copy images */ BitBlt32 (hdcBitmap, 0, 0, nCopyCount * himl->cx, himl->cy, hdcImageList, 0, 0, SRCCOPY); + + /* delete 'empty' image space */ + SetBkColor32 (hdcBitmap, RGB(255, 255, 255)); + SetTextColor32 (hdcBitmap, RGB(0, 0, 0)); + PatBlt32 (hdcBitmap, nCopyCount * himl->cx, 0, + (nNewCount - nCopyCount) * himl->cx, himl->cy, BLACKNESS); + DeleteObject32 (himl->hbmMask); himl->hbmMask = hbmNewBitmap; } else - { ERR (imagelist, "Could not create new mask bitmap!\n"); - } } DeleteDC32 (hdcImageList); diff --git a/include/imagelist.h b/include/imagelist.h index ce07a6e97a9..11467df5007 100644 --- a/include/imagelist.h +++ b/include/imagelist.h @@ -14,6 +14,7 @@ struct _IMAGELIST HBRUSH32 hbrBlend25; HBRUSH32 hbrBlend50; COLORREF clrBk; + COLORREF clrFg; INT32 cInitial; INT32 cGrow; INT32 cMaxImage; @@ -26,7 +27,6 @@ struct _IMAGELIST }; typedef struct _IMAGELIST *HIMAGELIST; - - + #endif /* __WINE_IMAGELIST_H */