From 28b802b229e151568687593c7eeae84085de9022 Mon Sep 17 00:00:00 2001 From: Denis Malikov Date: Fri, 15 Jun 2018 22:58:48 +0700 Subject: [PATCH] [COMCTL32] fix version number reading/writing image lists and counting pointers for mixing image & mask --- dll/win32/comctl32/imagelist.c | 40 ++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/dll/win32/comctl32/imagelist.c b/dll/win32/comctl32/imagelist.c index 8d74aac6ba6..5692af16ae8 100644 --- a/dll/win32/comctl32/imagelist.c +++ b/dll/win32/comctl32/imagelist.c @@ -112,11 +112,15 @@ struct _IMAGELIST BOOL color_table_set; LONG ref; /* reference count */ +#ifdef __REACTOS__ + USHORT usVersion; /* hack for IL from stream. Keep version here */ +#endif }; #define IMAGELIST_MAGIC 0x53414D58 #ifdef __REACTOS__ #define IMAGELIST_MAGIC_DESTROYED 0x44454144 +#define IMAGELIST_VERSION 0x101 #endif /* Header used by ImageList_Read() and ImageList_Write() */ @@ -841,6 +845,9 @@ ImageList_Create (INT cx, INT cy, UINT flags, himl->clrFg = CLR_DEFAULT; himl->clrBk = CLR_NONE; himl->color_table_set = FALSE; +#ifdef __REACTOS__ + himl->usVersion = 0; +#endif /* initialize overlay mask indices */ for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) @@ -2477,7 +2484,13 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm) return NULL; if (ilHead.usMagic != (('L' << 8) | 'I')) return NULL; +#ifdef __REACTOS__ + if (ilHead.usVersion != IMAGELIST_VERSION && + ilHead.usVersion != 0x600 && /* XP/2003 version */ + ilHead.usVersion != 0x620) /* Vista/7 version */ +#else if (ilHead.usVersion != 0x101) /* probably version? */ +#endif return NULL; TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n", @@ -2487,6 +2500,11 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm) if (!himl) return NULL; +#ifdef __REACTOS__ + /* keep version from stream */ + himl->usVersion = ilHead.usVersion; +#endif + if (!(image_bits = read_bitmap(pstm, image_info))) { WARN("failed to read bitmap from stream\n"); @@ -2506,17 +2524,34 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm) { DWORD *ptr = image_bits; BYTE *mask_ptr = mask_bits; +#ifdef __REACTOS__ + int stride = himl->cy * (ilHead.usVersion != IMAGELIST_VERSION ? himl->cx : image_info->bmiHeader.biWidth); + int image_step = ilHead.usVersion != IMAGELIST_VERSION ? 1 : TILE_COUNT; + int mask_step = ilHead.usVersion != IMAGELIST_VERSION ? 4 : 8; +#else int stride = himl->cy * image_info->bmiHeader.biWidth; - +#endif if (image_info->bmiHeader.biHeight > 0) /* bottom-up */ { ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride; +#ifdef __REACTOS__ + mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / mask_step; +#else mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8; +#endif stride = -stride; image_info->bmiHeader.biHeight = himl->cy; } else image_info->bmiHeader.biHeight = -himl->cy; - +#ifdef __REACTOS__ + for (i = 0; i < ilHead.cCurImage; i += image_step) + { + add_dib_bits(himl, i, min(ilHead.cCurImage - i, image_step), + himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr); + ptr += stride; + mask_ptr += stride / mask_step; + } +#else for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT) { add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ), @@ -2524,6 +2559,7 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm) ptr += stride; mask_ptr += stride / 8; } +#endif } else {