windowscodecs: Implement CopyPixels for 32-bit ICO icons.

This commit is contained in:
Vincent Povirk 2009-08-20 15:10:10 -05:00 committed by Alexandre Julliard
parent e743a7a8c5
commit 84dff04e3a
1 changed files with 32 additions and 0 deletions

View File

@ -406,6 +406,38 @@ static HRESULT IcoFrameDecode_ReadPixels(IcoFrameDecode *This)
HeapFree(GetProcessHeap(), 0, tempdata); HeapFree(GetProcessHeap(), 0, tempdata);
break; 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; i<height; i++)
{
hr = IStream_Read(This->parent->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: default:
FIXME("unsupported bitcount: %u\n", This->entry.wBitCount); FIXME("unsupported bitcount: %u\n", This->entry.wBitCount);
goto fail; goto fail;