Commit 373a02c6 authored by Bruno Jesus's avatar Bruno Jesus Committed by Alexandre Julliard

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

parent 7b8929e0
...@@ -1567,8 +1567,16 @@ static LRESULT DecompressGetFormat(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn, ...@@ -1567,8 +1567,16 @@ static LRESULT DecompressGetFormat(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
size = lpbiIn->biSize; size = lpbiIn->biSize;
if (lpbiIn->biBitCount <= 8) if (lpbiIn->biBitCount <= 8) {
size += lpbiIn->biClrUsed * sizeof(RGBQUAD); int colors;
if (lpbiIn->biClrUsed == 0)
colors = 1 << lpbiIn->biBitCount;
else
colors = lpbiIn->biClrUsed;
size += colors * sizeof(RGBQUAD);
}
if (lpbiOut != NULL) { if (lpbiOut != NULL) {
memcpy(lpbiOut, lpbiIn, size); memcpy(lpbiOut, lpbiIn, size);
...@@ -1647,27 +1655,33 @@ static LRESULT DecompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn, ...@@ -1647,27 +1655,33 @@ static LRESULT DecompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
if (lpbiIn->biCompression != BI_RGB) 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); rgbIn = (const RGBQUAD*)((const BYTE*)lpbiIn + lpbiIn->biSize);
rgbOut = (const RGBQUAD*)((const BYTE*)lpbiOut + lpbiOut->biSize); rgbOut = (const RGBQUAD*)((const BYTE*)lpbiOut + lpbiOut->biSize);
switch (lpbiOut->biBitCount) { switch (lpbiOut->biBitCount) {
case 4: case 4:
case 8: case 8:
pi->palette_map = LocalAlloc(LPTR, lpbiIn->biClrUsed); pi->palette_map = LocalAlloc(LPTR, colors);
if (pi->palette_map == NULL) if (pi->palette_map == NULL)
return ICERR_MEMORY; return ICERR_MEMORY;
for (i = 0; i < lpbiIn->biClrUsed; i++) { for (i = 0; i < colors; i++)
pi->palette_map[i] = MSRLE32_GetNearestPaletteIndex(lpbiOut->biClrUsed, rgbOut, rgbIn[i]); pi->palette_map[i] = MSRLE32_GetNearestPaletteIndex(colors, rgbOut, rgbIn[i]);
}
break; break;
case 15: case 15:
case 16: case 16:
pi->palette_map = LocalAlloc(LPTR, lpbiIn->biClrUsed * 2); pi->palette_map = LocalAlloc(LPTR, colors * 2);
if (pi->palette_map == NULL) if (pi->palette_map == NULL)
return ICERR_MEMORY; return ICERR_MEMORY;
for (i = 0; i < lpbiIn->biClrUsed; i++) { for (i = 0; i < colors; i++) {
WORD color; WORD color;
if (lpbiOut->biBitCount == 15) if (lpbiOut->biBitCount == 15)
...@@ -1683,10 +1697,10 @@ static LRESULT DecompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn, ...@@ -1683,10 +1697,10 @@ static LRESULT DecompressBegin(CodecInfo *pi, LPCBITMAPINFOHEADER lpbiIn,
break; break;
case 24: case 24:
case 32: case 32:
pi->palette_map = LocalAlloc(LPTR, lpbiIn->biClrUsed * sizeof(RGBQUAD)); pi->palette_map = LocalAlloc(LPTR, colors * sizeof(RGBQUAD));
if (pi->palette_map == NULL) if (pi->palette_map == NULL)
return ICERR_MEMORY; return ICERR_MEMORY;
memcpy(pi->palette_map, rgbIn, lpbiIn->biClrUsed * sizeof(RGBQUAD)); memcpy(pi->palette_map, rgbIn, colors * sizeof(RGBQUAD));
break; break;
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment