msrle32: Use the correct number of colors when biClrUsed = 0.

Signed-off-by: Bruno Jesus <00cpxxx@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Bruno Jesus 2016-03-16 01:14:11 +08:00 committed by Alexandre Julliard
parent 7b8929e0f5
commit 373a02c641
1 changed files with 24 additions and 10 deletions

View File

@ -1567,8 +1567,16 @@ static LRESULT DecompressGetFormat(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
size = lpbiIn->biSize;
if (lpbiIn->biBitCount <= 8)
size += lpbiIn->biClrUsed * sizeof(RGBQUAD);
if (lpbiIn->biBitCount <= 8) {
int colors;
if (lpbiIn->biClrUsed == 0)
colors = 1 << lpbiIn->biBitCount;
else
colors = lpbiIn->biClrUsed;
size += colors * sizeof(RGBQUAD);
}
if (lpbiOut != NULL) {
memcpy(lpbiOut, lpbiIn, size);
@ -1647,27 +1655,33 @@ static LRESULT DecompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
if (lpbiIn->biCompression != BI_RGB)
{
int colors;
if (lpbiIn->biBitCount <= 8 && lpbiIn->biClrUsed == 0)
colors = 1 << lpbiIn->biBitCount;
else
colors = lpbiIn->biClrUsed;
rgbIn = (const RGBQUAD*)((const BYTE*)lpbiIn + lpbiIn->biSize);
rgbOut = (const RGBQUAD*)((const BYTE*)lpbiOut + lpbiOut->biSize);
switch (lpbiOut->biBitCount) {
case 4:
case 8:
pi->palette_map = LocalAlloc(LPTR, lpbiIn->biClrUsed);
pi->palette_map = LocalAlloc(LPTR, colors);
if (pi->palette_map == NULL)
return ICERR_MEMORY;
for (i = 0; i < lpbiIn->biClrUsed; i++) {
pi->palette_map[i] = MSRLE32_GetNearestPaletteIndex(lpbiOut->biClrUsed, rgbOut, rgbIn[i]);
}
for (i = 0; i < colors; i++)
pi->palette_map[i] = MSRLE32_GetNearestPaletteIndex(colors, rgbOut, rgbIn[i]);
break;
case 15:
case 16:
pi->palette_map = LocalAlloc(LPTR, lpbiIn->biClrUsed * 2);
pi->palette_map = LocalAlloc(LPTR, colors * 2);
if (pi->palette_map == NULL)
return ICERR_MEMORY;
for (i = 0; i < lpbiIn->biClrUsed; i++) {
for (i = 0; i < colors; i++) {
WORD color;
if (lpbiOut->biBitCount == 15)
@ -1683,10 +1697,10 @@ static LRESULT DecompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
break;
case 24:
case 32:
pi->palette_map = LocalAlloc(LPTR, lpbiIn->biClrUsed * sizeof(RGBQUAD));
pi->palette_map = LocalAlloc(LPTR, colors * sizeof(RGBQUAD));
if (pi->palette_map == NULL)
return ICERR_MEMORY;
memcpy(pi->palette_map, rgbIn, lpbiIn->biClrUsed * sizeof(RGBQUAD));
memcpy(pi->palette_map, rgbIn, colors * sizeof(RGBQUAD));
break;
};
}