Module: wine Branch: master Commit: d309b843fb5870efe612df3a7ae51380c015f184 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d309b843fb5870efe612df3a7a...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Jan 20 21:31:57 2016 +0300
d2d1: Block target creation on invalid dpi values.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/d2d1/render_target.c | 22 +++++++++----- dlls/d2d1/tests/d2d1.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c index 091954c..e4a4ad4 100644 --- a/dlls/d2d1/render_target.c +++ b/dlls/d2d1/render_target.c @@ -2038,6 +2038,18 @@ HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, 0.0f, 1.0f, 0.0f, 0.0f, }; + float dpi_x, dpi_y; + + dpi_x = desc->dpiX; + dpi_y = desc->dpiY; + + if (dpi_x == 0.0f && dpi_y == 0.0f) + { + dpi_x = 96.0f; + dpi_y = 96.0f; + } + else if (dpi_x <= 0.0f || dpi_y <= 0.0f) + return E_INVALIDARG;
if (desc->type != D2D1_RENDER_TARGET_TYPE_DEFAULT && desc->type != D2D1_RENDER_TARGET_TYPE_HARDWARE) WARN("Ignoring render target type %#x.\n", desc->type); @@ -2228,14 +2240,8 @@ HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, goto err; }
- render_target->dpi_x = desc->dpiX; - render_target->dpi_y = desc->dpiY; - - if (render_target->dpi_x == 0.0f && render_target->dpi_y == 0.0f) - { - render_target->dpi_x = 96.0f; - render_target->dpi_y = 96.0f; - } + render_target->dpi_x = dpi_x; + render_target->dpi_y = dpi_y;
return S_OK;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 7c554d2..c7d67f1 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -2441,6 +2441,82 @@ static void test_opacity_brush(void) DestroyWindow(window); }
+static void test_create_target(void) +{ + IDXGISwapChain *swapchain; + ID2D1Factory *factory; + ID2D1RenderTarget *rt; + ID3D10Device1 *device; + IDXGISurface *surface; + HWND window; + HRESULT hr; + static const struct + { + float dpi_x, dpi_y; + float rt_dpi_x, rt_dpi_y; + HRESULT hr; + } + create_dpi_tests[] = + { + { 0.0f, 0.0f, 96.0f, 96.0f, S_OK }, + { 192.0f, 0.0f, 96.0f, 96.0f, E_INVALIDARG }, + { 0.0f, 192.0f, 96.0f, 96.0f, E_INVALIDARG }, + { 192.0f, -10.0f, 96.0f, 96.0f, E_INVALIDARG }, + { -10.0f, 192.0f, 96.0f, 96.0f, E_INVALIDARG }, + { 48.0f, 96.0f, 48.0f, 96.0f, S_OK }, + }; + unsigned int i; + + 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); + + hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory); + ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr); + + for (i = 0; i < sizeof(create_dpi_tests) / sizeof(*create_dpi_tests); ++i) + { + D2D1_RENDER_TARGET_PROPERTIES desc; + float dpi_x, dpi_y; + + desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; + desc.pixelFormat.format = DXGI_FORMAT_UNKNOWN; + desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; + desc.dpiX = create_dpi_tests[i].dpi_x; + desc.dpiY = create_dpi_tests[i].dpi_y; + desc.usage = D2D1_RENDER_TARGET_USAGE_NONE; + desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; + + hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(factory, surface, &desc, &rt); + ok(hr == create_dpi_tests[i].hr, "Wrong return code, hr %#x, expected %#x, test %u.\n", hr, + create_dpi_tests[i].hr, i); + + if (FAILED(hr)) + continue; + + ID2D1RenderTarget_GetDpi(rt, &dpi_x, &dpi_y); + ok(dpi_x == create_dpi_tests[i].rt_dpi_x, "Wrong dpi_x %.8e, expected %.8e, test %u\n", + dpi_x, create_dpi_tests[i].rt_dpi_x, i); + ok(dpi_y == create_dpi_tests[i].rt_dpi_y, "Wrong dpi_y %.8e, expected %.8e, test %u\n", + dpi_y, create_dpi_tests[i].rt_dpi_y, i); + + ID2D1RenderTarget_Release(rt); + } + + ID2D1Factory_Release(factory); + IDXGISurface_Release(surface); + IDXGISwapChain_Release(swapchain); + ID3D10Device1_Release(device); + DestroyWindow(window); +} + START_TEST(d2d1) { test_clip(); @@ -2453,4 +2529,5 @@ START_TEST(d2d1) test_shared_bitmap(); test_bitmap_updates(); test_opacity_brush(); + test_create_target(); }