Module: wine Branch: master Commit: 2dbc3980efc227d9efafa09442b5c2246c114c49 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2dbc3980efc227d9efafa09442...
Author: Vincent Povirk vincent@codeweavers.com Date: Sat May 8 12:01:07 2010 -0500
gdiplus: Implement GdipCreateHICONFromBitmap.
---
dlls/gdiplus/image.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 56b79e1..bc13ad9 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1804,9 +1804,56 @@ GpStatus WINGDIPAPI GdipCreateCachedBitmap(GpBitmap *bitmap, GpGraphics *graphic
GpStatus WINGDIPAPI GdipCreateHICONFromBitmap(GpBitmap *bitmap, HICON *hicon) { - FIXME("(%p, %p)\n", bitmap, hicon); + GpStatus stat; + BitmapData lockeddata; + ULONG andstride, xorstride, bitssize; + LPBYTE andbits, xorbits, androw, xorrow, srcrow; + UINT x, y;
- return NotImplemented; + TRACE("(%p, %p)\n", bitmap, hicon); + + if (!bitmap || !hicon) + return InvalidParameter; + + stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, + PixelFormat32bppPARGB, &lockeddata); + if (stat == Ok) + { + andstride = ((lockeddata.Width+31)/32)*4; + xorstride = lockeddata.Width*4; + bitssize = (andstride + xorstride) * lockeddata.Height; + + andbits = GdipAlloc(bitssize); + + if (andbits) + { + xorbits = andbits + andstride * lockeddata.Height; + + for (y=0; y<lockeddata.Height; y++) + { + srcrow = ((LPBYTE)lockeddata.Scan0) + lockeddata.Stride * y; + + androw = andbits + andstride * y; + for (x=0; x<lockeddata.Width; x++) + if (srcrow[3+4*x] >= 128) + androw[x/8] |= 1 << (7-x%8); + + xorrow = xorbits + xorstride * y; + memcpy(xorrow, srcrow, xorstride); + } + + *hicon = CreateIcon(NULL, lockeddata.Width, lockeddata.Height, 1, 32, + andbits, xorbits); + + GdipFree(andbits); + } + else + stat = OutOfMemory; + + GdipBitmapUnlockBits(bitmap, &lockeddata); + } + + return stat; }
GpStatus WINGDIPAPI GdipDeleteCachedBitmap(GpCachedBitmap *cachedbmp)