[2/2] gdiplus: Implement GdipCreateBitmapFromHBITMAP for 16-bit dibs.

Vincent Povirk vincent at codeweavers.com
Wed Jan 11 14:02:25 CST 2012


-------------- next part --------------
From 2a6613c9e32196b57be019efffdd510987f3d333 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Wed, 11 Jan 2012 13:41:19 -0600
Subject: [PATCH 2/2] gdiplus: Implement GdipCreateBitmapFromHBITMAP for 16-bit dibs.

---
 dlls/gdiplus/image.c       |   31 +++++++++++++++++++++++++++++++
 dlls/gdiplus/tests/image.c |    6 +++---
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 0e3848f..aba8366 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -3526,6 +3526,7 @@ GpStatus WINGDIPAPI GdipGetEncoderParameterListSize(GpImage *image,
 GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBitmap** bitmap)
 {
     BITMAP bm;
+    DIBSECTION dib;
     GpStatus retval;
     PixelFormat format;
     BitmapData lockeddata;
@@ -3550,6 +3551,36 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
         case 8:
             format = PixelFormat8bppIndexed;
             break;
+        case 16:
+        {
+            if (GetObjectA(hbm, sizeof(dib), &dib) == sizeof(dib))
+            {
+                if (dib.dsBitfields[0] == 0x7c00 &&
+                    dib.dsBitfields[1] == 0x3e0 &&
+                    dib.dsBitfields[2] == 0x1f)
+                {
+                    format = PixelFormat16bppRGB555;
+                }
+                else if (dib.dsBitfields[0] == 0xf800 &&
+                    dib.dsBitfields[1] == 0x7e0 &&
+                    dib.dsBitfields[2] == 0x1f)
+                {
+                    format = PixelFormat16bppRGB565;
+                }
+                else
+                {
+                    FIXME("unrecognized bitfields %x,%x,%x\n", dib.dsBitfields[0],
+                        dib.dsBitfields[1], dib.dsBitfields[2]);
+                    return InvalidParameter;
+                }
+            }
+            else
+            {
+                FIXME("unimplemented for 16-bit ddb\n");
+                return InvalidParameter;
+            }
+            break;
+        }
         case 24:
             format = PixelFormat24bppRGB;
             break;
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 78a73c9..b6262d1 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -949,7 +949,7 @@ static void test_GdipCreateBitmapFromHBITMAP(void)
     bits[0] = 0;
 
     stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
     if (stat == Ok)
     {
@@ -979,7 +979,7 @@ static void test_GdipCreateBitmapFromHBITMAP(void)
     bits[0] = 0;
 
     stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
     if (stat == Ok)
     {
@@ -1007,7 +1007,7 @@ static void test_GdipCreateBitmapFromHBITMAP(void)
     bits[0] = 0;
 
     stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
     if (stat == Ok)
     {
-- 
1.7.4.1


More information about the wine-patches mailing list