From c8be02d311d1fe7df473715350770bb2e9000784 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 20 Aug 2009 15:10:10 -0500 Subject: [PATCH] windowscodecs: implement CopyPixels for 32-bit ICO icons --- dlls/windowscodecs/icoformat.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-) diff --git a/dlls/windowscodecs/icoformat.c b/dlls/windowscodecs/icoformat.c index d499146..ab30ab0 100644 --- a/dlls/windowscodecs/icoformat.c +++ b/dlls/windowscodecs/icoformat.c @@ -406,6 +406,38 @@ static HRESULT IcoFrameDecode_ReadPixels(IcoFrameDecode *This) HeapFree(GetProcessHeap(), 0, tempdata); break; } + case 32: + { + UINT xorBytesPerRow = width*4; + UINT xorBytes = xorBytesPerRow * height; + + bits = HeapAlloc(GetProcessHeap(), 0, xorBytes); + if (!bits) + { + hr = E_OUTOFMEMORY; + goto fail; + } + + if (bih.biHeight > 0) /* bottom-up DIB */ + { + /* read the rows backwards so we get a top-down DIB */ + UINT i; + BYTE *xorRow = bits + xorBytesPerRow * (height-1); + + for (i=0; iparent->stream, xorRow, xorBytesPerRow, &bytesread); + if (FAILED(hr) || bytesread != xorBytesPerRow) goto fail; + xorRow -= xorBytesPerRow; + } + } + else /* top-down DIB */ + { + hr = IStream_Read(This->parent->stream, bits, xorBytes, &bytesread); + if (FAILED(hr) || bytesread != xorBytes) goto fail; + } + break; + } default: FIXME("unsupported bitcount: %u\n", This->entry.wBitCount); goto fail; -- 1.5.4.3