* - Thread-safe locking
*/
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define COBJMACROS
-
-#include "winerror.h"
-#include "windef.h"
-#include "winbase.h"
-#include "objbase.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "commctrl.h"
#include "comctl32.h"
-#include "commoncontrols.h"
-#include "imagelist.h"
-#include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(imagelist);
+#include <commoncontrols.h>
+#include <wine/exception.h>
+WINE_DEFAULT_DEBUG_CHANNEL(imagelist);
#define MAX_OVERLAYIMAGE 15
+struct _IMAGELIST
+{
+ IImageList2 IImageList2_iface; /* 00: IImageList vtable */
+ INT cCurImage; /* 04: ImageCount */
+ INT cMaxImage; /* 08: maximages */
+ INT cGrow; /* 0C: cGrow */
+ INT cx; /* 10: cx */
+ INT cy; /* 14: cy */
+ DWORD x4;
+ UINT flags; /* 1C: flags */
+ COLORREF clrFg; /* 20: foreground color */
+ COLORREF clrBk; /* 24: background color */
+
+
+ HBITMAP hbmImage; /* 28: images Bitmap */
+ HBITMAP hbmMask; /* 2C: masks Bitmap */
+ HDC hdcImage; /* 30: images MemDC */
+ HDC hdcMask; /* 34: masks MemDC */
+ INT nOvlIdx[MAX_OVERLAYIMAGE]; /* 38: overlay images index */
+
+ /* not yet found out */
+ HBRUSH hbrBlend25;
+ HBRUSH hbrBlend50;
+ INT cInitial;
+ UINT uBitsPixel;
+ char *has_alpha;
+
+ LONG ref; /* reference count */
+};
+
+#define IMAGELIST_MAGIC 0x53414D58
+
+/* Header used by ImageList_Read() and ImageList_Write() */
+#include "pshpack2.h"
+typedef struct _ILHEAD
+{
+ USHORT usMagic;
+ USHORT usVersion;
+ WORD cCurImage;
+ WORD cMaxImage;
+ WORD cGrow;
+ WORD cx;
+ WORD cy;
+ COLORREF bkcolor;
+ WORD flags;
+ SHORT ovls[4];
+} ILHEAD;
+#include "poppack.h"
+
/* internal image list data used for Drag & Drop operations */
typedef struct
{
HWND hwnd;
HIMAGELIST himl;
+ HIMAGELIST himlNoCursor;
/* position of the drag image relative to the window */
INT x;
INT y;
HBITMAP hbmBg;
} INTERNALDRAG;
-static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0 };
+static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, 0, FALSE, 0 };
+
+static inline HIMAGELIST impl_from_IImageList2(IImageList2 *iface)
+{
+ return CONTAINING_RECORD(iface, struct _IMAGELIST, IImageList2_iface);
+}
static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count);
static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv);
-static inline BOOL is_valid(HIMAGELIST himl);
+static BOOL is_valid(HIMAGELIST himl);
/*
* An imagelist with N images is tiled like this:
sz->cy = imagelist_height( count ) * himl->cy;
}
+static inline int get_dib_stride( int width, int bpp )
+{
+ return ((width * bpp + 31) >> 3) & ~3;
+}
+
+static inline int get_dib_image_size( const BITMAPINFO *info )
+{
+ return get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount )
+ * abs( info->bmiHeader.biHeight );
+}
+
/*
* imagelist_copy_images()
*
}
}
+static void add_dib_bits( HIMAGELIST himl, int pos, int count, int width, int height,
+ BITMAPINFO *info, BITMAPINFO *mask_info, DWORD *bits, BYTE *mask_bits )
+{
+ int i, j, n;
+ POINT pt;
+ int stride = info->bmiHeader.biWidth;
+ int mask_stride = (info->bmiHeader.biWidth + 31) / 32 * 4;
+
+ for (n = 0; n < count; n++)
+ {
+ BOOL has_alpha = FALSE;
+
+ imagelist_point_from_index( himl, pos + n, &pt );
+
+ /* check if bitmap has an alpha channel */
+ for (i = 0; i < height && !has_alpha; i++)
+ for (j = n * width; j < (n + 1) * width; j++)
+ if ((has_alpha = ((bits[i * stride + j] & 0xff000000) != 0))) break;
+
+ if (!has_alpha) /* generate alpha channel from the mask */
+ {
+ for (i = 0; i < height; i++)
+ for (j = n * width; j < (n + 1) * width; j++)
+ if (!mask_info || !((mask_bits[i * mask_stride + j / 8] << (j % 8)) & 0x80))
+ bits[i * stride + j] |= 0xff000000;
+ else
+ bits[i * stride + j] = 0;
+ }
+ else
+ {
+ himl->has_alpha[pos + n] = 1;
+
+ if (mask_info && himl->hbmMask) /* generate the mask from the alpha channel */
+ {
+ for (i = 0; i < height; i++)
+ for (j = n * width; j < (n + 1) * width; j++)
+ if ((bits[i * stride + j] >> 24) > 25) /* more than 10% alpha */
+ mask_bits[i * mask_stride + j / 8] &= ~(0x80 >> (j % 8));
+ else
+ mask_bits[i * mask_stride + j / 8] |= 0x80 >> (j % 8);
+ }
+ }
+ StretchDIBits( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
+ n * width, 0, width, height, bits, info, DIB_RGB_COLORS, SRCCOPY );
+ if (mask_info)
+ StretchDIBits( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
+ n * width, 0, width, height, mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY );
+ }
+}
+
/* add images with an alpha channel when the image list is 32 bpp */
static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count,
int width, int height, HBITMAP hbmImage, HBITMAP hbmMask )
BITMAPINFO *info, *mask_info = NULL;
DWORD *bits = NULL;
BYTE *mask_bits = NULL;
- int i, j, n;
- POINT pt;
DWORD mask_width;
if (!GetObjectW( hbmImage, sizeof(bm), &bm )) return FALSE;
if (!GetDIBits( hdc, hbmMask, 0, height, mask_bits, mask_info, DIB_RGB_COLORS )) goto done;
}
- for (n = 0; n < count; n++)
- {
- int has_alpha = 0;
-
- imagelist_point_from_index( himl, pos + n, &pt );
-
- /* check if bitmap has an alpha channel */
- for (i = 0; i < height && !has_alpha; i++)
- for (j = n * width; j < (n + 1) * width; j++)
- if ((has_alpha = ((bits[i * bm.bmWidth + j] & 0xff000000) != 0))) break;
-
- if (!has_alpha) /* generate alpha channel from the mask */
- {
- for (i = 0; i < height; i++)
- for (j = n * width; j < (n + 1) * width; j++)
- if (!mask_bits || !((mask_bits[i * mask_width + j / 8] << (j % 8)) & 0x80))
- bits[i * bm.bmWidth + j] |= 0xff000000;
- else
- bits[i * bm.bmWidth + j] = 0;
- }
- else
- {
- himl->has_alpha[pos + n] = 1;
-
- if (mask_info && himl->hbmMask) /* generate the mask from the alpha channel */
- {
- for (i = 0; i < height; i++)
- for (j = n * width; j < (n + 1) * width; j++)
- if ((bits[i * bm.bmWidth + j] >> 24) > 25) /* more than 10% alpha */
- mask_bits[i * mask_width + j / 8] &= ~(0x80 >> (j % 8));
- else
- mask_bits[i * mask_width + j / 8] |= 0x80 >> (j % 8);
- }
- }
- StretchDIBits( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
- n * width, 0, width, height, bits, info, DIB_RGB_COLORS, SRCCOPY );
- if (mask_info)
- StretchDIBits( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
- n * width, 0, width, height, mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY );
- }
+ add_dib_bits( himl, pos, count, width, height, info, mask_info, bits, mask_bits );
ret = TRUE;
done:
SetBkColor (hdcBitmap, bkColor);
BitBlt (hdcMask, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcBitmap, 0, 0, SRCCOPY);
- SetBkColor(hdcBitmap, RGB(255,255,255));
-
/*
* Remove the background from the image
*
*
* Blt mode 0x220326 is NOTSRCAND
*/
- BitBlt(hdcBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMask, 0, 0, 0x220326);
+ if (bmp.bmBitsPixel > 8) /* NOTSRCAND can't work with palettes */
+ {
+ SetBkColor(hdcBitmap, RGB(255,255,255));
+ BitBlt(hdcBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMask, 0, 0, 0x220326);
+ }
DeleteDC(hdcBitmap);
DeleteDC(hdcMask);
cx = himlTrack->cx;
cy = himlTrack->cy;
- InternalDrag.himl = ImageList_Create (cx, cy, himlTrack->flags, 1, 1);
+ InternalDrag.himlNoCursor = InternalDrag.himl = ImageList_Create (cx, cy, himlTrack->flags, 1, 1);
if (InternalDrag.himl == NULL) {
WARN("Error creating drag image list!\n");
return FALSE;
if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl)))
return NULL;
- cGrow = (cGrow < 4) ? 4 : (cGrow + 3) & ~3;
+ 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;
/* 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;
/*************************************************************************
* ImageList_DrawEx [COMCTL32.@]
*
- * Draws an image and allows to use extended drawing features.
+ * Draws an image and allows using extended drawing features.
*
* PARAMS
* himl [I] handle to image list
/* generate alpha channel from the mask */
info->bmiHeader.biBitCount = 1;
info->bmiHeader.biSizeImage = width_bytes * cy;
+ info->bmiColors[0].rgbRed = 0;
+ info->bmiColors[0].rgbGreen = 0;
+ info->bmiColors[0].rgbBlue = 0;
+ info->bmiColors[0].rgbReserved = 0;
+ info->bmiColors[1].rgbRed = 0xff;
+ info->bmiColors[1].rgbGreen = 0xff;
+ info->bmiColors[1].rgbBlue = 0xff;
+ info->bmiColors[1].rgbReserved = 0;
if (!(mask = CreateDIBSection( himl->hdcMask, info, DIB_RGB_COLORS, &mask_bits, 0, 0 )))
goto done;
SelectObject( hdc, mask );
{
/* cleanup the InternalDrag struct */
InternalDrag.hwnd = 0;
+ if (InternalDrag.himl != InternalDrag.himlNoCursor)
+ ImageList_Destroy (InternalDrag.himlNoCursor);
ImageList_Destroy (InternalDrag.himl);
- InternalDrag.himl = 0;
+ InternalDrag.himlNoCursor = InternalDrag.himl = 0;
InternalDrag.x= 0;
InternalDrag.y= 0;
InternalDrag.dxHotspot = 0;
* RETURNS
* Success: The newly created image list. It contains a single image
* consisting of the second image merged with the first.
- * Failure: NULL, if either himl1 or himl2 are invalid.
+ * Failure: NULL, if either himl1 or himl2 is invalid.
*
* NOTES
* - The returned image list should be deleted by the caller using
* ImageList_Destroy() when it is no longer required.
- * - If either i1 or i2 are not valid image indices they will be treated
- * as a blank image.
+ * - If either i1 or i2 is not a valid image index, they will be treated
+ * as blank images.
*/
HIMAGELIST WINAPI
ImageList_Merge (HIMAGELIST himl1, INT i1, HIMAGELIST himl2, INT i2,
INT cxDst, cyDst;
INT xOff1, yOff1, xOff2, yOff2;
POINT pt1, pt2;
+ INT newFlags;
TRACE("(himl1=%p i1=%d himl2=%p i2=%d dx=%d dy=%d)\n", himl1, i1, himl2,
i2, dx, dy);
yOff2 = 0;
}
- himlDst = ImageList_Create (cxDst, cyDst, ILC_MASK | ILC_COLOR, 1, 1);
+ newFlags = (himl1->flags > himl2->flags ? himl1->flags : himl2->flags) & ILC_COLORDDB;
+ if (newFlags == ILC_COLORDDB && (himl1->flags & ILC_COLORDDB) == ILC_COLOR16)
+ newFlags = ILC_COLOR16; /* this is what native (at least v5) does, don't know why */
+ himlDst = ImageList_Create (cxDst, cyDst, ILC_MASK | newFlags, 1, 1);
if (himlDst)
{
BitBlt (himlDst->hdcImage, xOff1, yOff1, himl1->cx, himl1->cy, himl1->hdcImage, pt1.x, pt1.y, SRCCOPY);
if (i2 >= 0 && i2 < himl2->cCurImage)
{
- BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask , pt2.x, pt2.y, SRCAND);
- BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, pt2.x, pt2.y, SRCPAINT);
+ if (himl2->flags & ILC_MASK)
+ {
+ BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcMask , pt2.x, pt2.y, SRCAND);
+ BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, pt2.x, pt2.y, SRCPAINT);
+ }
+ else
+ BitBlt (himlDst->hdcImage, xOff2, yOff2, himl2->cx, himl2->cy, himl2->hdcImage, pt2.x, pt2.y, SRCCOPY);
}
/* copy mask */
}
-/***********************************************************************
- * DIB_GetDIBWidthBytes
- *
- * Return the width of a DIB bitmap in bytes. DIB bitmap data is 32-bit aligned.
- */
-static int DIB_GetDIBWidthBytes( int width, int depth )
-{
- int words;
-
- switch(depth)
- {
- case 1: words = (width + 31) / 32; break;
- case 4: words = (width + 7) / 8; break;
- case 8: words = (width + 3) / 4; break;
- case 15:
- case 16: words = (width + 1) / 2; break;
- case 24: words = (width * 3 + 3)/4; break;
-
- default:
- WARN("(%d): Unsupported depth\n", depth );
- /* fall through */
- case 32:
- words = width;
- break;
- }
- return 4 * words;
-}
-
-/***********************************************************************
- * DIB_GetDIBImageBytes
- *
- * Return the number of bytes used to hold the image in a DIB bitmap.
- */
-static int DIB_GetDIBImageBytes( int width, int height, int depth )
-{
- return DIB_GetDIBWidthBytes( width, depth ) * abs( height );
-}
-
-
/* helper for ImageList_Read, see comments below */
-static BOOL _read_bitmap(HDC hdcIml, LPSTREAM pstm)
+static void *read_bitmap(LPSTREAM pstm, BITMAPINFO *bmi)
{
BITMAPFILEHEADER bmfh;
int bitsperpixel, palspace;
- char bmi_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];
- LPBITMAPINFO bmi = (LPBITMAPINFO)bmi_buf;
- int result = FALSE;
- LPBYTE bits = NULL;
+ void *bits;
if (FAILED(IStream_Read ( pstm, &bmfh, sizeof(bmfh), NULL)))
- return FALSE;
+ return NULL;
if (bmfh.bfType != (('M'<<8)|'B'))
- return FALSE;
+ return NULL;
if (FAILED(IStream_Read ( pstm, &bmi->bmiHeader, sizeof(bmi->bmiHeader), NULL)))
- return FALSE;
+ return NULL;
if ((bmi->bmiHeader.biSize != sizeof(bmi->bmiHeader)))
- return FALSE;
+ return NULL;
TRACE("width %u, height %u, planes %u, bpp %u\n",
bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight,
else
palspace = 0;
- bmi->bmiHeader.biSizeImage = DIB_GetDIBImageBytes(bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, bitsperpixel);
+ bmi->bmiHeader.biSizeImage = get_dib_image_size( bmi );
/* read the palette right after the end of the bitmapinfoheader */
if (palspace && FAILED(IStream_Read(pstm, bmi->bmiColors, palspace, NULL)))
- goto error;
+ return NULL;
bits = Alloc(bmi->bmiHeader.biSizeImage);
- if (!bits)
- goto error;
- if (FAILED(IStream_Read(pstm, bits, bmi->bmiHeader.biSizeImage, NULL)))
- goto error;
-
- if (!StretchDIBits(hdcIml, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight,
- 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight,
- bits, bmi, DIB_RGB_COLORS, SRCCOPY))
- goto error;
- result = TRUE;
+ if (!bits) return NULL;
-error:
- Free(bits);
- return result;
+ if (FAILED(IStream_Read(pstm, bits, bmi->bmiHeader.biSizeImage, NULL)))
+ {
+ Free(bits);
+ return NULL;
+ }
+ return bits;
}
/*************************************************************************
*/
HIMAGELIST WINAPI ImageList_Read (LPSTREAM pstm)
{
+ char image_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];
+ char mask_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];
+ BITMAPINFO *image_info = (BITMAPINFO *)image_buf;
+ BITMAPINFO *mask_info = (BITMAPINFO *)mask_buf;
+ void *image_bits, *mask_bits = NULL;
ILHEAD ilHead;
HIMAGELIST himl;
- int i;
+ unsigned int i;
TRACE("%p\n", pstm);
if (!himl)
return NULL;
- if (!_read_bitmap(himl->hdcImage, pstm))
+ if (!(image_bits = read_bitmap(pstm, image_info)))
{
WARN("failed to read bitmap from stream\n");
return NULL;
}
if (ilHead.flags & ILC_MASK)
{
- if (!_read_bitmap(himl->hdcMask, pstm))
+ if (!(mask_bits = read_bitmap(pstm, mask_info)))
{
WARN("failed to read mask bitmap from stream\n");
return NULL;
}
}
+ else mask_info = NULL;
+
+ if (himl->has_alpha && image_info->bmiHeader.biBitCount == 32)
+ {
+ DWORD *ptr = image_bits;
+ BYTE *mask_ptr = mask_bits;
+ int stride = himl->cy * image_info->bmiHeader.biWidth;
+
+ if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
+ {
+ ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;
+ mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;
+ stride = -stride;
+ image_info->bmiHeader.biHeight = himl->cy;
+ }
+ else image_info->bmiHeader.biHeight = -himl->cy;
+
+ for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
+ {
+ add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),
+ himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr );
+ ptr += stride;
+ mask_ptr += stride / 8;
+ }
+ }
+ else
+ {
+ StretchDIBits( himl->hdcImage, 0, 0, image_info->bmiHeader.biWidth, image_info->bmiHeader.biHeight,
+ 0, 0, image_info->bmiHeader.biWidth, image_info->bmiHeader.biHeight,
+ image_bits, image_info, DIB_RGB_COLORS, SRCCOPY);
+ if (mask_info)
+ StretchDIBits( himl->hdcMask, 0, 0, mask_info->bmiHeader.biWidth, mask_info->bmiHeader.biHeight,
+ 0, 0, mask_info->bmiHeader.biWidth, mask_info->bmiHeader.biHeight,
+ mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY);
+ }
+ Free( image_bits );
+ Free( mask_bits );
himl->cCurImage = ilHead.cCurImage;
himl->cMaxImage = ilHead.cMaxImage;
return TRUE;
}
- himl->cMaxImage = himl->cInitial + himl->cGrow - 1;
+ himl->cMaxImage = himl->cGrow;
himl->cCurImage = 0;
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
himl->nOvlIdx[nCount] = -1;
+ if (himl->has_alpha)
+ {
+ HeapFree( GetProcessHeap(), 0, himl->has_alpha );
+ himl->has_alpha = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, himl->cMaxImage );
+ }
+
hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
SelectObject (himl->hdcImage, hbmNewImage);
DeleteObject (himl->hbmImage);
INT WINAPI
ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
{
- HDC hdcImage;
HICON hBestFitIcon;
ICONINFO ii;
BITMAP bmp;
if (!hBestFitIcon)
return -1;
- ret = GetIconInfo (hBestFitIcon, &ii);
- if (!ret) {
- DestroyIcon(hBestFitIcon);
- return -1;
- }
-
- ret = GetObjectW (ii.hbmMask, sizeof(BITMAP), &bmp);
- if (!ret) {
- ERR("couldn't get mask bitmap info\n");
- if (ii.hbmColor)
- DeleteObject (ii.hbmColor);
- if (ii.hbmMask)
- DeleteObject (ii.hbmMask);
- DestroyIcon(hBestFitIcon);
- return -1;
- }
-
if (nIndex == -1) {
- if (himl->cCurImage + 1 > himl->cMaxImage)
+ if (himl->cCurImage + 1 >= himl->cMaxImage)
IMAGELIST_InternalExpandBitmaps(himl, 1);
nIndex = himl->cCurImage;
himl->cCurImage++;
}
- hdcImage = CreateCompatibleDC (0);
- TRACE("hdcImage=%p\n", hdcImage);
- if (hdcImage == 0)
- ERR("invalid hdcImage!\n");
-
- if (himl->has_alpha)
+ if (himl->has_alpha && GetIconInfo (hBestFitIcon, &ii))
{
+ HDC hdcImage = CreateCompatibleDC( 0 );
+ GetObjectW (ii.hbmMask, sizeof(BITMAP), &bmp);
+
if (!ii.hbmColor)
{
UINT height = bmp.bmHeight / 2;
ret = add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, height, color, ii.hbmMask );
DeleteDC( hdcMask );
DeleteObject( color );
- if (ret) goto done;
}
- else if (add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight,
- ii.hbmColor, ii.hbmMask )) goto done;
+ else ret = add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight,
+ ii.hbmColor, ii.hbmMask );
+
+ DeleteDC( hdcImage );
+ DeleteObject (ii.hbmMask);
+ if (ii.hbmColor) DeleteObject (ii.hbmColor);
+ if (ret) goto done;
}
imagelist_point_from_index(himl, nIndex, &pt);
- SetTextColor(himl->hdcImage, RGB(0,0,0));
- SetBkColor (himl->hdcImage, RGB(255,255,255));
-
- if (ii.hbmColor)
+ if (himl->hbmMask)
{
- SelectObject (hdcImage, ii.hbmColor);
- StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
- if (himl->hbmMask)
- {
- SelectObject (hdcImage, ii.hbmMask);
- StretchBlt (himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
- }
+ DrawIconEx( himl->hdcImage, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_IMAGE );
+ PatBlt( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, WHITENESS );
+ DrawIconEx( himl->hdcMask, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_MASK );
}
else
{
- UINT height = bmp.bmHeight / 2;
- SelectObject (hdcImage, ii.hbmMask);
- StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, height, bmp.bmWidth, height, SRCCOPY);
- if (himl->hbmMask)
- StretchBlt (himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
- hdcImage, 0, 0, bmp.bmWidth, height, SRCCOPY);
+ COLORREF color = himl->clrBk != CLR_NONE ? himl->clrBk : comctl32_color.clrWindow;
+ HBRUSH brush = CreateSolidBrush( GetNearestColor( himl->hdcImage, color ));
+
+ SelectObject( himl->hdcImage, brush );
+ PatBlt( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, PATCOPY );
+ SelectObject( himl->hdcImage, GetStockObject(BLACK_BRUSH) );
+ DeleteObject( brush );
+ DrawIconEx( himl->hdcImage, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_NORMAL );
}
done:
DestroyIcon(hBestFitIcon);
- if (hdcImage)
- DeleteDC (hdcImage);
- if (ii.hbmColor)
- DeleteObject (ii.hbmColor);
- if (ii.hbmMask)
- DeleteObject (ii.hbmMask);
TRACE("Insert index = %d, himl->cCurImage = %d\n", nIndex, himl->cCurImage);
return nIndex;
visible = InternalDrag.bShow;
- himlTemp = ImageList_Merge (InternalDrag.himl, 0, himlDrag, iDrag,
+ himlTemp = ImageList_Merge (InternalDrag.himlNoCursor, 0, himlDrag, iDrag,
dxHotspot, dyHotspot);
if (visible) {
InternalDrag.hbmBg = 0;
}
- ImageList_Destroy (InternalDrag.himl);
+ if (InternalDrag.himl != InternalDrag.himlNoCursor)
+ ImageList_Destroy (InternalDrag.himl);
InternalDrag.himl = himlTemp;
if (visible) {
if (!is_valid(himl))
return FALSE;
- if (himl->cMaxImage > iImageCount)
- {
- himl->cCurImage = iImageCount;
- /* TODO: shrink the bitmap when cMaxImage-cCurImage>cGrow ? */
- return TRUE;
- }
- nNewCount = iImageCount + himl->cGrow;
+ nNewCount = iImageCount + 1;
nCopyCount = min(himl->cCurImage, iImageCount);
hdcBitmap = CreateCompatibleDC (0);
himl->hbmImage = hbmNewBitmap;
}
else
- ERR("Could not create new image bitmap !\n");
+ ERR("Could not create new image bitmap!\n");
if (himl->hbmMask)
{
if (!GetObjectW(hBitmap, sizeof(BITMAP), &bm))
return FALSE;
- bitCount = bm.bmBitsPixel == 1 ? 1 : 24;
- sizeImage = DIB_GetDIBImageBytes(bm.bmWidth, bm.bmHeight, bitCount);
+ bitCount = bm.bmBitsPixel;
+ sizeImage = get_dib_stride(bm.bmWidth, bitCount) * bm.bmHeight;
totalSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
- if(bitCount != 24)
+ if(bitCount <= 8)
totalSize += (1 << bitCount) * sizeof(RGBQUAD);
offBits = totalSize;
totalSize += sizeImage;
bmih->biWidth, bmih->biHeight,
bmih->biPlanes, bmih->biBitCount);
- if(bitCount == 1) {
- /* Hack. */
- LPBITMAPINFO inf = (LPBITMAPINFO)bmih;
- inf->bmiColors[0].rgbRed = inf->bmiColors[0].rgbGreen = inf->bmiColors[0].rgbBlue = 0;
- inf->bmiColors[1].rgbRed = inf->bmiColors[1].rgbGreen = inf->bmiColors[1].rgbBlue = 0xff;
- }
-
if(FAILED(IStream_Write(pstm, data, totalSize, NULL)))
goto failed;
if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR)
{
- VOID* bits;
- BITMAPINFO *bmi;
+ char buffer[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];
+ BITMAPINFO *bmi = (BITMAPINFO *)buffer;
TRACE("Creating DIBSection %d x %d, %d Bits per Pixel\n",
sz.cx, sz.cy, himl->uBitsPixel);
- if (himl->uBitsPixel <= ILC_COLOR8)
- {
- LPPALETTEENTRY pal;
- ULONG i, colors;
- BYTE temp;
-
- colors = 1 << himl->uBitsPixel;
- bmi = Alloc(sizeof(BITMAPINFOHEADER) +
- sizeof(PALETTEENTRY) * colors);
-
- pal = (LPPALETTEENTRY)bmi->bmiColors;
- GetPaletteEntries(GetStockObject(DEFAULT_PALETTE), 0, colors, pal);
-
- /* Swap colors returned by GetPaletteEntries so we can use them for
- * CreateDIBSection call. */
- for (i = 0; i < colors; i++)
- {
- temp = pal[i].peBlue;
- bmi->bmiColors[i].rgbRed = pal[i].peRed;
- bmi->bmiColors[i].rgbBlue = temp;
- }
- }
- else
- {
- bmi = Alloc(sizeof(BITMAPINFOHEADER));
- }
-
+ memset( buffer, 0, sizeof(buffer) );
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi->bmiHeader.biWidth = sz.cx;
bmi->bmiHeader.biHeight = sz.cy;
bmi->bmiHeader.biPlanes = 1;
bmi->bmiHeader.biBitCount = himl->uBitsPixel;
bmi->bmiHeader.biCompression = BI_RGB;
- bmi->bmiHeader.biSizeImage = 0;
- bmi->bmiHeader.biXPelsPerMeter = 0;
- bmi->bmiHeader.biYPelsPerMeter = 0;
- bmi->bmiHeader.biClrUsed = 0;
- bmi->bmiHeader.biClrImportant = 0;
-
- hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, &bits, 0, 0);
- Free (bmi);
+ if (himl->uBitsPixel <= ILC_COLOR8)
+ {
+ /* retrieve the default color map */
+ HBITMAP tmp = CreateBitmap( 1, 1, 1, 1, NULL );
+ GetDIBits( hdc, tmp, 0, 0, NULL, bmi, DIB_RGB_COLORS );
+ DeleteObject( tmp );
+ }
+ hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, NULL, 0, 0);
}
else /*if (ilc == ILC_COLORDDB)*/
{
*/
UINT WINAPI
-ImageList_SetColorTable (HIMAGELIST himl, UINT uStartIndex, UINT cEntries, CONST RGBQUAD * prgb)
+ImageList_SetColorTable(HIMAGELIST himl, UINT uStartIndex, UINT cEntries, const RGBQUAD *prgb)
{
return SetDIBColorTable(himl->hdcImage, uStartIndex, cEntries, prgb);
}
* IImageList implementation
*/
-static HRESULT WINAPI ImageListImpl_QueryInterface(IImageList *iface,
+static HRESULT WINAPI ImageListImpl_QueryInterface(IImageList2 *iface,
REFIID iid, void **ppv)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+
TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
if (!ppv) return E_INVALIDARG;
- if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IImageList, iid))
- *ppv = This;
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IImageList, iid) ||
+ IsEqualIID(&IID_IImageList2, iid))
+ {
+ *ppv = &imgl->IImageList2_iface;
+ }
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
- IUnknown_AddRef((IUnknown*)*ppv);
+ IImageList2_AddRef(iface);
return S_OK;
}
-static ULONG WINAPI ImageListImpl_AddRef(IImageList *iface)
+static ULONG WINAPI ImageListImpl_AddRef(IImageList2 *iface)
{
- HIMAGELIST This = (HIMAGELIST) iface;
- ULONG ref = InterlockedIncrement(&This->ref);
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ ULONG ref = InterlockedIncrement(&imgl->ref);
TRACE("(%p) refcount=%u\n", iface, ref);
return ref;
}
-static ULONG WINAPI ImageListImpl_Release(IImageList *iface)
+static ULONG WINAPI ImageListImpl_Release(IImageList2 *iface)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST This = impl_from_IImageList2(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) refcount=%u\n", iface, ref);
if (This->hbrBlend25) DeleteObject (This->hbrBlend25);
if (This->hbrBlend50) DeleteObject (This->hbrBlend50);
- This->lpVtbl = NULL;
+ This->IImageList2_iface.lpVtbl = NULL;
HeapFree(GetProcessHeap(), 0, This->has_alpha);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
}
-static HRESULT WINAPI ImageListImpl_Add(IImageList *iface, HBITMAP hbmImage,
+static HRESULT WINAPI ImageListImpl_Add(IImageList2 *iface, HBITMAP hbmImage,
HBITMAP hbmMask, int *pi)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
int ret;
if (!pi)
return E_FAIL;
- ret = ImageList_Add(This, hbmImage, hbmMask);
+ ret = ImageList_Add(imgl, hbmImage, hbmMask);
if (ret == -1)
return E_FAIL;
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_ReplaceIcon(IImageList *iface, int i,
+static HRESULT WINAPI ImageListImpl_ReplaceIcon(IImageList2 *iface, int i,
HICON hicon, int *pi)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
int ret;
if (!pi)
return E_FAIL;
- ret = ImageList_ReplaceIcon(This, i, hicon);
+ ret = ImageList_ReplaceIcon(imgl, i, hicon);
if (ret == -1)
return E_FAIL;
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_SetOverlayImage(IImageList *iface,
+static HRESULT WINAPI ImageListImpl_SetOverlayImage(IImageList2 *iface,
int iImage, int iOverlay)
{
- return ImageList_SetOverlayImage((HIMAGELIST) iface, iImage, iOverlay)
- ? S_OK : E_FAIL;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_SetOverlayImage(imgl, iImage, iOverlay) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_Replace(IImageList *iface, int i,
+static HRESULT WINAPI ImageListImpl_Replace(IImageList2 *iface, int i,
HBITMAP hbmImage, HBITMAP hbmMask)
{
- return ImageList_Replace((HIMAGELIST) iface, i, hbmImage, hbmMask) ? S_OK :
- E_FAIL;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_Replace(imgl, i, hbmImage, hbmMask) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_AddMasked(IImageList *iface, HBITMAP hbmImage,
+static HRESULT WINAPI ImageListImpl_AddMasked(IImageList2 *iface, HBITMAP hbmImage,
COLORREF crMask, int *pi)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
int ret;
if (!pi)
return E_FAIL;
- ret = ImageList_AddMasked(This, hbmImage, crMask);
+ ret = ImageList_AddMasked(imgl, hbmImage, crMask);
if (ret == -1)
return E_FAIL;
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_Draw(IImageList *iface,
+static HRESULT WINAPI ImageListImpl_Draw(IImageList2 *iface,
IMAGELISTDRAWPARAMS *pimldp)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
HIMAGELIST old_himl;
int ret;
/* As far as I can tell, Windows simply ignores the contents of pimldp->himl
so we shall simulate the same */
old_himl = pimldp->himl;
- pimldp->himl = This;
+ pimldp->himl = imgl;
ret = ImageList_DrawIndirect(pimldp);
return ret ? S_OK : E_INVALIDARG;
}
-static HRESULT WINAPI ImageListImpl_Remove(IImageList *iface, int i)
+static HRESULT WINAPI ImageListImpl_Remove(IImageList2 *iface, int i)
{
- return (ImageList_Remove((HIMAGELIST) iface, i) == 0) ? E_INVALIDARG : S_OK;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return (ImageList_Remove(imgl, i) == 0) ? E_INVALIDARG : S_OK;
}
-static HRESULT WINAPI ImageListImpl_GetIcon(IImageList *iface, int i, UINT flags,
+static HRESULT WINAPI ImageListImpl_GetIcon(IImageList2 *iface, int i, UINT flags,
HICON *picon)
{
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
HICON hIcon;
if (!picon)
return E_FAIL;
- hIcon = ImageList_GetIcon((HIMAGELIST) iface, i, flags);
+ hIcon = ImageList_GetIcon(imgl, i, flags);
if (hIcon == NULL)
return E_FAIL;
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_GetImageInfo(IImageList *iface, int i,
+static HRESULT WINAPI ImageListImpl_GetImageInfo(IImageList2 *iface, int i,
IMAGEINFO *pImageInfo)
{
- return ImageList_GetImageInfo((HIMAGELIST) iface, i, pImageInfo) ? S_OK : E_FAIL;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_GetImageInfo(imgl, i, pImageInfo) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_Copy(IImageList *iface, int iDst,
- IUnknown *punkSrc, int iSrc, UINT uFlags)
+static HRESULT WINAPI ImageListImpl_Copy(IImageList2 *iface, int dst_index,
+ IUnknown *unk_src, int src_index, UINT flags)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
IImageList *src = NULL;
HRESULT ret;
- if (!punkSrc)
+ if (!unk_src)
return E_FAIL;
/* TODO: Add test for IID_ImageList2 too */
- if (FAILED(IImageList_QueryInterface(punkSrc, &IID_IImageList,
+ if (FAILED(IUnknown_QueryInterface(unk_src, &IID_IImageList,
(void **) &src)))
return E_FAIL;
- if (ImageList_Copy(This, iDst, (HIMAGELIST) src, iSrc, uFlags))
+ if (ImageList_Copy(imgl, dst_index, (HIMAGELIST) src, src_index, flags))
ret = S_OK;
else
ret = E_FAIL;
return ret;
}
-static HRESULT WINAPI ImageListImpl_Merge(IImageList *iface, int i1,
+static HRESULT WINAPI ImageListImpl_Merge(IImageList2 *iface, int i1,
IUnknown *punk2, int i2, int dx, int dy, REFIID riid, void **ppv)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
IImageList *iml2 = NULL;
- HIMAGELIST hNew;
+ HIMAGELIST merged;
HRESULT ret = E_FAIL;
TRACE("(%p)->(%d %p %d %d %d %s %p)\n", iface, i1, punk2, i2, dx, dy, debugstr_guid(riid), ppv);
/* TODO: Add test for IID_ImageList2 too */
- if (FAILED(IImageList_QueryInterface(punk2, &IID_IImageList,
+ if (FAILED(IUnknown_QueryInterface(punk2, &IID_IImageList,
(void **) &iml2)))
return E_FAIL;
- hNew = ImageList_Merge(This, i1, (HIMAGELIST) iml2, i2, dx, dy);
+ merged = ImageList_Merge(imgl, i1, (HIMAGELIST) iml2, i2, dx, dy);
/* Get the interface for the new image list */
- if (hNew)
+ if (merged)
{
- IImageList *imerge = (IImageList*)hNew;
-
- ret = HIMAGELIST_QueryInterface(hNew, riid, ppv);
- IImageList_Release(imerge);
+ ret = HIMAGELIST_QueryInterface(merged, riid, ppv);
+ ImageList_Destroy(merged);
}
IImageList_Release(iml2);
return ret;
}
-static HRESULT WINAPI ImageListImpl_Clone(IImageList *iface, REFIID riid, void **ppv)
+static HRESULT WINAPI ImageListImpl_Clone(IImageList2 *iface, REFIID riid, void **ppv)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
HIMAGELIST clone;
HRESULT ret = E_FAIL;
TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
- clone = ImageList_Duplicate(This);
+ clone = ImageList_Duplicate(imgl);
/* Get the interface for the new image list */
if (clone)
{
- IImageList *iclone = (IImageList*)clone;
-
ret = HIMAGELIST_QueryInterface(clone, riid, ppv);
- IImageList_Release(iclone);
+ ImageList_Destroy(clone);
}
return ret;
}
-static HRESULT WINAPI ImageListImpl_GetImageRect(IImageList *iface, int i,
+static HRESULT WINAPI ImageListImpl_GetImageRect(IImageList2 *iface, int i,
RECT *prc)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
IMAGEINFO info;
if (!prc)
return E_FAIL;
- if (!ImageList_GetImageInfo(This, i, &info))
+ if (!ImageList_GetImageInfo(imgl, i, &info))
return E_FAIL;
return CopyRect(prc, &info.rcImage) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_GetIconSize(IImageList *iface, int *cx,
+static HRESULT WINAPI ImageListImpl_GetIconSize(IImageList2 *iface, int *cx,
int *cy)
{
- HIMAGELIST This = (HIMAGELIST) iface;
-
- return ImageList_GetIconSize(This, cx, cy) ? S_OK : E_INVALIDARG;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_GetIconSize(imgl, cx, cy) ? S_OK : E_INVALIDARG;
}
-static HRESULT WINAPI ImageListImpl_SetIconSize(IImageList *iface, int cx,
+static HRESULT WINAPI ImageListImpl_SetIconSize(IImageList2 *iface, int cx,
int cy)
{
- return ImageList_SetIconSize((HIMAGELIST) iface, cx, cy) ? S_OK : E_FAIL;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_SetIconSize(imgl, cx, cy) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_GetImageCount(IImageList *iface, int *pi)
+static HRESULT WINAPI ImageListImpl_GetImageCount(IImageList2 *iface, int *pi)
{
- *pi = ImageList_GetImageCount((HIMAGELIST) iface);
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ *pi = ImageList_GetImageCount(imgl);
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_SetImageCount(IImageList *iface,
- UINT uNewCount)
+static HRESULT WINAPI ImageListImpl_SetImageCount(IImageList2 *iface, UINT count)
{
- return ImageList_SetImageCount((HIMAGELIST) iface, uNewCount) ? S_OK : E_FAIL;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_SetImageCount(imgl, count) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_SetBkColor(IImageList *iface, COLORREF clrBk,
+static HRESULT WINAPI ImageListImpl_SetBkColor(IImageList2 *iface, COLORREF clrBk,
COLORREF *pclr)
{
- *pclr = ImageList_SetBkColor((HIMAGELIST) iface, clrBk);
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ *pclr = ImageList_SetBkColor(imgl, clrBk);
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_GetBkColor(IImageList *iface, COLORREF *pclr)
+static HRESULT WINAPI ImageListImpl_GetBkColor(IImageList2 *iface, COLORREF *pclr)
{
- *pclr = ImageList_GetBkColor((HIMAGELIST) iface);
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ *pclr = ImageList_GetBkColor(imgl);
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_BeginDrag(IImageList *iface, int iTrack,
+static HRESULT WINAPI ImageListImpl_BeginDrag(IImageList2 *iface, int iTrack,
int dxHotspot, int dyHotspot)
{
- return ImageList_BeginDrag((HIMAGELIST) iface, iTrack, dxHotspot, dyHotspot) ? S_OK : E_FAIL;
+ HIMAGELIST imgl = impl_from_IImageList2(iface);
+ return ImageList_BeginDrag(imgl, iTrack, dxHotspot, dyHotspot) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_EndDrag(IImageList *iface)
+static HRESULT WINAPI ImageListImpl_EndDrag(IImageList2 *iface)
{
ImageList_EndDrag();
return S_OK;
}
-static HRESULT WINAPI ImageListImpl_DragEnter(IImageList *iface, HWND hwndLock,
+static HRESULT WINAPI ImageListImpl_DragEnter(IImageList2 *iface, HWND hwndLock,
int x, int y)
{
return ImageList_DragEnter(hwndLock, x, y) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_DragLeave(IImageList *iface, HWND hwndLock)
+static HRESULT WINAPI ImageListImpl_DragLeave(IImageList2 *iface, HWND hwndLock)
{
return ImageList_DragLeave(hwndLock) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_DragMove(IImageList *iface, int x, int y)
+static HRESULT WINAPI ImageListImpl_DragMove(IImageList2 *iface, int x, int y)
{
return ImageList_DragMove(x, y) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_SetDragCursorImage(IImageList *iface,
+static HRESULT WINAPI ImageListImpl_SetDragCursorImage(IImageList2 *iface,
IUnknown *punk, int iDrag, int dxHotspot, int dyHotspot)
{
IImageList *iml2 = NULL;
return E_FAIL;
/* TODO: Add test for IID_ImageList2 too */
- if (FAILED(IImageList_QueryInterface(punk, &IID_IImageList,
+ if (FAILED(IUnknown_QueryInterface(punk, &IID_IImageList,
(void **) &iml2)))
return E_FAIL;
return ret ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_DragShowNolock(IImageList *iface, BOOL fShow)
+static HRESULT WINAPI ImageListImpl_DragShowNolock(IImageList2 *iface, BOOL fShow)
{
return ImageList_DragShowNolock(fShow) ? S_OK : E_FAIL;
}
-static HRESULT WINAPI ImageListImpl_GetDragImage(IImageList *iface, POINT *ppt,
+static HRESULT WINAPI ImageListImpl_GetDragImage(IImageList2 *iface, POINT *ppt,
POINT *pptHotspot, REFIID riid, PVOID *ppv)
{
HRESULT ret = E_FAIL;
return ret;
}
-static HRESULT WINAPI ImageListImpl_GetItemFlags(IImageList *iface, int i,
+static HRESULT WINAPI ImageListImpl_GetItemFlags(IImageList2 *iface, int i,
DWORD *dwFlags)
{
FIXME("STUB: %p %d %p\n", iface, i, dwFlags);
return E_NOTIMPL;
}
-static HRESULT WINAPI ImageListImpl_GetOverlayImage(IImageList *iface, int iOverlay,
+static HRESULT WINAPI ImageListImpl_GetOverlayImage(IImageList2 *iface, int iOverlay,
int *piIndex)
{
- HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST This = impl_from_IImageList2(iface);
int i;
if ((iOverlay < 0) || (iOverlay > This->cCurImage))
return E_FAIL;
}
+static HRESULT WINAPI ImageListImpl_Resize(IImageList2 *iface, INT cx, INT cy)
+{
+ FIXME("(%p)->(%d %d): stub\n", iface, cx, cy);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetOriginalSize(IImageList2 *iface, INT image, DWORD flags, INT *cx, INT *cy)
+{
+ FIXME("(%p)->(%d %x %p %p): stub\n", iface, image, flags, cx, cy);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_SetOriginalSize(IImageList2 *iface, INT image, INT cx, INT cy)
+{
+ FIXME("(%p)->(%d %d %d): stub\n", iface, image, cx, cy);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_SetCallback(IImageList2 *iface, IUnknown *callback)
+{
+ FIXME("(%p)->(%p): stub\n", iface, callback);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetCallback(IImageList2 *iface, REFIID riid, void **ppv)
+{
+ FIXME("(%p)->(%s %p): stub\n", iface, debugstr_guid(riid), ppv);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_ForceImagePresent(IImageList2 *iface, INT image, DWORD flags)
+{
+ FIXME("(%p)->(%d %x): stub\n", iface, image, flags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_DiscardImages(IImageList2 *iface, INT first_image, INT last_image, DWORD flags)
+{
+ FIXME("(%p)->(%d %d %x): stub\n", iface, first_image, last_image, flags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_PreloadImages(IImageList2 *iface, IMAGELISTDRAWPARAMS *params)
+{
+ FIXME("(%p)->(%p): stub\n", iface, params);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetStatistics(IImageList2 *iface, IMAGELISTSTATS *stats)
+{
+ FIXME("(%p)->(%p): stub\n", iface, stats);
+ return E_NOTIMPL;
+}
+
+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;
+}
+
+static HRESULT WINAPI ImageListImpl_Replace2(IImageList2 *iface, INT i, HBITMAP image, HBITMAP mask, IUnknown *unk, DWORD flags)
+{
+ FIXME("(%p)->(%d %p %p %p %x): stub\n", iface, i, image, mask, unk, flags);
+ return E_NOTIMPL;
+}
-static const IImageListVtbl ImageListImpl_Vtbl = {
+static HRESULT WINAPI ImageListImpl_ReplaceFromImageList(IImageList2 *iface, INT i, IImageList *imagelist, INT src,
+ IUnknown *unk, DWORD flags)
+{
+ FIXME("(%p)->(%d %p %d %p %x): stub\n", iface, i, imagelist, src, unk, flags);
+ return E_NOTIMPL;
+}
+
+static const IImageList2Vtbl ImageListImpl_Vtbl = {
ImageListImpl_QueryInterface,
ImageListImpl_AddRef,
ImageListImpl_Release,
ImageListImpl_DragShowNolock,
ImageListImpl_GetDragImage,
ImageListImpl_GetItemFlags,
- ImageListImpl_GetOverlayImage
+ ImageListImpl_GetOverlayImage,
+ ImageListImpl_Resize,
+ ImageListImpl_GetOriginalSize,
+ ImageListImpl_SetOriginalSize,
+ ImageListImpl_SetCallback,
+ ImageListImpl_GetCallback,
+ ImageListImpl_ForceImagePresent,
+ ImageListImpl_DiscardImages,
+ ImageListImpl_PreloadImages,
+ ImageListImpl_GetStatistics,
+ ImageListImpl_Initialize,
+ ImageListImpl_Replace2,
+ ImageListImpl_ReplaceFromImageList
};
-static inline BOOL is_valid(HIMAGELIST himl)
+static BOOL is_valid(HIMAGELIST himl)
{
- return himl && himl->lpVtbl == &ImageListImpl_Vtbl;
+ BOOL valid;
+ __TRY
+ {
+ valid = himl && himl->IImageList2_iface.lpVtbl == &ImageListImpl_Vtbl;
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ valid = FALSE;
+ }
+ __ENDTRY
+ return valid;
}
/*************************************************************************
HIMAGELIST_QueryInterface (HIMAGELIST himl, REFIID riid, void **ppv)
{
TRACE("(%p,%s,%p)\n", himl, debugstr_guid(riid), ppv);
- return IImageList_QueryInterface((IImageList *) himl, riid, ppv);
+ return IImageList2_QueryInterface((IImageList2 *) himl, riid, ppv);
}
static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv)
This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct _IMAGELIST));
if (!This) return E_OUTOFMEMORY;
- This->lpVtbl = &ImageListImpl_Vtbl;
+ This->IImageList2_iface.lpVtbl = &ImageListImpl_Vtbl;
This->ref = 1;
- ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
- IUnknown_Release((IUnknown*)This);
+ ret = IImageList2_QueryInterface(&This->IImageList2_iface, iid, ppv);
+ IImageList2_Release(&This->IImageList2_iface);
return ret;
}