mirror of
https://github.com/reactos/reactos.git
synced 2025-02-28 19:32:59 +00:00
[COMCTL32] fix version number reading/writing image lists and counting pointers for mixing image & mask
This commit is contained in:
parent
e4216bd015
commit
28b802b229
1 changed files with 38 additions and 2 deletions
|
@ -112,11 +112,15 @@ struct _IMAGELIST
|
||||||
BOOL color_table_set;
|
BOOL color_table_set;
|
||||||
|
|
||||||
LONG ref; /* reference count */
|
LONG ref; /* reference count */
|
||||||
|
#ifdef __REACTOS__
|
||||||
|
USHORT usVersion; /* hack for IL from stream. Keep version here */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IMAGELIST_MAGIC 0x53414D58
|
#define IMAGELIST_MAGIC 0x53414D58
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
#define IMAGELIST_MAGIC_DESTROYED 0x44454144
|
#define IMAGELIST_MAGIC_DESTROYED 0x44454144
|
||||||
|
#define IMAGELIST_VERSION 0x101
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Header used by ImageList_Read() and ImageList_Write() */
|
/* 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->clrFg = CLR_DEFAULT;
|
||||||
himl->clrBk = CLR_NONE;
|
himl->clrBk = CLR_NONE;
|
||||||
himl->color_table_set = FALSE;
|
himl->color_table_set = FALSE;
|
||||||
|
#ifdef __REACTOS__
|
||||||
|
himl->usVersion = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* initialize overlay mask indices */
|
/* initialize overlay mask indices */
|
||||||
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
|
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
|
||||||
|
@ -2477,7 +2484,13 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (ilHead.usMagic != (('L' << 8) | 'I'))
|
if (ilHead.usMagic != (('L' << 8) | 'I'))
|
||||||
return NULL;
|
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? */
|
if (ilHead.usVersion != 0x101) /* probably version? */
|
||||||
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",
|
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)
|
if (!himl)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#ifdef __REACTOS__
|
||||||
|
/* keep version from stream */
|
||||||
|
himl->usVersion = ilHead.usVersion;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!(image_bits = read_bitmap(pstm, image_info)))
|
if (!(image_bits = read_bitmap(pstm, image_info)))
|
||||||
{
|
{
|
||||||
WARN("failed to read bitmap from stream\n");
|
WARN("failed to read bitmap from stream\n");
|
||||||
|
@ -2506,17 +2524,34 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
|
||||||
{
|
{
|
||||||
DWORD *ptr = image_bits;
|
DWORD *ptr = image_bits;
|
||||||
BYTE *mask_ptr = mask_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;
|
int stride = himl->cy * image_info->bmiHeader.biWidth;
|
||||||
|
#endif
|
||||||
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
|
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
|
||||||
{
|
{
|
||||||
ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;
|
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;
|
mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;
|
||||||
|
#endif
|
||||||
stride = -stride;
|
stride = -stride;
|
||||||
image_info->bmiHeader.biHeight = himl->cy;
|
image_info->bmiHeader.biHeight = himl->cy;
|
||||||
}
|
}
|
||||||
else 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)
|
for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
|
||||||
{
|
{
|
||||||
add_dib_bits( himl, i, min( 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;
|
ptr += stride;
|
||||||
mask_ptr += stride / 8;
|
mask_ptr += stride / 8;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue