Zebediah Figura : d2d1: Support GUID_WICPixelFormat32bppPRGBA.
Alexandre Julliard
julliard at winehq.org
Thu Mar 12 17:09:06 CDT 2020
Module: wine
Branch: master
Commit: ef0f2c7f00183ef16875cd5874c1b509e04a5a29
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ef0f2c7f00183ef16875cd5874c1b509e04a5a29
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Mar 11 11:40:43 2020 -0500
d2d1: Support GUID_WICPixelFormat32bppPRGBA.
Needed by Visio 2016.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d2d1/bitmap.c | 2 ++
dlls/d2d1/tests/d2d1.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index bc958e50a1..7ed57052b9 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -527,6 +527,7 @@ HRESULT d2d_bitmap_create_from_wic_bitmap(struct d2d_device_context *context, IW
format_lookup[] =
{
{&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}},
+ {&GUID_WICPixelFormat32bppPRGBA, {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}},
{&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}},
};
@@ -579,6 +580,7 @@ HRESULT d2d_bitmap_create_from_wic_bitmap(struct d2d_device_context *context, IW
switch (bitmap_desc.pixelFormat.format)
{
case DXGI_FORMAT_B8G8R8A8_UNORM:
+ case DXGI_FORMAT_R8G8B8A8_UNORM:
bpp = 4;
break;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 1d4db386ab..77899ccd6e 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -9341,6 +9341,77 @@ static void test_dpi(void)
DestroyWindow(window);
}
+static void test_wic_bitmap_format(void)
+{
+ IWICImagingFactory *wic_factory;
+ IDXGISwapChain *swapchain;
+ D2D1_PIXEL_FORMAT format;
+ IWICBitmap *wic_bitmap;
+ ID2D1RenderTarget *rt;
+ ID3D10Device1 *device;
+ IDXGISurface *surface;
+ ID2D1Bitmap *bitmap;
+ unsigned int i;
+ HWND window;
+ HRESULT hr;
+
+ static const struct
+ {
+ const WICPixelFormatGUID *wic;
+ D2D1_PIXEL_FORMAT d2d;
+ }
+ tests[] =
+ {
+ {&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}},
+ {&GUID_WICPixelFormat32bppPRGBA, {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}},
+ {&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}},
+ };
+
+ if (!(device = create_device()))
+ {
+ skip("Failed to create device, skipping tests.\n");
+ return;
+ }
+ window = create_window();
+ swapchain = create_swapchain(device, window, TRUE);
+ hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface);
+ ok(hr == S_OK, "Failed to get buffer, hr %#x.\n", hr);
+ rt = create_render_target(surface);
+ ok(!!rt, "Failed to create render target.\n");
+ CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
+
+ hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICImagingFactory, (void **)&wic_factory);
+ ok(hr == S_OK, "Failed to create WIC imaging factory, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
+ {
+ hr = IWICImagingFactory_CreateBitmap(wic_factory, 16, 16,
+ tests[i].wic, WICBitmapCacheOnDemand, &wic_bitmap);
+ ok(hr == S_OK, "%s: Failed to create WIC bitmap, hr %#x.\n", debugstr_guid(tests[i].wic), hr);
+
+ hr = ID2D1RenderTarget_CreateBitmapFromWicBitmap(rt, (IWICBitmapSource *)wic_bitmap, NULL, &bitmap);
+ ok(hr == S_OK, "%s: Failed to create bitmap from WIC source, hr %#x.\n", debugstr_guid(tests[i].wic), hr);
+
+ format = ID2D1Bitmap_GetPixelFormat(bitmap);
+ ok(format.format == tests[i].d2d.format, "%s: Got unexpected DXGI format %#x.\n",
+ debugstr_guid(tests[i].wic), format.format);
+ ok(format.alphaMode == tests[i].d2d.alphaMode, "%s: Got unexpected alpha mode %#x.\n",
+ debugstr_guid(tests[i].wic), format.alphaMode);
+
+ ID2D1Bitmap_Release(bitmap);
+ IWICBitmap_Release(wic_bitmap);
+ }
+
+ IWICImagingFactory_Release(wic_factory);
+ CoUninitialize();
+ ID2D1RenderTarget_Release(rt);
+ IDXGISurface_Release(surface);
+ IDXGISwapChain_Release(swapchain);
+ ID3D10Device1_Release(device);
+ DestroyWindow(window);
+}
+
START_TEST(d2d1)
{
unsigned int argc, i;
@@ -9390,6 +9461,7 @@ START_TEST(d2d1)
queue_test(test_command_list);
queue_test(test_max_bitmap_size);
queue_test(test_dpi);
+ queue_test(test_wic_bitmap_format);
run_queued_tests();
}
More information about the wine-cvs
mailing list