From 52a5fff739963d1a4c54d74f98b7a54980532b93 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 28 Mar 2011 16:03:29 -0500 Subject: [PATCH] gdiplus: Use the given HPALETTE in GdipCreateBitmapFromHBITMAP. --- dlls/gdiplus/image.c | 56 +++++++++++++++++++++++++++++++++++++++---- dlls/gdiplus/tests/image.c | 6 +--- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 1916524..35ebd29 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -3524,12 +3524,6 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi if(!hbm || !bitmap) return InvalidParameter; - /* TODO: Support for device-dependent bitmaps */ - if(hpal){ - FIXME("no support for device-dependent bitmaps\n"); - return NotImplemented; - } - if (GetObjectA(hbm, sizeof(bm), &bm) != sizeof(bm)) return InvalidParameter; @@ -3626,6 +3620,56 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi GdipBitmapUnlockBits(*bitmap, &lockeddata); } + + if (retval == Ok && hpal) + { + WORD num_palette_entries; + PALETTEENTRY *palette_entries=NULL; + ColorPalette *palette=NULL; + int i; + + if (!GetObjectW(hpal, sizeof(num_palette_entries), &num_palette_entries)) + retval = GenericError; + + if (retval == Ok) + { + palette_entries = GdipAlloc(sizeof(PALETTEENTRY) * num_palette_entries); + palette = GdipAlloc(sizeof(ColorPalette) + sizeof(ARGB) * (num_palette_entries-1)); + + if (!palette_entries || !palette) + retval = OutOfMemory; + } + + if (retval == Ok) + { + if (!GetPaletteEntries(hpal, 0, num_palette_entries, palette_entries)) + retval = GenericError; + } + + if (retval == Ok) + { + palette->Flags = 0; + palette->Count = num_palette_entries; + + for (i=0; iEntries[i] = 0xff000000 | entry->peRed << 16 | + entry->peGreen << 8 | entry->peBlue; + } + + retval = GdipSetImagePalette((GpImage*)*bitmap, palette); + } + + GdipFree(palette_entries); + GdipFree(palette); + } + + if (retval != Ok) + { + GdipDisposeImage((GpImage*)*bitmap); + *bitmap = NULL; + } } return retval; diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 1e6a9e9..77aec93 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -917,10 +917,8 @@ static void test_GdipCreateBitmapFromHBITMAP(void) GdipFree(LogPal); stat = GdipCreateBitmapFromHBITMAP(hbm, hpal, &gpbm); - todo_wine - { - expect(Ok, stat); - } + expect(Ok, stat); + if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); -- 1.7.1