[PATCH 1/9] d2d1: ID2D1Factory1 test

Lucian Poston lucian.poston at gmail.com
Tue Nov 21 02:41:05 CST 2017


https://bugs.winehq.org/show_bug.cgi?id=44052

Signed-off-by: Lucian Poston <lucian.poston at gmail.com>
---
 dlls/d2d1/tests/Makefile.in |   2 +-
 dlls/d2d1/tests/d2d1.c      | 145 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 146 insertions(+), 1 deletion(-)

diff --git a/dlls/d2d1/tests/Makefile.in b/dlls/d2d1/tests/Makefile.in
index 91ede7888a..5eeb815e07 100644
--- a/dlls/d2d1/tests/Makefile.in
+++ b/dlls/d2d1/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = d2d1.dll
-IMPORTS   = d2d1 d3d10_1 dwrite dxguid uuid user32 advapi32 ole32 gdi32
+IMPORTS   = d2d1 d3d10_1 d3d11 dwrite dxguid uuid user32 advapi32 ole32 gdi32
 
 C_SRCS = \
 	d2d1.c
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index a0f22128fa..9c7c875b74 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -20,6 +20,8 @@
 #include <limits.h>
 #include <math.h>
 #include "d2d1.h"
+#include "d2d1_1.h"
+#include "d3d11.h"
 #include "wincrypt.h"
 #include "wine/test.h"
 #include "initguid.h"
@@ -609,6 +611,37 @@ static BOOL compare_figure(IDXGISurface *surface, unsigned int x, unsigned int y
     return diff <= max_diff;
 }
 
+static ID3D11Device *create_d11device(ID3D11DeviceContext **outContext)
+{
+    ID3D11Device *device;
+    ID3D11DeviceContext *context;
+    D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_10_0;
+
+    if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL,
+            D3D11_CREATE_DEVICE_BGRA_SUPPORT, &feature_level,
+            1, D3D11_SDK_VERSION, &device, NULL, &context)))
+    {
+        if (outContext) *outContext = context;
+        return device;
+    }
+    if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_WARP, NULL,
+            D3D11_CREATE_DEVICE_BGRA_SUPPORT, &feature_level,
+            1, D3D11_SDK_VERSION, &device, NULL, &context)))
+    {
+        if (outContext) *outContext = context;
+        return device;
+    }
+    if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL,
+            D3D11_CREATE_DEVICE_BGRA_SUPPORT, &feature_level,
+            1, D3D11_SDK_VERSION, &device, NULL, &context)))
+    {
+        if (outContext) *outContext = context;
+        return device;
+    }
+
+    return NULL;
+}
+
 static ID3D10Device1 *create_device(void)
 {
     ID3D10Device1 *device;
@@ -636,6 +669,47 @@ static HWND create_window(void)
             0, 0, r.right - r.left, r.bottom - r.top, NULL, NULL, NULL, NULL);
 }
 
+static IDXGISwapChain *create_swapchain_d3d11(ID3D11Device *device, HWND window, BOOL windowed)
+{
+    IDXGISwapChain *swapchain;
+    DXGI_SWAP_CHAIN_DESC desc;
+    IDXGIDevice *dxgi_device;
+    IDXGIAdapter *adapter;
+    IDXGIFactory *factory;
+    HRESULT hr;
+
+    hr = ID3D11Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device);
+    ok(SUCCEEDED(hr), "Failed to get DXGI device, hr %#x.\n", hr);
+    hr = IDXGIDevice_GetAdapter(dxgi_device, &adapter);
+    ok(SUCCEEDED(hr), "Failed to get adapter, hr %#x.\n", hr);
+    IDXGIDevice_Release(dxgi_device);
+    hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory);
+    ok(SUCCEEDED(hr), "Failed to get factory, hr %#x.\n", hr);
+    IDXGIAdapter_Release(adapter);
+
+    desc.BufferDesc.Width = 640;
+    desc.BufferDesc.Height = 480;
+    desc.BufferDesc.RefreshRate.Numerator = 60;
+    desc.BufferDesc.RefreshRate.Denominator = 1;
+    desc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+    desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
+    desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
+    desc.SampleDesc.Count = 1;
+    desc.SampleDesc.Quality = 0;
+    desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+    desc.BufferCount = 1;
+    desc.OutputWindow = window;
+    desc.Windowed = windowed;
+    desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+    desc.Flags = 0;
+
+    hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &desc, &swapchain);
+    ok(SUCCEEDED(hr), "Failed to create swapchain, hr %#x.\n", hr);
+    IDXGIFactory_Release(factory);
+
+    return swapchain;
+}
+
 static IDXGISwapChain *create_swapchain(ID3D10Device1 *device, HWND window, BOOL windowed)
 {
     IDXGISwapChain *swapchain;
@@ -4625,6 +4699,76 @@ todo_wine
     DestroyWindow(window);
 }
 
