Vincent Povirk : windowscodecs: Implement CopyPixels for 24-bit ICO icons.

Alexandre Julliard julliard at winehq.org
Fri Aug 21 09:32:33 CDT 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Aug 20 14:28:04 2009 -0500

windowscodecs: Implement CopyPixels for 24-bit ICO icons.

---

 dlls/windowscodecs/icoformat.c |   51 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/dlls/windowscodecs/icoformat.c b/dlls/windowscodecs/icoformat.c
index cb545a1..a6c7af3 100644
--- a/dlls/windowscodecs/icoformat.c
+++ b/dlls/windowscodecs/icoformat.c
@@ -249,6 +249,57 @@ static HRESULT IcoFrameDecode_ReadPixels(IcoFrameDecode *This)
         HeapFree(GetProcessHeap(), 0, tempdata);
         break;
     }
+    case 24:
+    {
+        UINT xorBytesPerRow = (width*3+3)/4*4;
+        UINT xorBytes = xorBytesPerRow * height;
+        INT xorStride;
+        BYTE *xorRow;
+        BYTE *bitsRow;
+        UINT x, y;
+
+        tempdata = HeapAlloc(GetProcessHeap(), 0, xorBytes);
+        if (!tempdata)
+        {
+            hr = E_OUTOFMEMORY;
+            goto fail;
+        }
+
+        hr = IStream_Read(This->parent->stream, tempdata, xorBytes, &bytesread);
+        if (FAILED(hr) || bytesread != xorBytes) goto fail;
+
+        if (bih.biHeight > 0) /* bottom-up DIB */
+        {
+            xorStride = -xorBytesPerRow;
+            xorRow = tempdata + (height-1)*xorBytesPerRow;
+        }
+        else /* top-down DIB */
+        {
+            xorStride = xorBytesPerRow;
+            xorRow = tempdata;
+        }
+
+        bits = HeapAlloc(GetProcessHeap(), 0, bitsSize);
+
+        /* copy BGR->BGRA */
+        bitsRow = bits;
+        for (y=0; y<height; y++) {
+            BYTE *xorByte=xorRow;
+            BYTE *bitsByte=bitsRow;
+            for (x=0; x<width; x++)
+            {
+                *bitsByte++ = *xorByte++; /* blue */
+                *bitsByte++ = *xorByte++; /* green */
+                *bitsByte++ = *xorByte++; /* red */
+                bitsByte++; /* alpha */
+            }
+            xorRow += xorStride;
+            bitsRow += bitsStride;
+        }
+
+        HeapFree(GetProcessHeap(), 0, tempdata);
+        break;
+    }
     default:
         FIXME("unsupported bitcount: %u\n", This->entry.wBitCount);
         goto fail;




More information about the wine-cvs mailing list