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

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 16 11:36:40 CDT 2016


Module: wine
Branch: master
Commit: 373a02c64169d4fc039a93153b66987057fee553
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=373a02c64169d4fc039a93153b66987057fee553

Author: Bruno Jesus <00cpxxx at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
     };
   }




More information about the wine-cvs mailing list