[PATCH 3/9] d2d1: Validate bitmap formats.
Henri Verbeet
hverbeet at codeweavers.com
Thu Jul 23 12:32:06 CDT 2015
---
dlls/d2d1/bitmap.c | 40 +++++++++++++++++++++
dlls/d2d1/tests/d2d1.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 138 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..4c10df9 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -1530,6 +1530,103 @@ 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 DWORD bitmap_data[] =
+ {
+ 0x7f7f0000, 0x7f7f7f00, 0x7f007f00, 0x7f007f7f,
+ 0x7f00007f, 0x7f7f007f, 0x7f000000, 0x7f404040,
+ 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f000000,
+ 0x7f7f7f7f, 0x7f000000, 0x7f000000, 0x7f000000,
+ 0x7f7f0000, 0x7f7f7f00, 0x7f007f00, 0x7f007f7f,
+ 0x7f00007f, 0x7f7f007f, 0x7f000000, 0x7f404040,
+ 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f000000,
+ 0x7f7f7f7f, 0x7f000000, 0x7f000000, 0x7f000000,
+ 0x7f7f0000, 0x7f7f7f00, 0x7f007f00, 0x7f007f7f,
+ 0x7f00007f, 0x7f7f007f, 0x7f000000, 0x7f404040,
+ 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f000000,
+ 0x7f7f7f7f, 0x7f000000, 0x7f000000, 0x7f000000,
+ 0x7f7f0000, 0x7f7f7f00, 0x7f007f00, 0x7f007f7f,
+ 0x7f00007f, 0x7f7f007f, 0x7f000000, 0x7f404040,
+ 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f000000,
+ 0x7f7f7f7f, 0x7f000000, 0x7f000000, 0x7f000000,
+ };
+ 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");
+
+ 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, bitmap_data,
+ 16 * sizeof(*bitmap_data), &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 +1634,5 @@ START_TEST(d2d1)
test_color_brush();
test_bitmap_brush();
test_path_geometry();
+ test_bitmap_formats();
}
--
2.1.4
More information about the wine-patches
mailing list