Henri Verbeet : d2d1: Validate bitmap formats.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 29 15:40:45 CDT 2015
Module: wine
Branch: master
Commit: 1b3574ebc0adb2fb05413fe6ed11607455a7aabb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1b3574ebc0adb2fb05413fe6ed11607455a7aabb
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Wed Jul 29 11:36:18 2015 +0200
d2d1: Validate bitmap formats.
---
dlls/d2d1/bitmap.c | 40 +++++++++++++++++++++++++
dlls/d2d1/tests/d2d1.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 120 insertions(+)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index ccc8d75..2439d79 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -165,8 +165,48 @@ HRESULT d2d_bitmap_init(struct d2d_bitmap *bitmap, struct d2d_d3d_render_target
D3D10_SUBRESOURCE_DATA resource_data;
D3D10_TEXTURE2D_DESC texture_desc;
ID3D10Texture2D *texture;
+ BOOL supported = FALSE;
+ unsigned int i;
HRESULT hr;
+ static const D2D1_PIXEL_FORMAT supported_formats[] =
+ {
+ {DXGI_FORMAT_R32G32B32A32_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_R32G32B32A32_FLOAT, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT },
+ {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_B8G8R8X8_UNORM, D2D1_ALPHA_MODE_IGNORE },
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D2D1_ALPHA_MODE_PREMULTIPLIED},
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D2D1_ALPHA_MODE_IGNORE },
+ };
+
+ for (i = 0; i < sizeof(supported_formats) / sizeof(*supported_formats); ++i)
+ {
+ if (supported_formats[i].format == desc->pixelFormat.format
+ && supported_formats[i].alphaMode == desc->pixelFormat.alphaMode)
+ {
+ supported = TRUE;
+ break;
+ }
+ }
+
+ if (!supported)
+ {
+ WARN("Tried to create bitmap with unsupported format {%#x / %#x}.\n",
+ desc->pixelFormat.format, desc->pixelFormat.alphaMode);
+ return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
+ }
+
FIXME("Ignoring bitmap properties.\n");
bitmap->ID2D1Bitmap_iface.lpVtbl = &d2d_bitmap_vtbl;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index f8ebecc..4d83154 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -1530,6 +1530,85 @@ static void test_path_geometry(void)
DestroyWindow(window);
}
+static void test_bitmap_formats(void)
+{
+ D2D1_BITMAP_PROPERTIES bitmap_desc;
+ IDXGISwapChain *swapchain;
+ D2D1_SIZE_U size = {4, 4};
+ ID2D1RenderTarget *rt;
+ ID3D10Device1 *device;
+ IDXGISurface *surface;
+ ID2D1Bitmap *bitmap;
+ unsigned int i, j;
+ HWND window;
+ HRESULT hr;
+
+ static const struct
+ {
+ DXGI_FORMAT format;
+ DWORD mask;
+ }
+ bitmap_formats[] =
+ {
+ {DXGI_FORMAT_R32G32B32A32_FLOAT, 0x8a},
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, 0x8a},
+ {DXGI_FORMAT_R16G16B16A16_UNORM, 0x8a},
+ {DXGI_FORMAT_R8G8B8A8_TYPELESS, 0x00},
+ {DXGI_FORMAT_R8G8B8A8_UNORM, 0x0a},
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, 0x8a},
+ {DXGI_FORMAT_R8G8B8A8_UINT, 0x00},
+ {DXGI_FORMAT_R8G8B8A8_SNORM, 0x00},
+ {DXGI_FORMAT_R8G8B8A8_SINT, 0x00},
+ {DXGI_FORMAT_A8_UNORM, 0x06},
+ {DXGI_FORMAT_B8G8R8A8_UNORM, 0x0a},
+ {DXGI_FORMAT_B8G8R8X8_UNORM, 0x88},
+ {DXGI_FORMAT_B8G8R8A8_TYPELESS, 0x00},
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, 0x8a},
+ };
+
+ if (!(device = create_device()))
+ {
+ skip("Failed to create device, skipping tests.\n");
+ return;
+ }
+ window = CreateWindowA("static", "d2d1_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+ 0, 0, 640, 480, NULL, NULL, NULL, NULL);
+ swapchain = create_swapchain(device, window, TRUE);
+ hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface);
+ ok(SUCCEEDED(hr), "Failed to get buffer, hr %#x.\n", hr);
+ rt = create_render_target(surface);
+ ok(!!rt, "Failed to create render target.\n");
+
+ bitmap_desc.dpiX = 96.0f;
+ bitmap_desc.dpiY = 96.0f;
+ for (i = 0; i < sizeof(bitmap_formats) / sizeof(*bitmap_formats); ++i)
+ {
+ for (j = 0; j < 4; ++j)
+ {
+ if ((bitmap_formats[i].mask & (0x80 | (1u << j))) == (0x80 | (1u << j)))
+ continue;
+
+ bitmap_desc.pixelFormat.format = bitmap_formats[i].format;
+ bitmap_desc.pixelFormat.alphaMode = j;
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ if (bitmap_formats[i].mask & (1u << j))
+ ok(hr == S_OK, "Got unexpected hr %#x, for format %#x/%#x.\n",
+ hr, bitmap_formats[i].format, j);
+ else
+ ok(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT, "Got unexpected hr %#x, for format %#x/%#x.\n",
+ hr, bitmap_formats[i].format, j);
+ if (SUCCEEDED(hr))
+ ID2D1Bitmap_Release(bitmap);
+ }
+ }
+
+ ID2D1RenderTarget_Release(rt);
+ IDXGISurface_Release(surface);
+ IDXGISwapChain_Release(swapchain);
+ ID3D10Device1_Release(device);
+ DestroyWindow(window);
+}
+
START_TEST(d2d1)
{
test_clip();
@@ -1537,4 +1616,5 @@ START_TEST(d2d1)
test_color_brush();
test_bitmap_brush();
test_path_geometry();
+ test_bitmap_formats();
}
More information about the wine-cvs
mailing list