windowscodecs: Use alpha options in CreateBitmapFromHBITMAP.

Vincent Povirk madewokherd at gmail.com
Tue Nov 19 13:10:02 CST 2013


-------------- next part --------------
From 5b4a72cc7f3c2850fb7f752eeedbfb7f46539a64 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Tue, 19 Nov 2013 13:03:53 -0600
Subject: [PATCH] windowscodecs: Use alpha options in CreateBitmapFromHBITMAP.

---
 dlls/windowscodecs/imgfactory.c   | 15 ++++++++++++++-
 dlls/windowscodecs/tests/bitmap.c | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c
index bb4cf67..d31baa2 100644
--- a/dlls/windowscodecs/imgfactory.c
+++ b/dlls/windowscodecs/imgfactory.c
@@ -687,7 +687,20 @@ static HRESULT WINAPI ComponentFactory_CreateBitmapFromHBITMAP(IWICComponentFact
         format = GUID_WICPixelFormat24bppBGR;
         break;
     case 32:
-        format = GUID_WICPixelFormat32bppBGR;
+        switch (option)
+        {
+        case WICBitmapUseAlpha:
+            format = GUID_WICPixelFormat32bppBGRA;
+            break;
+        case WICBitmapUsePremultipliedAlpha:
+            format = GUID_WICPixelFormat32bppPBGRA;
+            break;
+        case WICBitmapIgnoreAlpha:
+            format = GUID_WICPixelFormat32bppBGR;
+            break;
+        default:
+            return E_INVALIDARG;
+        }
         break;
     case 48:
         format = GUID_WICPixelFormat48bppRGB;
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c
index 8de990a..14726f1 100644
--- a/dlls/windowscodecs/tests/bitmap.c
+++ b/dlls/windowscodecs/tests/bitmap.c
@@ -846,6 +846,41 @@ todo_wine
     IWICBitmap_Release(bitmap);
     DeleteObject(hbmp);
     DeleteObject(hpal);
+
+    /* 32bpp alpha */
+    hbmp = create_dib(2, 2, 32, NULL, NULL);
+    hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, NULL, WICBitmapUseAlpha, &bitmap);
+    ok(hr == S_OK, "CreateBitmapFromHBITMAP error %#x\n", hr);
+
+    hr = IWICBitmap_GetPixelFormat(bitmap, &format);
+    ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_WICPixelFormat32bppBGRA),
+       "unexpected pixel format %s\n", debugstr_guid(&format));
+
+    IWICBitmap_Release(bitmap);
+
+    /* 32bpp pre-multiplied alpha */
+    hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, NULL, WICBitmapUsePremultipliedAlpha, &bitmap);
+    ok(hr == S_OK, "CreateBitmapFromHBITMAP error %#x\n", hr);
+
+    hr = IWICBitmap_GetPixelFormat(bitmap, &format);
+    ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_WICPixelFormat32bppPBGRA),
+       "unexpected pixel format %s\n", debugstr_guid(&format));
+
+    IWICBitmap_Release(bitmap);
+
+    /* 32bpp no alpha */
+    hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, NULL, WICBitmapIgnoreAlpha, &bitmap);
+    ok(hr == S_OK, "CreateBitmapFromHBITMAP error %#x\n", hr);
+
+    hr = IWICBitmap_GetPixelFormat(bitmap, &format);
+    ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_WICPixelFormat32bppBGR),
+       "unexpected pixel format %s\n", debugstr_guid(&format));
+
+    IWICBitmap_Release(bitmap);
+    DeleteObject(hbmp);
 }
 
 static void test_clipper(void)
-- 
1.8.1.2


More information about the wine-patches mailing list