mirror of
https://github.com/reactos/wine.git
synced 2025-02-12 07:32:23 +00:00
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:
parent
7b8929e0f5
commit
373a02c641
@ -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,
|
|||||||
|
|
||||||
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,
|
|||||||
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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user