[PATCH] d2d1/tests: Initial tests for bitmap render target
Nikolay Sivov
nsivov at codeweavers.com
Wed Oct 5 10:33:53 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/d2d1/tests/d2d1.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 170 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index c9e1692..8cfe5d2 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -17,6 +17,7 @@
*/
#define COBJMACROS
+#include <limits.h>
#include <math.h>
#include "d2d1.h"
#include "wincrypt.h"
@@ -76,6 +77,12 @@ static void set_size_u(D2D1_SIZE_U *size, unsigned int w, unsigned int h)
size->height = h;
}
+static void set_size_f(D2D1_SIZE_F *size, float w, float h)
+{
+ size->width = w;
+ size->height = h;
+}
+
static void set_matrix_identity(D2D1_MATRIX_3X2_F *matrix)
{
matrix->_11 = 1.0f;
@@ -115,6 +122,19 @@ static void translate_matrix(D2D1_MATRIX_3X2_F *matrix, float x, float y)
matrix->_32 += x * matrix->_12 + y * matrix->_22;
}
+static inline BOOL float_eq(FLOAT left, FLOAT right)
+{
+ int x = *(int *)&left;
+ int y = *(int *)&right;
+
+ if (x < 0)
+ x = INT_MIN - x;
+ if (y < 0)
+ y = INT_MIN - y;
+
+ return abs(x - y) <= 8;
+}
+
static BOOL compare_sha1(void *data, unsigned int pitch, unsigned int bpp,
unsigned int w, unsigned int h, const char *ref_sha1)
{
@@ -2881,6 +2901,155 @@ static void test_hwnd_target(void)
ID2D1Factory_Release(factory);
}
+static void test_bitmap_target(void)
+{
+ D2D1_HWND_RENDER_TARGET_PROPERTIES hwnd_rt_desc;
+ D2D1_SIZE_U pixel_size, pixel_size2;
+ D2D1_RENDER_TARGET_PROPERTIES desc;
+ ID2D1HwndRenderTarget *hwnd_rt;
+ ID2D1Bitmap *bitmap, *bitmap2;
+ ID2D1BitmapRenderTarget *rt;
+ D2D1_SIZE_F size, size2;
+ ID2D1Factory *factory;
+ ID3D10Device1 *device;
+ float dpi[2], dpi2[2];
+ D2D1_COLOR_F color;
+ ULONG refcount;
+ HRESULT hr;
+
+ if (!(device = create_device()))
+ {
+ skip("Failed to create device, skipping tests.\n");
+ return;
+ }
+ ID3D10Device1_Release(device);
+
+ hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory);
+ ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr);
+
+ desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
+ desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
+ desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
+ desc.dpiX = 0.0f;
+ desc.dpiY = 0.0f;
+ desc.usage = D2D1_RENDER_TARGET_USAGE_NONE;
+ desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
+
+ hwnd_rt_desc.hwnd = CreateWindowA("static", "d2d_test", 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ ok(!!hwnd_rt_desc.hwnd, "Failed to create target window.\n");
+ hwnd_rt_desc.pixelSize.width = 64;
+ hwnd_rt_desc.pixelSize.height = 64;
+ hwnd_rt_desc.presentOptions = D2D1_PRESENT_OPTIONS_NONE;
+
+ hr = ID2D1Factory_CreateHwndRenderTarget(factory, &desc, &hwnd_rt_desc, &hwnd_rt);
+ ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+
+ hr = ID2D1HwndRenderTarget_CreateCompatibleRenderTarget(hwnd_rt, NULL, NULL, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &rt);
+todo_wine
+ ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+
+ if (FAILED(hr))
+ {
+ ID2D1HwndRenderTarget_Release(hwnd_rt);
+ DestroyWindow(hwnd_rt_desc.hwnd);
+ ID2D1Factory_Release(factory);
+ return;
+ }
+
+ /* See if parent target is referenced. */
+ ID2D1HwndRenderTarget_AddRef(hwnd_rt);
+ refcount = ID2D1HwndRenderTarget_Release(hwnd_rt);
+ ok(refcount == 1, "Target should not have been referenced, got %u.\n", refcount);
+
+ /* Size was not specified, should match parent. */
+ pixel_size = ID2D1HwndRenderTarget_GetPixelSize(hwnd_rt);
+ pixel_size2 = ID2D1BitmapRenderTarget_GetPixelSize(rt);
+ ok(!memcmp(&pixel_size, &pixel_size2, sizeof(pixel_size)), "Got target pixel size mismatch.\n");
+
+ size = ID2D1HwndRenderTarget_GetSize(hwnd_rt);
+ size2 = ID2D1BitmapRenderTarget_GetSize(rt);
+ ok(!memcmp(&size, &size2, sizeof(size)), "Got target DIP size mismatch.\n");
+
+ ID2D1HwndRenderTarget_GetDpi(hwnd_rt, dpi, dpi + 1);
+ ID2D1BitmapRenderTarget_GetDpi(rt, dpi2, dpi2 + 1);
+ ok(!memcmp(dpi, dpi2, sizeof(dpi)), "Got dpi mismatch.\n");
+
+ ID2D1BitmapRenderTarget_Release(rt);
+
+ /* Pixel size specified. */
+ set_size_u(&pixel_size, 32, 32);
+ hr = ID2D1HwndRenderTarget_CreateCompatibleRenderTarget(hwnd_rt, NULL, &pixel_size, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &rt);
+ ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+
+ pixel_size2 = ID2D1BitmapRenderTarget_GetPixelSize(rt);
+ ok(!memcmp(&pixel_size, &pixel_size2, sizeof(pixel_size)), "Got target pixel size mismatch.\n");
+
+ ID2D1BitmapRenderTarget_GetDpi(rt, dpi2, dpi2 + 1);
+ ok(!memcmp(dpi, dpi2, sizeof(dpi)), "Got dpi mismatch.\n");
+
+ ID2D1BitmapRenderTarget_Release(rt);
+
+ /* Both pixel size and DIP size are specified. */
+ set_size_u(&pixel_size, 128, 128);
+ hr = ID2D1HwndRenderTarget_CreateCompatibleRenderTarget(hwnd_rt, &size, &pixel_size, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &rt);
+ ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+
+ /* Doubled pixel size dimensions with the same DIP size give doubled dpi. */
+ ID2D1BitmapRenderTarget_GetDpi(rt, dpi2, dpi2 + 1);
+ ok(dpi[0] == dpi2[0] / 2.0f && dpi[1] == dpi2[1] / 2.0f, "Got dpi mismatch.\n");
+
+ ID2D1BitmapRenderTarget_Release(rt);
+
+ /* DIP size is specified, fractional. */
+ set_size_f(&size, 70.4f, 70.5f);
+ hr = ID2D1HwndRenderTarget_CreateCompatibleRenderTarget(hwnd_rt, &size, NULL, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &rt);
+ ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+
+ pixel_size = ID2D1BitmapRenderTarget_GetPixelSize(rt);
+ ok(pixel_size.width == ceilf(size.width) && pixel_size.height == ceilf(size.height), "Wrong pixel size %ux%u\n",
+ pixel_size.width, pixel_size.height);
+
+ ID2D1BitmapRenderTarget_GetDpi(rt, dpi2, dpi2 + 1);
+ dpi[0] *= pixel_size.width / size.width;
+ dpi[1] *= pixel_size.height / size.height;
+
+ ok(float_eq(dpi[0], dpi2[0]) && float_eq(dpi[1], dpi2[1]), "Got dpi mismatch.\n");
+
+ ID2D1HwndRenderTarget_Release(hwnd_rt);
+
+ /* Check if GetBitmap() returns same instance. */
+ hr = ID2D1BitmapRenderTarget_GetBitmap(rt, &bitmap);
+ ok(SUCCEEDED(hr), "GetBitmap() failed, hr %#x.\n", hr);
+ hr = ID2D1BitmapRenderTarget_GetBitmap(rt, &bitmap2);
+ ok(SUCCEEDED(hr), "GetBitmap() failed, hr %#x.\n", hr);
+ ok(bitmap == bitmap2, "Got different bitmap instances.\n");
+
+ /* Draw something, see if bitmap instance is retained. */
+ ID2D1BitmapRenderTarget_BeginDraw(rt);
+ set_color(&color, 1.0f, 1.0f, 0.0f, 1.0f);
+ ID2D1BitmapRenderTarget_Clear(rt, &color);
+ hr = ID2D1BitmapRenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "EndDraw() failed, hr %#x.\n", hr);
+
+ ID2D1Bitmap_Release(bitmap2);
+ hr = ID2D1BitmapRenderTarget_GetBitmap(rt, &bitmap2);
+ ok(SUCCEEDED(hr), "GetBitmap() failed, hr %#x.\n", hr);
+ ok(bitmap == bitmap2, "Got different bitmap instances.\n");
+
+ ID2D1Bitmap_Release(bitmap);
+ ID2D1Bitmap_Release(bitmap2);
+
+ refcount = ID2D1BitmapRenderTarget_Release(rt);
+ ok(!refcount, "Target should be released, got %u.\n", refcount);
+
+ DestroyWindow(hwnd_rt_desc.hwnd);
+ ID2D1Factory_Release(factory);
+}
+
START_TEST(d2d1)
{
test_clip();
@@ -2897,4 +3066,5 @@ START_TEST(d2d1)
test_draw_text_layout();
test_dc_target();
test_hwnd_target();
+ test_bitmap_target();
}
--
2.9.3
More information about the wine-patches
mailing list