From ee3b9be8e25e58b167efa18d1c7908908c231de3 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Thu, 14 Mar 2024 14:13:52 +0300 Subject: [PATCH] comctl32: Implement IImageList2::Initialize(). ... by moving ImageList_Create() implementation. Signed-off-by: Dmitry Timoshkov --- dlls/comctl32/imagelist.c | 193 ++++++++++++++++++++-------------------- dlls/comctl32/tests/imagelist.c | 2 - 2 files changed, 98 insertions(+), 97 deletions(-) diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c index 85bb2fe0026..49155e8d2c1 100644 --- a/dlls/comctl32/imagelist.c +++ b/dlls/comctl32/imagelist.c @@ -763,106 +763,18 @@ HIMAGELIST WINAPI ImageList_Create (INT cx, INT cy, UINT flags, INT cInitial, INT cGrow) { - HIMAGELIST himl; - INT nCount; - HBITMAP hbmTemp; - UINT ilc = (flags & 0xFE); - static const WORD aBitBlend25[] = - {0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00}; - - static const WORD aBitBlend50[] = - {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA}; + IImageList2 *himl; TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow); - if (cx < 0 || cy < 0) return NULL; - if (!((flags&ILC_COLORDDB) == ILC_COLORDDB) && (cx == 0 || cy == 0)) return NULL; - /* Create the IImageList interface for the image list */ - if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl))) + if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList2, (void **)&himl))) return NULL; - cGrow = (WORD)((max( cGrow, 1 ) + 3) & ~3); - - if (cGrow > 256) - { - /* Windows doesn't limit the size here, but X11 doesn't let us allocate such huge bitmaps */ - WARN( "grow %d too large, limiting to 256\n", cGrow ); - cGrow = 256; - } - - himl->cx = cx; - himl->cy = cy; - himl->flags = flags; - himl->cMaxImage = cInitial + 1; - himl->cInitial = cInitial; - himl->cGrow = cGrow; - himl->clrFg = CLR_DEFAULT; - himl->clrBk = CLR_NONE; - himl->color_table_set = FALSE; - - /* initialize overlay mask indices */ - for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) - himl->nOvlIdx[nCount] = -1; - - /* Create Image & Mask DCs */ - himl->hdcImage = CreateCompatibleDC (0); - if (!himl->hdcImage) - goto cleanup; - if (himl->flags & ILC_MASK){ - himl->hdcMask = CreateCompatibleDC(0); - if (!himl->hdcMask) - goto cleanup; - } - - /* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */ - if (ilc == ILC_COLOR) - { - ilc = ILC_COLOR4; - himl->flags |= ILC_COLOR4; - } - - if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) - himl->uBitsPixel = ilc; - else - himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL); - - if (himl->cMaxImage > 0) { - himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage); - SelectObject(himl->hdcImage, himl->hbmImage); - } else - himl->hbmImage = 0; - - if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) { - SIZE sz; - - imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz); - himl->hbmMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL); - if (himl->hbmMask == 0) { - ERR("Error creating mask bitmap!\n"); - goto cleanup; - } - SelectObject(himl->hdcMask, himl->hbmMask); - } - else - himl->hbmMask = 0; - - himl->item_flags = Alloc( himl->cMaxImage * sizeof(*himl->item_flags) ); - - /* create blending brushes */ - hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend25); - himl->hbrBlend25 = CreatePatternBrush (hbmTemp); - DeleteObject (hbmTemp); - - hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend50); - himl->hbrBlend50 = CreatePatternBrush (hbmTemp); - DeleteObject (hbmTemp); - - TRACE("created imagelist %p\n", himl); - return himl; + if (IImageList2_Initialize(himl, cx, cy, flags, cInitial, cGrow) == S_OK) + return (HIMAGELIST)himl; -cleanup: - ImageList_Destroy(himl); + IImageList2_Release(himl); return NULL; } @@ -3721,8 +3633,99 @@ static HRESULT WINAPI ImageListImpl_GetStatistics(IImageList2 *iface, IMAGELISTS static HRESULT WINAPI ImageListImpl_Initialize(IImageList2 *iface, INT cx, INT cy, UINT flags, INT initial, INT grow) { - FIXME("(%p)->(%d %d %d %d %d): stub\n", iface, cx, cy, flags, initial, grow); - return E_NOTIMPL; + HIMAGELIST himl = impl_from_IImageList2(iface); + INT nCount; + HBITMAP hbmTemp; + UINT ilc = (flags & 0xFE); + static const WORD aBitBlend25[] = + {0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00}; + static const WORD aBitBlend50[] = + {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA}; + + TRACE("(%p)->(%d %d %d %d %d)\n", iface, cx, cy, flags, initial, grow); + + if (cx < 0 || cy < 0) return E_INVALIDARG; + if (!((flags&ILC_COLORDDB) == ILC_COLORDDB) && (cx == 0 || cy == 0)) return E_INVALIDARG; + + grow = (WORD)((max( grow, 1 ) + 3) & ~3); + + if (grow > 256) + { + /* Windows doesn't limit the size here, but X11 doesn't let us allocate such huge bitmaps */ + WARN( "grow %d too large, limiting to 256\n", grow ); + grow = 256; + } + + himl->cx = cx; + himl->cy = cy; + himl->flags = flags; + himl->cMaxImage = initial + 1; + himl->cInitial = initial; + himl->cGrow = grow; + himl->clrFg = CLR_DEFAULT; + himl->clrBk = CLR_NONE; + himl->color_table_set = FALSE; + + /* initialize overlay mask indices */ + for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) + himl->nOvlIdx[nCount] = -1; + + /* Create Image & Mask DCs */ + himl->hdcImage = CreateCompatibleDC (0); + if (!himl->hdcImage) + return E_FAIL; + if (himl->flags & ILC_MASK){ + himl->hdcMask = CreateCompatibleDC(0); + if (!himl->hdcMask) + return E_FAIL; + } + + /* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */ + if (ilc == ILC_COLOR) + { + ilc = ILC_COLOR4; + himl->flags |= ILC_COLOR4; + } + + if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) + himl->uBitsPixel = ilc; + else + himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL); + + if (himl->cMaxImage > 0) { + himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage); + SelectObject(himl->hdcImage, himl->hbmImage); + } else + himl->hbmImage = 0; + + if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) { + SIZE sz; + + imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz); + himl->hbmMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL); + if (himl->hbmMask == 0) { + ERR("Error creating mask bitmap!\n"); + return E_FAIL; + } + SelectObject(himl->hdcMask, himl->hbmMask); + } + else + himl->hbmMask = 0; + + himl->item_flags = Alloc( himl->cMaxImage * sizeof(*himl->item_flags) ); + + /* create blending brushes */ + hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend25); + himl->hbrBlend25 = CreatePatternBrush (hbmTemp); + DeleteObject (hbmTemp); + + hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend50); + himl->hbrBlend50 = CreatePatternBrush (hbmTemp); + DeleteObject (hbmTemp); + + TRACE("created imagelist %p\n", himl); + return S_OK; + } static HRESULT WINAPI ImageListImpl_Replace2(IImageList2 *iface, INT i, HBITMAP image, HBITMAP mask, IUnknown *unk, DWORD flags) diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c index 6caea741df8..de0b0dd4c08 100644 --- a/dlls/comctl32/tests/imagelist.c +++ b/dlls/comctl32/tests/imagelist.c @@ -1745,9 +1745,7 @@ static void test_iimagelist(void) } hr = IImageList2_Initialize(imagelist, BMP_CX, BMP_CX, ILC_COLOR24, 1, 1); - todo_wine ok(hr == S_OK, "got %#lx\n", hr); - if (hr != S_OK) return; check_iml_data((HIMAGELIST)imagelist, BMP_CX, BMP_CX, 0, 2, 1, ILC_COLOR24, "IImageList2 0"); -- 2.11.4.GIT