From 3266420a1e39ddd7f7b1fd3db5b6f6e416936846 Mon Sep 17 00:00:00 2001 From: Sean Huckins Date: Fri, 21 Mar 2008 16:39:22 -0700 Subject: [PATCH] gdiplus: Implementation of GdipCreateBitmapFromHBITMAP. --- dlls/gdiplus/gdiplus.spec | 2 +- dlls/gdiplus/image.c | 46 +++++++++++++++++++++++ dlls/gdiplus/tests/Makefile.in | 2 +- dlls/gdiplus/tests/image.c | 83 ++++++++++++++++++++++++++++++++++++++++++ include/gdiplusflat.h | 1 + 5 files changed, 132 insertions(+), 2 deletions(-) diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 4aac0df3f85..3b3ec41799e 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -75,7 +75,7 @@ @ stdcall GdipCreateBitmapFromFileICM(wstr ptr) @ stub GdipCreateBitmapFromGdiDib @ stdcall GdipCreateBitmapFromGraphics(long long ptr ptr) -@ stub GdipCreateBitmapFromHBITMAP +@ stdcall GdipCreateBitmapFromHBITMAP(ptr ptr ptr) @ stub GdipCreateBitmapFromHICON @ stub GdipCreateBitmapFromResource @ stdcall GdipCreateBitmapFromScan0(long long long long ptr ptr) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index f0cc822535d..2e5ef565db3 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1051,3 +1051,49 @@ GpStatus WINGDIPAPI GdipGetImageEncoders(UINT numEncoders, UINT size, ImageCodec return Ok; } +GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBitmap** bitmap) +{ + BITMAP bm; + GpStatus retval; + PixelFormat format; + + 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; + + /* TODO: Figure out the correct format for 16, 32, 64 bpp */ + switch(bm.bmBitsPixel) { + case 1: + format = PixelFormat1bppIndexed; + break; + case 4: + format = PixelFormat4bppIndexed; + break; + case 8: + format = PixelFormat8bppIndexed; + break; + case 24: + format = PixelFormat24bppRGB; + break; + case 48: + format = PixelFormat48bppRGB; + break; + default: + FIXME("don't know how to handle %d bpp\n", bm.bmBitsPixel); + return InvalidParameter; + break; + } + + retval = GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, bm.bmWidthBytes, + format, bm.bmBits, bitmap); + + return retval; +} diff --git a/dlls/gdiplus/tests/Makefile.in b/dlls/gdiplus/tests/Makefile.in index 3102f17edfc..28b29590b16 100644 --- a/dlls/gdiplus/tests/Makefile.in +++ b/dlls/gdiplus/tests/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../../.. SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = gdiplus.dll -IMPORTS = gdiplus user32 kernel32 +IMPORTS = gdiplus user32 gdi32 kernel32 CTESTS = \ brush.c \ diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 9faa090806b..dcb86fc6c27 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -22,6 +22,7 @@ #include "gdiplus.h" #include "wine/test.h" #include +#include "wingdi.h" #define expect(expected, got) ok(((UINT)got) == ((UINT)expected), "Expected %.8x, got %.8x\n", (UINT)expected, (UINT)got) @@ -335,6 +336,87 @@ static void test_LockBits(void) expect(Ok, stat); } +static void test_GdipCreateBitmapFromHBITMAP(void) +{ + GpBitmap* gpbm = NULL; + HBITMAP hbm = NULL; + HPALETTE hpal = NULL; + GpStatus stat; + BYTE buff[1000]; + LOGPALETTE* LogPal = NULL; + REAL width, height; + const REAL WIDTH1 = 5; + const REAL HEIGHT1 = 15; + const REAL WIDTH2 = 10; + const REAL HEIGHT2 = 20; + HDC hdc; + BITMAPINFO bmi; + + stat = GdipCreateBitmapFromHBITMAP(NULL, NULL, NULL); + expect(InvalidParameter, stat); + + hbm = CreateBitmap(WIDTH1, HEIGHT1, 1, 1, NULL); + stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, NULL); + expect(InvalidParameter, stat); + + stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); + expect(Ok, stat); + expect(Ok, GdipGetImageDimension((GpImage*) gpbm, &width, &height)); + ok(fabs(WIDTH1 - width) < .0001, "width wrong\n"); + ok(fabs(HEIGHT1 - height) < .0001, "height wrong\n"); + if (stat == Ok) + GdipDisposeImage((GpImage*)gpbm); + GlobalFree(hbm); + + hbm = CreateBitmap(WIDTH2, HEIGHT2, 1, 1, &buff); + stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); + expect(Ok, stat); + expect(Ok, GdipGetImageDimension((GpImage*) gpbm, &width, &height)); + ok(fabs(WIDTH2 - width) < .0001, "width wrong\n"); + ok(fabs(HEIGHT2 - height) < .0001, "height wrong\n"); + if (stat == Ok) + GdipDisposeImage((GpImage*)gpbm); + GlobalFree(hbm); + + hdc = CreateCompatibleDC(0); + ok(hdc != NULL, "CreateCompatibleDC failed\n"); + bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); + bmi.bmiHeader.biHeight = HEIGHT1; + bmi.bmiHeader.biWidth = WIDTH1; + bmi.bmiHeader.biBitCount = 24; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biCompression = BI_RGB; + + hbm = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, NULL, NULL, 0); + ok(hbm != NULL, "CreateDIBSection failed\n"); + + stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); + expect(Ok, stat); + expect(Ok, GdipGetImageDimension((GpImage*) gpbm, &width, &height)); + ok(fabs(WIDTH1 - width) < .0001, "width wrong\n"); + ok(fabs(HEIGHT1 - height) < .0001, "height wrong\n"); + if (stat == Ok) + GdipDisposeImage((GpImage*)gpbm); + + LogPal = GdipAlloc(sizeof(LOGPALETTE)); + ok(LogPal != NULL, "unable to allocate LOGPALETTE\n"); + LogPal->palVersion = 0x300; + hpal = CreatePalette((const LOGPALETTE*) LogPal); + ok(hpal != NULL, "CreatePalette failed\n"); + GdipFree(LogPal); + + stat = GdipCreateBitmapFromHBITMAP(hbm, hpal, &gpbm); + todo_wine + { + expect(Ok, stat); + } + if (stat == Ok) + GdipDisposeImage((GpImage*)gpbm); + + GlobalFree(hpal); + GlobalFree(hbm); +} + START_TEST(image) { struct GdiplusStartupInput gdiplusStartupInput; @@ -353,6 +435,7 @@ START_TEST(image) test_SavingImages(); test_encoders(); test_LockBits(); + test_GdipCreateBitmapFromHBITMAP(); GdiplusShutdown(gdiplusToken); } diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index fe7bdbb9dd4..e92c646c651 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -261,6 +261,7 @@ GpStatus WINGDIPAPI GdipFindFirstImageItem(GpImage*,ImageItemData*); GpStatus WINGDIPAPI GdipFindNextImageItem(GpImage*,ImageItemData*); GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size); GpStatus WINGDIPAPI GdipGetImageEncoders(UINT numEncoders, UINT size, ImageCodecInfo *encoders); +GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP, HPALETTE, GpBitmap**); GpStatus WINGDIPAPI GdipGetImageItemData(GpImage*,ImageItemData*); GpStatus WINGDIPAPI GdipGetImageBounds(GpImage*,GpRectF*,GpUnit*); GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage*,GpGraphics**); -- 2.11.4.GIT