Module: wine Branch: master Commit: 373a02c64169d4fc039a93153b66987057fee553 URL: http://source.winehq.org/git/wine.git/?a=commit;h=373a02c64169d4fc039a93153b...
Author: Bruno Jesus 00cpxxx@gmail.com Date: Wed Mar 16 01:14:11 2016 +0800
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
---
dlls/msrle32/msrle32.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)
diff --git a/dlls/msrle32/msrle32.c b/dlls/msrle32/msrle32.c index 2682812..6688040 100644 --- a/dlls/msrle32/msrle32.c +++ b/dlls/msrle32/msrle32.c @@ -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; }; }