+static void test_draw_text_layout_with_ID2D1Factory1(void)
+{
+    HRESULT hr;
+    ID2D1Factory1 *factory;
+    ID2D1Device *device;
+    ID3D11Device *d3d11_device;
+    IDXGIDevice *dxgi_device;
+    ID2D1DeviceContext *context;
+    IDXGISurface *dxgi_surface;
+    ID2D1Bitmap1 *bitmap;
+    D2D1_BITMAP_PROPERTIES1 bitmap_properties;
+    IDXGISwapChain *swapchain;
+    HWND window;
+    ID2D1SolidColorBrush *brush;
+    D2D1_COLOR_F c;
+    D2D1_RECT_F r;
+    c.r = .5; c.g = .5; c.b = .5; c.a = .5;
+    r.top = 10; r.left = 10; r.bottom = 90; r.right = 90;
+
+    if (!(d3d11_device = create_d11device(NULL)))
+    {
+        skip("Failed to create device, skipping test.\n");
+        return;
+    }
+
+    window = create_window();
+    swapchain = create_swapchain_d3d11(d3d11_device, window, TRUE);
+    hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&dxgi_surface);
+    ok(SUCCEEDED(hr), "Failed to get buffer, hr %#x.\n", hr);
+
+    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
+            &IID_ID2D1Factory1, NULL, (void**)&factory);
+    ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr);
+    hr = ID3D11Device_QueryInterface(d3d11_device, &IID_IDXGIDevice,
+            (void**)&dxgi_device);
+    ok(SUCCEEDED(hr), "Failed to create dxgi_device, hr %#x.\n", hr);
+    hr = ID2D1Factory1_CreateDevice(factory, dxgi_device, &device);
+    ok(SUCCEEDED(hr), "Failed to create device, hr %#x.\n", hr);
+    hr = ID2D1Device_CreateDeviceContext(device,
+            D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &context);
+    ok(SUCCEEDED(hr), "Failed to create device context, hr %#x.\n", hr);
+    bitmap_properties.pixelFormat.format = DXGI_FORMAT_UNKNOWN;
+    bitmap_properties.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;
+    bitmap_properties.dpiX = 96.0;
+    bitmap_properties.dpiY = 96.0;
+    bitmap_properties.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
+    hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(context, dxgi_surface,
+            &bitmap_properties, &bitmap);
+    ok(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+    ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap);
+    ID2D1DeviceContext_CreateSolidColorBrush(context, &c, NULL, &brush);
+    ID2D1DeviceContext_BeginDraw(context);
+    ID2D1DeviceContext_DrawRectangle(context, &r, (ID2D1Brush *)brush, 1.0f, NULL);
+    hr = ID2D1DeviceContext_EndDraw(context, NULL, NULL);
+    ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+    hr = IDXGISwapChain_Present(swapchain, 0, 0);
+    ok(SUCCEEDED(hr), "Failed to present image, hr %#x.\n", hr);
+
+    ID2D1SolidColorBrush_Release(brush);
+    DestroyWindow(window);
+    IDXGISwapChain_Release(swapchain);
+    ID2D1Bitmap1_Release(bitmap);
+    IDXGISurface_Release(dxgi_surface);
+    ID2D1DeviceContext_Release(context);
+    IDXGIDevice_Release(dxgi_device);
+    ID3D11Device_Release(d3d11_device);
+    ID2D1Device_Release(device);
+    ID2D1Factory1_Release(factory);
+}
+
 static void create_target_dibsection(HDC hdc, UINT32 width, UINT32 height)
 {
     char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
@@ -6402,6 +6546,7 @@ START_TEST(d2d1)
     test_opacity_brush();
     test_create_target();
     test_draw_text_layout();
+    test_draw_text_layout_with_ID2D1Factory1();
     test_dc_target();
     test_hwnd_target();
     test_bitmap_target();
-- 
2.13.6




More information about the wine-devel mailing list