Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2020
- 75 participants
- 595 discussions
[PATCH 5/6] d2d1/tests: Test that hollow figures do not impact geometry bounds.
by Henri Verbeet 30 Jan '20
by Henri Verbeet 30 Jan '20
30 Jan '20
From: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 177543.
dlls/d2d1/tests/d2d1.c | 107 +++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 90 insertions(+), 17 deletions(-)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index b15ac4f25bf..65233c26dfa 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -19,6 +19,7 @@
#define COBJMACROS
#include <limits.h>
#include <math.h>
+#include <float.h>
#include "d2d1_1.h"
#include "wincrypt.h"
#include "wine/test.h"
@@ -2379,12 +2380,15 @@ static void test_radial_brush(void)
DestroyWindow(window);
}
-static void fill_geometry_sink(ID2D1GeometrySink *sink)
+static void fill_geometry_sink(ID2D1GeometrySink *sink, unsigned int hollow_count)
{
+ D2D1_FIGURE_BEGIN begin;
+ unsigned int idx = 0;
D2D1_POINT_2F point;
set_point(&point, 15.0f, 20.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
line_to(sink, 55.0f, 20.0f);
line_to(sink, 55.0f, 220.0f);
line_to(sink, 25.0f, 220.0f);
@@ -2403,7 +2407,8 @@ static void fill_geometry_sink(ID2D1GeometrySink *sink)
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 155.0f, 300.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
line_to(sink, 155.0f, 160.0f);
line_to(sink, 85.0f, 160.0f);
line_to(sink, 85.0f, 300.0f);
@@ -2418,37 +2423,44 @@ static void fill_geometry_sink(ID2D1GeometrySink *sink)
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 165.0f, 20.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
line_to(sink, 165.0f, 300.0f);
line_to(sink, 235.0f, 300.0f);
line_to(sink, 235.0f, 20.0f);
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 225.0f, 60.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
line_to(sink, 225.0f, 260.0f);
line_to(sink, 175.0f, 260.0f);
line_to(sink, 175.0f, 60.0f);
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 215.0f, 220.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
line_to(sink, 185.0f, 220.0f);
line_to(sink, 185.0f, 100.0f);
line_to(sink, 215.0f, 100.0f);
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 195.0f, 180.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
line_to(sink, 205.0f, 180.0f);
line_to(sink, 205.0f, 140.0f);
line_to(sink, 195.0f, 140.0f);
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
}
-static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink)
+static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink, unsigned int hollow_count)
{
+ D2D1_FIGURE_BEGIN begin;
+ unsigned int idx = 0;
D2D1_POINT_2F point;
set_point(&point, 5.0f, 160.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
quadratic_to(sink, 40.0f, 160.0f, 40.0f, 20.0f);
quadratic_to(sink, 40.0f, 160.0f, 75.0f, 160.0f);
quadratic_to(sink, 40.0f, 160.0f, 40.0f, 300.0f);
@@ -2456,7 +2468,8 @@ static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink)
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 20.0f, 160.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
quadratic_to(sink, 20.0f, 80.0f, 40.0f, 80.0f);
quadratic_to(sink, 60.0f, 80.0f, 60.0f, 160.0f);
quadratic_to(sink, 60.0f, 240.0f, 40.0f, 240.0f);
@@ -2464,7 +2477,8 @@ static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink)
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 5.0f, 612.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
quadratic_to(sink, 40.0f, 612.0f, 40.0f, 752.0f);
quadratic_to(sink, 40.0f, 612.0f, 75.0f, 612.0f);
quadratic_to(sink, 40.0f, 612.0f, 40.0f, 472.0f);
@@ -2472,7 +2486,8 @@ static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink)
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
set_point(&point, 20.0f, 612.0f);
- ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
quadratic_to(sink, 20.0f, 692.0f, 40.0f, 692.0f);
quadratic_to(sink, 60.0f, 692.0f, 60.0f, 612.0f);
quadratic_to(sink, 60.0f, 532.0f, 40.0f, 532.0f);
@@ -3061,7 +3076,7 @@ static void test_path_geometry(void)
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
- fill_geometry_sink_bezier(sink);
+ fill_geometry_sink_bezier(sink, 0);
hr = ID2D1GeometrySink_Close(sink);
ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
ID2D1GeometrySink_Release(sink);
@@ -3085,13 +3100,71 @@ static void test_path_geometry(void)
ID2D1PathGeometry_Release(geometry);
+ /* GetBounds() with bezier segments and some hollow components. */
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
+ fill_geometry_sink_bezier(sink, 2);
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ set_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f);
+ hr = ID2D1PathGeometry_GetBounds(geometry, NULL, &rect);
+ ok(SUCCEEDED(hr), "Failed to get geometry bounds, hr %#x.\n", hr);
+ match = compare_rect(&rect, 5.0f, 472.0f, 75.0f, 752.0f, 0);
+ todo_wine ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 80.0f, 640.0f);
+ scale_matrix(&matrix, 2.0f, 0.5f);
+ set_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f);
+ hr = ID2D1PathGeometry_GetBounds(geometry, &matrix, &rect);
+ ok(SUCCEEDED(hr), "Failed to get geometry bounds, hr %#x.\n", hr);
+ match = compare_rect(&rect, 90.0f, 876.0f, 230.0f, 1016.0f, 0);
+ todo_wine ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+
+ ID2D1PathGeometry_Release(geometry);
+
+ /* GetBounds() with bezier segments and all hollow components. */
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
+ fill_geometry_sink_bezier(sink, 4);
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ set_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f);
+ hr = ID2D1PathGeometry_GetBounds(geometry, NULL, &rect);
+ ok(SUCCEEDED(hr), "Failed to get geometry bounds, hr %#x.\n", hr);
+ match = compare_rect(&rect, INFINITY, INFINITY, FLT_MAX, FLT_MAX, 0);
+ todo_wine ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 80.0f, 640.0f);
+ scale_matrix(&matrix, 2.0f, 0.5f);
+ set_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f);
+ hr = ID2D1PathGeometry_GetBounds(geometry, &matrix, &rect);
+ ok(SUCCEEDED(hr), "Failed to get geometry bounds, hr %#x.\n", hr);
+ match = compare_rect(&rect, INFINITY, INFINITY, FLT_MAX, FLT_MAX, 0);
+ todo_wine ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+
+ ID2D1PathGeometry_Release(geometry);
+
hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
/* The fillmode that's used is the last one set before the sink is closed. */
ID2D1GeometrySink_SetFillMode(sink, D2D1_FILL_MODE_WINDING);
- fill_geometry_sink(sink);
+ fill_geometry_sink(sink, 0);
ID2D1GeometrySink_SetFillMode(sink, D2D1_FILL_MODE_ALTERNATE);
hr = ID2D1GeometrySink_Close(sink);
ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
@@ -3186,7 +3259,7 @@ static void test_path_geometry(void)
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
- fill_geometry_sink(sink);
+ fill_geometry_sink(sink, 0);
ID2D1GeometrySink_SetFillMode(sink, D2D1_FILL_MODE_WINDING);
hr = ID2D1GeometrySink_Close(sink);
ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
@@ -3244,7 +3317,7 @@ static void test_path_geometry(void)
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
- fill_geometry_sink_bezier(sink);
+ fill_geometry_sink_bezier(sink, 0);
hr = ID2D1GeometrySink_Close(sink);
ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
hr = ID2D1PathGeometry_GetFigureCount(geometry, &count);
@@ -3346,7 +3419,7 @@ static void test_path_geometry(void)
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
- fill_geometry_sink_bezier(sink);
+ fill_geometry_sink_bezier(sink, 0);
ID2D1GeometrySink_SetFillMode(sink, D2D1_FILL_MODE_WINDING);
hr = ID2D1GeometrySink_Close(sink);
ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
--
2.11.0
1
0
From: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 177539.
dlls/d2d1/device.c | 1 +
dlls/d2d1/geometry.c | 14 ++++++++++----
dlls/d2d1/tests/d2d1.c | 8 ++++----
3 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index 64b3041b2cf..0d10ac3e138 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -942,6 +942,7 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t
if (geometry->fill.bezier_vertex_count)
{
buffer_desc.ByteWidth = geometry->fill.bezier_vertex_count * sizeof(*geometry->fill.bezier_vertices);
+ buffer_desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
buffer_data.pSysMem = geometry->fill.bezier_vertices;
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vb)))
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 2a1fbf5f7cc..6e1c648707b 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -1548,6 +1548,9 @@ static BOOL d2d_cdt_insert_segments(struct d2d_cdt *cdt, struct d2d_geometry *ge
{
figure = &geometry->u.path.figures[i];
+ if (figure->flags & D2D_FIGURE_FLAG_HOLLOW)
+ continue;
+
/* Degenerate figure. */
if (figure->vertex_count < 2)
continue;
@@ -2011,6 +2014,8 @@ static HRESULT d2d_path_geometry_triangulate(struct d2d_geometry *geometry)
for (i = 0, vertex_count = 0; i < geometry->u.path.figure_count; ++i)
{
+ if (geometry->u.path.figures[i].flags & D2D_FIGURE_FLAG_HOLLOW)
+ continue;
vertex_count += geometry->u.path.figures[i].vertex_count;
}
@@ -2025,6 +2030,8 @@ static HRESULT d2d_path_geometry_triangulate(struct d2d_geometry *geometry)
for (i = 0, j = 0; i < geometry->u.path.figure_count; ++i)
{
+ if (geometry->u.path.figures[i].flags & D2D_FIGURE_FLAG_HOLLOW)
+ continue;
memcpy(&vertices[j], geometry->u.path.figures[i].vertices,
geometry->u.path.figures[i].vertex_count * sizeof(*vertices));
j += geometry->u.path.figures[i].vertex_count;
@@ -2455,9 +2462,6 @@ static void STDMETHODCALLTYPE d2d_geometry_sink_BeginFigure(ID2D1GeometrySink *i
return;
}
- if (figure_begin != D2D1_FIGURE_BEGIN_FILLED)
- FIXME("Ignoring figure_begin %#x.\n", figure_begin);
-
if (!d2d_path_geometry_add_figure(geometry))
{
ERR("Failed to add figure.\n");
@@ -2620,7 +2624,7 @@ static BOOL d2d_geometry_get_bezier_segment_idx(struct d2d_geometry *geometry, s
{
struct d2d_figure *figure = &geometry->u.path.figures[idx->figure_idx];
- if (!figure->bezier_control_count)
+ if (!figure->bezier_control_count || figure->flags & D2D_FIGURE_FLAG_HOLLOW)
continue;
for (; idx->vertex_idx < figure->vertex_count; ++idx->vertex_idx)
@@ -2816,6 +2820,8 @@ static HRESULT d2d_geometry_resolve_beziers(struct d2d_geometry *geometry)
for (i = 0; i < geometry->u.path.figure_count; ++i)
{
+ if (geometry->u.path.figures[i].flags & D2D_FIGURE_FLAG_HOLLOW)
+ continue;
geometry->fill.bezier_vertex_count += 3 * geometry->u.path.figures[i].bezier_control_count;
}
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 52618858d24..b15ac4f25bf 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -7480,13 +7480,13 @@ static void test_fill_geometry(void)
ID2D1TransformedGeometry_Release(transformed_geometry[0]);
match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "gMgB");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
match = compare_figure(surface, 160, 0, 320, 160, 0xff652e89, 0, "gJAD");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
match = compare_figure(surface, 0, 160, 160, 320, 0xff652e89, 0, "gJAD");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
match = compare_figure(surface, 160, 160, 320, 320, 0xff652e89, 0, "gKAG");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
ID2D1SolidColorBrush_Release(brush);
ID2D1RenderTarget_Release(rt);
--
2.11.0
1
0
30 Jan '20
From: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 177547.
dlls/d2d1/tests/d2d1.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index d07c8a4eb97..52618858d24 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -7410,6 +7410,84 @@ static void test_fill_geometry(void)
"sQIMswILtQIIhs4B");
ok(match, "Figure does not match.\n");
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
+
+ set_point(&point, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW);
+ quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f);
+ quadratic_to(sink, 0.008350f, 0.693614f, -0.052343f, 0.448886f);
+ quadratic_to(sink, -0.154236f, 0.246072f, -0.279229f, 0.025343f);
+ quadratic_to(sink, -0.370064f, -0.588586f, -0.383029f, -0.924114f);
+ quadratic_to(sink, -0.295479f, -0.958764f, -0.017086f, -0.988400f);
+ quadratic_to(sink, 0.208836f, -0.954157f, 0.272200f, -0.924114f);
+ quadratic_to(sink, 0.295614f, -0.569071f, 0.230143f, 0.022886f);
+ quadratic_to(sink, 0.101664f, 0.220643f, 0.012057f, 0.451571f);
+ quadratic_to(sink, -0.028764f, 0.709014f, 0.104029f, 0.833943f);
+ quadratic_to(sink, 0.319414f, 0.913057f, 0.403229f, 0.942628f);
+ quadratic_to(sink, 0.317721f, 1.023450f, -0.017086f, 1.021771f);
+ quadratic_to(sink, -0.310843f, 1.007472f, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 40.0f, 160.0f);
+ scale_matrix(&matrix, 20.0f, 80.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[0]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 160.0f, 640.0f);
+ scale_matrix(&matrix, 40.0f, 160.0f);
+ rotate_matrix(&matrix, M_PI / -5.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[1]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+ ID2D1PathGeometry_Release(geometry);
+
+ set_matrix_identity(&matrix);
+ scale_matrix(&matrix, 0.5f, 1.0f);
+ translate_matrix(&matrix, -80.0f, 0.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ rotate_matrix(&matrix, M_PI / 2.0f);
+ translate_matrix(&matrix, 80.0f, -320.0f);
+ scale_matrix(&matrix, 2.0f, 0.25f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[2], &matrix, &transformed_geometry[3]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[0], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[1], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[2], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[3], (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+ ID2D1TransformedGeometry_Release(transformed_geometry[3]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[2]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[1]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[0]);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 320, 160, 0xff652e89, 0, "gJAD");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 0, 160, 160, 320, 0xff652e89, 0, "gJAD");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 320, 320, 0xff652e89, 0, "gKAG");
+ todo_wine ok(match, "Figure does not match.\n");
+
ID2D1SolidColorBrush_Release(brush);
ID2D1RenderTarget_Release(rt);
refcount = ID2D1Factory_Release(factory);
--
2.11.0
1
0
From: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 177542.
dlls/d2d1/tests/d2d1.c | 737 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 737 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 2e76612e3ba..d07c8a4eb97 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -6684,6 +6684,742 @@ static void test_draw_geometry(void)
DestroyWindow(window);
}
+static void test_fill_geometry(void)
+{
+ ID2D1TransformedGeometry *transformed_geometry[4];
+ ID2D1RectangleGeometry *rect_geometry[2];
+ D2D1_POINT_2F point = {0.0f, 0.0f};
+ D2D1_ROUNDED_RECT rounded_rect;
+ ID2D1SolidColorBrush *brush;
+ ID2D1PathGeometry *geometry;
+ IDXGISwapChain *swapchain;
+ D2D1_MATRIX_3X2_F matrix;
+ ID2D1GeometrySink *sink;
+ ID2D1RenderTarget *rt;
+ ID3D10Device1 *device;
+ IDXGISurface *surface;
+ ID2D1Factory *factory;
+ D2D1_ELLIPSE ellipse;
+ D2D1_COLOR_F color;
+ D2D1_RECT_F rect;
+ ULONG refcount;
+ HWND window;
+ HRESULT hr;
+ BOOL match;
+
+ if (!(device = create_device()))
+ {
+ skip("Failed to create device, skipping tests.\n");
+ return;
+ }
+ window = create_window();
+ 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");
+ ID2D1RenderTarget_GetFactory(rt, &factory);
+
+ ID2D1RenderTarget_SetDpi(rt, 192.0f, 48.0f);
+ ID2D1RenderTarget_SetAntialiasMode(rt, D2D1_ANTIALIAS_MODE_ALIASED);
+ set_color(&color, 0.890f, 0.851f, 0.600f, 1.0f);
+ hr = ID2D1RenderTarget_CreateSolidColorBrush(rt, &color, NULL, &brush);
+ ok(SUCCEEDED(hr), "Failed to create brush, hr %#x.\n", hr);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ set_color(&color, 0.396f, 0.180f, 0.537f, 1.0f);
+ ID2D1RenderTarget_Clear(rt, &color);
+
+ set_rect(&rect, 40.0f, 480.0f, 40.0f, 480.0f);
+ ID2D1RenderTarget_FillRectangle(rt, &rect, (ID2D1Brush *)brush);
+ set_rect(&rect, 100.0f, 480.0f, 140.0f, 480.0f);
+ ID2D1RenderTarget_FillRectangle(rt, &rect, (ID2D1Brush *)brush);
+ set_rect(&rect, 200.0f, 400.0f, 200.0f, 560.0f);
+ ID2D1RenderTarget_FillRectangle(rt, &rect, (ID2D1Brush *)brush);
+ set_rect(&rect, 260.0f, 560.0f, 300.0f, 400.0f);
+ ID2D1RenderTarget_FillRectangle(rt, &rect, (ID2D1Brush *)brush);
+
+ set_ellipse(&ellipse, 40.0f, 800.0f, 0.0f, 0.0f);
+ ID2D1RenderTarget_FillEllipse(rt, &ellipse, (ID2D1Brush *)brush);
+ set_ellipse(&ellipse, 120.0f, 800.0f, 20.0f, 0.0f);
+ ID2D1RenderTarget_FillEllipse(rt, &ellipse, (ID2D1Brush *)brush);
+ set_ellipse(&ellipse, 200.0f, 800.0f, 0.0f, 80.0f);
+ ID2D1RenderTarget_FillEllipse(rt, &ellipse, (ID2D1Brush *)brush);
+ set_ellipse(&ellipse, 280.0f, 800.0f, 20.0f, 80.0f);
+ ID2D1RenderTarget_FillEllipse(rt, &ellipse, (ID2D1Brush *)brush);
+
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 0,
+ "qDJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCoMgAA");
+ ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 8,
+ "yjIMjwEWhwEcggEgfiR6KHYscy5xMG40azZpOGc6ZTxjPmI+YUBfQl1EXERbRlpGWUhYSFdKVkpV"
+ "TFRMVExTTlJOUk5STlJOUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUU5STlJOUk5STlNMVExUTFVK"
+ "VkpXSFhIWUZaRltEXERdQl9AYT5iPmM8ZTpnOGk2azRuMHEucyx2KHokfiCCARyHARaPAQzKMgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ set_color(&color, 0.396f, 0.180f, 0.537f, 1.0f);
+ ID2D1RenderTarget_Clear(rt, &color);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 160.0f, 40.0f, 160.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 100.0f, 160.0f, 140.0f, 160.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 200.0f, 80.0f, 200.0f, 240.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 260.0f, 240.0f, 300.0f, 80.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 480.0f, 40.0f, 480.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 100.0f, 480.0f, 140.0f, 480.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 200.0f, 400.0f, 200.0f, 560.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 260.0f, 560.0f, 300.0f, 400.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 800.0f, 40.0f, 800.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 100.0f, 800.0f, 140.0f, 800.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 200.0f, 720.0f, 200.0f, 880.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 260.0f, 880.0f, 300.0f, 720.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 0, 160, 160, 0xff652e89, 0,
+ "szI6YURZSlROUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUU5USllEYTqzMgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 2,
+ "tjI0aDxhQlxGWEpVTFNOUk5RUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFOUk5TTFVKWEZcQmA+ZzS2MgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 0,
+ "sDJAWkxSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJMWkCwMgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ set_color(&color, 0.396f, 0.180f, 0.537f, 1.0f);
+ ID2D1RenderTarget_Clear(rt, &color);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 160.0f, 40.0f, 160.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 100.0f, 160.0f, 140.0f, 160.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 200.0f, 80.0f, 200.0f, 240.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 260.0f, 240.0f, 300.0f, 80.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 480.0f, 40.0f, 480.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 100.0f, 480.0f, 140.0f, 480.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 200.0f, 400.0f, 200.0f, 560.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 260.0f, 560.0f, 300.0f, 400.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 800.0f, 40.0f, 800.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 100.0f, 800.0f, 140.0f, 800.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 200.0f, 720.0f, 200.0f, 880.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+ set_rounded_rect(&rounded_rect, 260.0f, 880.0f, 300.0f, 720.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_FillRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush);
+
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 0, 160, 160, 0xff652e89, 10,
+ "yjIMjwEWhwEcggEgfiR6KHYscy5xMG40azZpOGc6ZTxjPmI+YUBfQl1EXERbRlpGWUhYSFdKVkpV"
+ "TFRMVExTTlJOUk5STlJOUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUU5STlJOUk5STlNMVExUTFVK"
+ "VkpXSFhIWUZaRltEXERdQl9AYT5iPmM8ZTpnOGk2azRuMHEucyx2KHokfiCCARyHARaPAQzKMgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 10,
+ "uTIucDJsNmk4ZzplPGM+YUBgQF9CXkJdRFxEW0ZaRllIWEhXSlZKVkpWSlVMVExUTFRMU05STlJO"
+ "Uk5STlJOUk9QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFPUU5STlJOUk5STlJOU0xU"
+ "TFRMVExVSlZKVkpWSldIWEhZRlpGW0RcRF1CXkJfQGBAYT5jPGU6ZzhpNmwycC65MgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 10,
+ "vzIiczhhRldMUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkxXRmA6cSS+MgAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
+
+ set_point(&point, 40.0f, 160.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 120.0f, 160.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 120.0f, 160.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 200.0f, 160.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 280.0f, 160.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 280.0f, 160.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 20.0f, 480.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 60.0f, 480.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 120.0f, 400.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 120.0f, 560.0f);
+ line_to(sink, 120.0f, 400.0f);
+ line_to(sink, 120.0f, 560.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 180.0f, 480.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 220.0f, 480.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 280.0f, 400.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 280.0f, 560.0f);
+ line_to(sink, 280.0f, 400.0f);
+ line_to(sink, 280.0f, 560.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 20.0f, 880.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 40.0f, 720.0f);
+ line_to(sink, 60.0f, 880.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 100.0f, 720.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 120.0f, 880.0f);
+ line_to(sink, 140.0f, 720.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 180.0f, 880.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 200.0f, 720.0f);
+ line_to(sink, 220.0f, 880.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 260.0f, 720.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ line_to(sink, 280.0f, 880.0f);
+ line_to(sink, 300.0f, 720.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ ID2D1GeometrySink_SetFillMode(sink, D2D1_FILL_MODE_ALTERNATE);
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)geometry, (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+ ID2D1PathGeometry_Release(geometry);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 0, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 0, "gMgB");
+ ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 0,
+ "7zMCngECnQEEnAEEmwEGmgEGmQEImAEIlwEKlgEKlQEMlAEMkwEOkgEOkQEQkAEQjwESjgESjQEU"
+ "jAEUiwEWigEWiQEYiAEYhwEahgEahQEchAEcgwEeggEegQEggAEgfyJ+In0kfCR7JnomeSh4KHcq"
+ "dip1LHQscy5yLnEwcDBvMm4ybTRsNGs2ajZpOGg4ZzpmOmU8ZDxjPmI+YUBgQF9CXkJdRFxEW0Za"
+ "RllIWEhXSlZKVUxUTFNOUk5RUKgy");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 0,
+ "qDJQUU5STlNMVExVSlZKV0hYSFlGWkZbRFxEXUJeQl9AYEBhPmI+YzxkPGU6ZjpnOGg4aTZqNms0"
+ "bDRtMm4ybzBwMHEuci5zLHQsdSp2KncoeCh5JnomeyR8JH0ifiJ/IIABIIEBHoIBHoMBHIQBHIUB"
+ "GoYBGocBGIgBGIkBFooBFosBFIwBFI0BEo4BEo8BEJABEJEBDpIBDpMBDJQBDJUBCpYBCpcBCJgB"
+ "CJkBBpoBBpsBBJwBBJ0BAp4BAu8z");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 0,
+ "7zMCngECnQEEnAEEmwEGmgEGmQEImAEIlwEKlgEKlQEMlAEMkwEOkgEOkQEQkAEQjwESjgESjQEU"
+ "jAEUiwEWigEWiQEYiAEYhwEahgEahQEchAEcgwEeggEegQEggAEgfyJ+In0kfCR7JnomeSh4KHcq"
+ "dip1LHQscy5yLnEwcDBvMm4ybTRsNGs2ajZpOGg4ZzpmOmU8ZDxjPmI+YUBgQF9CXkJdRFxEW0Za"
+ "RllIWEhXSlZKVUxUTFNOUk5RUKgy");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 0,
+ "qDJQUU5STlNMVExVSlZKV0hYSFlGWkZbRFxEXUJeQl9AYEBhPmI+YzxkPGU6ZjpnOGg4aTZqNms0"
+ "bDRtMm4ybzBwMHEuci5zLHQsdSp2KncoeCh5JnomeyR8JH0ifiJ/IIABIIEBHoIBHoMBHIQBHIUB"
+ "GoYBGocBGIgBGIkBFooBFosBFIwBFI0BEo4BEo8BEJABEJEBDpIBDpMBDJQBDJUBCpYBCpcBCJgB"
+ "CJkBBpoBBpsBBJwBBJ0BAp4BAu8z");
+ ok(match, "Figure does not match.\n");
+
+ set_rect(&rect, 20.0f, 80.0f, 60.0f, 240.0f);
+ hr = ID2D1Factory_CreateRectangleGeometry(factory, &rect, &rect_geometry[0]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_rect(&rect, -1.0f, -1.0f, 1.0f, 1.0f);
+ hr = ID2D1Factory_CreateRectangleGeometry(factory, &rect, &rect_geometry[1]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 160.0f, 640.0f);
+ scale_matrix(&matrix, 40.0f, 160.0f);
+ rotate_matrix(&matrix, M_PI / -5.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)rect_geometry[1], &matrix, &transformed_geometry[0]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ scale_matrix(&matrix, 0.5f, 1.0f);
+ translate_matrix(&matrix, -80.0f, 0.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[0], &matrix, &transformed_geometry[1]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ rotate_matrix(&matrix, M_PI / 2.0f);
+ translate_matrix(&matrix, 80.0f, -320.0f);
+ scale_matrix(&matrix, 2.0f, 0.25f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)rect_geometry[0], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[0], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[1], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[2], (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+ ID2D1TransformedGeometry_Release(transformed_geometry[2]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[1]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[0]);
+ ID2D1RectangleGeometry_Release(rect_geometry[1]);
+ ID2D1RectangleGeometry_Release(rect_geometry[0]);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0,
+ "qDJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCoMgAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 320, 160, 0xff652e89, 32,
+ "sIMBA7cCDK8CFKYCHZ4CJJYCLY4CNYUCPv0BRvQBT+wBV+MBYNsBaNIBccoBecEBgQG6AYkBsQGS"
+ "AakBmgGgAaMBmAGrAY8BtAGHAbwBfsUBfcYBfcYBfcUBfsUBfcYBfcYBfcYBfcYBfcUBfr0BhgG0"
+ "AY8BrAGXAaMBoAGbAagBkgGwAYsBuAGCAcEBeskBcdIBadoBYOMBWOsBT/QBR/wBPoUCNowCLpUC"
+ "Jp0CHaYCFa4CDLcCBK+DAQAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 0, 160, 160, 320, 0xff652e89, 32,
+ "+D0BngEDnQEDnAEEmwEGmgEGmQEHmAEJlwEJlgELlAEMkwENkwEOkQEPkAEQkAERjgESjQETjQEU"
+ "iwEVigEXiQEXiAEYhwEahgEahQEbhAEdggEeggEegQEgfyF/In0jfCR8JXomeSd5KHcpdip2K3Qs"
+ "cy5xL3EvcDFuMm4ybTRrNWs1ajdoOGg5ZjplO2U8Yz1iPmFAYEBfQV5DXUNcRVpGWkZZSFdJV0lW"
+ "S1RMVExTTlFPUFFPUU5STVRMVEtVSldJV0hYR1pGWkVcQ11CXkJfQGA/YT9iPWM+Yj5jPWM+Yz1j"
+ "PWM+Yz1jPmI+Yz1jPmI+Yz1jPmM9Yz1jPmM9Yz5iPmM9Yz5iPmM9Yz5jPWM9Yz5jPWM+Yj5jPWM+"
+ "Yj5jPWI/YT9gQF9CXkJdRFtFW0VaR1hIV0lXSlVLVExUTVJOUVBQUE9RTlNNU0xUS1ZKVklXSFlG"
+ "WkZaRVxDXUNeQV9AYEBhPmI9Yz1kO2U6ZjpnOGg3ajVrNWs0bTJuMm4xcC9xL3Eucyx0LHUqdil3"
+ "KXgneSZ6JXwkfCN9In8hfyCBAR6CAR6CAR2EARuFARuFARqHARiIAReJAReKARWLARSNARONARKO"
+ "ARGQARCQAQ+RAQ6TAQ2TAQyUAQuWAQqWAQmYAQeZAQaaAQabAQScAQOdAQOeAQH4PQAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 320, 320, 0xff652e89, 32,
+ "sXkBvgIDvAIEugIHuAIJtgILswINsgIPrwISrQITrAIVqQIYpwIapQIbowIeoQIgngIjnAIkmwIm"
+ "mAIplgIqlQIskgIvkAIxjQIzjAI1igI3hwI5hgI7hAI9gQJA/wFB/QFE+wFG+QFI9gFK9QFM8wFO"
+ "8AFQ7wFS7AFV6gFX6AFY5gFb5AFd4gFf3wFh3gFj2wFm2QFn2AFp1QFs0wFu0QFvzwFyzQF0ygF3"
+ "yAF4xwF6xAF9wgF+wAGBAb4BgwG8AYUBuQGHAbgBiQG2AYsBswGOAbEBjwGvAZIBrQGUAasBlQGp"
+ "AZgBpwGaAaUBnAGiAZ4BoQGgAZ4BowGcAaUBmgGmAZgBqQGWAasBlAGsAZIBrwGQAbEBjQG0AYsB"
+ "tQGKAbcBhwG6AYUBvAGDAb0BgQHAAX/CAXzEAXvGAXvGAXvGAXvFAXvGAXvGAXvGAXvFAXvGAXvG"
+ "AXvFAXvGAXvGAXvGAXvFAXvGAXvGAXvFAXzFAXvGAXvGAXvFAXvGAXvGAXvGAXvFAXvGAXvGAXvF"
+ "AXzFAXvGAXvGAXvFAXvGAXvGAXvGAXvEAXzCAX/AAYEBvgGCAbwBhQG6AYcBtwGKAbUBiwG0AY0B"
+ "sQGQAa8BkgGtAZMBqwGWAakBmAGmAZoBpQGcAaMBngGgAaEBngGiAZ0BpAGaAacBmAGpAZUBqwGU"
+ "Aa0BkgGvAY8BsQGOAbMBjAG1AYkBuAGHAbkBhQG8AYMBvgGBAcABfsIBfcQBe8YBeMgBd8oBdM0B"
+ "cs8BcNABbtMBbNUBatcBZ9kBZtsBY94BYd8BYOEBXeQBW+YBWOgBV+oBVewBUu8BUPABT/IBTPUB"
+ "SvYBSPkBRvsBRP0BQf8BQIECPoMCO4YCOYcCN4oCNYwCM40CMZACL5ICLZQCKpYCKZgCJpsCJJ0C"
+ "Ip4CIKECHqMCHKQCGqcCGKkCFawCE60CEq8CD7ICDbMCDLUCCbgCB7oCBLwCA74CAbF5");
+ ok(match, "Figure does not match.\n");
+
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
+
+ set_point(&point, 20.0f, 80.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 40.0f, 80.0f, 60.0f, 80.0f);
+ quadratic_to(sink, 60.0f, 160.0f, 60.0f, 240.0f);
+ quadratic_to(sink, 40.0f, 240.0f, 20.0f, 240.0f);
+ quadratic_to(sink, 20.0f, 160.0f, 20.0f, 80.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 100.0f, 80.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 105.0f, 80.0f, 140.0f, 80.0f);
+ quadratic_to(sink, 140.0f, 100.0f, 140.0f, 240.0f);
+ quadratic_to(sink, 135.0f, 240.0f, 100.0f, 240.0f);
+ quadratic_to(sink, 100.0f, 220.0f, 100.0f, 80.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 180.0f, 80.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 215.0f, 80.0f, 220.0f, 80.0f);
+ quadratic_to(sink, 220.0f, 220.0f, 220.0f, 240.0f);
+ quadratic_to(sink, 185.0f, 240.0f, 180.0f, 240.0f);
+ quadratic_to(sink, 180.0f, 100.0f, 180.0f, 80.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 260.0f, 80.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 280.0f, 80.0f, 300.0f, 80.0f);
+ quadratic_to(sink, 300.0f, 160.0f, 300.0f, 240.0f);
+ quadratic_to(sink, 280.0f, 240.0f, 260.0f, 240.0f);
+ quadratic_to(sink, 260.0f, 160.0f, 260.0f, 80.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 20.0f, 400.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 40.0f, 420.0f, 60.0f, 400.0f);
+ quadratic_to(sink, 55.0f, 480.0f, 60.0f, 560.0f);
+ quadratic_to(sink, 40.0f, 540.0f, 20.0f, 560.0f);
+ quadratic_to(sink, 25.0f, 480.0f, 20.0f, 400.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 100.0f, 400.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 105.0f, 420.0f, 140.0f, 400.0f);
+ quadratic_to(sink, 135.0f, 420.0f, 140.0f, 560.0f);
+ quadratic_to(sink, 135.0f, 540.0f, 100.0f, 560.0f);
+ quadratic_to(sink, 105.0f, 540.0f, 100.0f, 400.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 180.0f, 400.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 215.0f, 420.0f, 220.0f, 400.0f);
+ quadratic_to(sink, 215.0f, 540.0f, 220.0f, 560.0f);
+ quadratic_to(sink, 185.0f, 540.0f, 180.0f, 560.0f);
+ quadratic_to(sink, 185.0f, 420.0f, 180.0f, 400.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 260.0f, 400.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 280.0f, 420.0f, 300.0f, 400.0f);
+ quadratic_to(sink, 295.0f, 480.0f, 300.0f, 560.0f);
+ quadratic_to(sink, 280.0f, 540.0f, 260.0f, 560.0f);
+ quadratic_to(sink, 265.0f, 480.0f, 260.0f, 400.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ set_point(&point, 20.0f, 720.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 40.0f, 700.0f, 60.0f, 720.0f);
+ quadratic_to(sink, 65.0f, 800.0f, 60.0f, 880.0f);
+ quadratic_to(sink, 40.0f, 900.0f, 20.0f, 880.0f);
+ quadratic_to(sink, 15.0f, 800.0f, 20.0f, 720.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 100.0f, 720.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 105.0f, 700.0f, 140.0f, 720.0f);
+ quadratic_to(sink, 145.0f, 740.0f, 140.0f, 880.0f);
+ quadratic_to(sink, 135.0f, 900.0f, 100.0f, 880.0f);
+ quadratic_to(sink, 95.0f, 860.0f, 100.0f, 720.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 180.0f, 720.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 215.0f, 700.0f, 220.0f, 720.0f);
+ quadratic_to(sink, 225.0f, 860.0f, 220.0f, 880.0f);
+ quadratic_to(sink, 185.0f, 900.0f, 180.0f, 880.0f);
+ quadratic_to(sink, 175.0f, 740.0f, 180.0f, 720.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 260.0f, 720.0f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, 280.0f, 700.0f, 300.0f, 720.0f);
+ quadratic_to(sink, 305.0f, 800.0f, 300.0f, 880.0f);
+ quadratic_to(sink, 280.0f, 900.0f, 260.0f, 880.0f);
+ quadratic_to(sink, 255.0f, 800.0f, 260.0f, 720.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_OPEN);
+
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)geometry, (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+ ID2D1PathGeometry_Release(geometry);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0,
+ "qDJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCoMgAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 160, 160, 0xff652e89, 0,
+ "qDJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCoMgAA");
+ match = compare_figure(surface, 320, 0, 160, 160, 0xff652e89, 0,
+ "qDJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCoMgAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 0, 160, 160, 0xff652e89, 0,
+ "qDJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ"
+ "UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCoMgAA");
+ ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 16,
+ "qDICTAJQB0IHUQs4C1IRLBFSGxgbUk5STlNMVExUTFRMVExVSlZKVkpWSlZKVkpXSFhIWEhYSFhI"
+ "WEhYSFhIWEhYSFlGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZa"
+ "RllIWEhYSFhIWEhYSFhIWEhYSFhIV0pWSlZKVkpWSlZKVUxUTFRMVExUTFNOUk5SGxgbUhEsEVIL"
+ "OAtRB0IHUAJMAqgy");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 16,
+ "qDIBSwRQAkMKUQQ5EVIIKxtTDRkmVExUTFRMVEtVS1VLVkpWSlZKVklXSVdJV0lXSVhIWEhYSFhI"
+ "WEhYSFhIWEhYSFhIWUdZR1lHWUdZR1lHWUdZR1lHWUdZSFhIWUdZR1lHWUdZR1lHWUdZR1lHWUdZ"
+ "SFhIWEhYSFhIWEhYSFhIWEhYSFhJV0lXSVdJV0lWSlZKVkpWS1VLVUtUTFRMVExUJhkNUxsrCFIR"
+ "OQRRCkMCUARLAagy");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 16,
+ "qDIESwFRCkMCUhE5BFIbKwhTJhkNVExUTFRMVUtVS1VLVUpWSlZKV0lXSVdJV0lXSVdIWEhYSFhI"
+ "WEhYSFhIWEhYSFhIWEdZR1lHWUdZR1lHWUdZR1lHWUdYSFhIWEdZR1lHWUdZR1lHWUdZR1lHWUdY"
+ "SFhIWEhYSFhIWEhYSFhIWEhYSFdJV0lXSVdJV0lXSlZKVkpVS1VLVUtVTFRMVExUDRkmUwgrG1IE"
+ "ORFSAkMKUQFLBKgy");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 16,
+ "qDICTAJQB0IHUQs4C1IRLBFSGxgbUk5STlNMVExUTFRMVExVSlZKVkpWSlZKVkpXSFhIWEhYSFhI"
+ "WEhYSFhIWEhYSFlGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZa"
+ "RllIWEhYSFhIWEhYSFhIWEhYSFhIV0pWSlZKVkpWSlZKVUxUTFRMVExUTFNOUk5SGxgbUhEsEVIL"
+ "OAtRB0IHUAJMAqgy");
+ ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 16,
+ "pCwYfixuOGNCWUxSUFBQT1JOUk5STlJOUk1UTFRMVExUTFRLVkpWSlZKVkpWSlZJWEhYSFhIWEhY"
+ "SFhIWEhYSFhIWEdaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpG"
+ "WkdYSFhIWEhYSFhIWEhYSFhIWEhYSVZKVkpWSlZKVkpWS1RMVExUTFRMVE1STlJOUk5STlJPUFBQ"
+ "UkxZQmM4bix+GKQs");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 16,
+ "liwZgQErcTllQ1xLVFBQUU9STlJNVExUTFRMVExVS1VLVUpWSlZKVkpXSVdJV0lXSVdIWEhYSFhI"
+ "WEhYSFhIWEhYSFhIWEdZR1lHWUdZR1lHWUdZR1lHWUdZR1hIWEdZR1lHWUdZR1lHWUdZR1lHWUdZ"
+ "R1hIWEhYSFhIWEhYSFhIWEhYSFhIV0lXSVdJV0lXSlZKVkpWSlVLVUtVTFRMVExUTFRNUk5ST1FQ"
+ "UFRLXENlOXErgQEZliwA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 16,
+ "sSwZeytrOV9DVktRUE9RTlJOUk1UTFRMVExUS1VLVUtVS1ZKVkpWSVdJV0lXSVdJV0lYSFhIWEhY"
+ "SFhIWEhYSFhIWEhYSFlHWUdZR1lHWUdZR1lHWUdZR1lIWEhYSFlHWUdZR1lHWUdZR1lHWUdZR1lI"
+ "WEhYSFhIWEhYSFhIWEhYSFhIWElXSVdJV0lXSVdJVkpWSlZLVUtVS1VLVExUTFRMVE1STlJOUU9Q"
+ "UUtWQ185ayt7GbEs");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 16,
+ "pCwYfixuOGNCWUxSUFBQT1JOUk5STlJOUk1UTFRMVExUTFRLVkpWSlZKVkpWSlZJWEhYSFhIWEhY"
+ "SFhIWEhYSFhIWEdaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpGWkZaRlpG"
+ "WkdYSFhIWEhYSFhIWEhYSFhIWEhYSVZKVkpWSlZKVkpWS1RMVExUTFRMVE1STlJOUk5STlJPUFBQ"
+ "UkxZQmM4bix+GKQs");
+ ok(match, "Figure does not match.\n");
+
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr);
+
+ set_point(&point, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f);
+ quadratic_to(sink, 0.008350f, 0.693614f, -0.052343f, 0.448886f);
+ quadratic_to(sink, -0.154236f, 0.246072f, -0.279229f, 0.025343f);
+ quadratic_to(sink, -0.370064f, -0.588586f, -0.383029f, -0.924114f);
+ quadratic_to(sink, -0.295479f, -0.958764f, -0.017086f, -0.988400f);
+ quadratic_to(sink, 0.208836f, -0.954157f, 0.272200f, -0.924114f);
+ quadratic_to(sink, 0.295614f, -0.569071f, 0.230143f, 0.022886f);
+ quadratic_to(sink, 0.101664f, 0.220643f, 0.012057f, 0.451571f);
+ quadratic_to(sink, -0.028764f, 0.709014f, 0.104029f, 0.833943f);
+ quadratic_to(sink, 0.319414f, 0.913057f, 0.403229f, 0.942628f);
+ quadratic_to(sink, 0.317721f, 1.023450f, -0.017086f, 1.021771f);
+ quadratic_to(sink, -0.310843f, 1.007472f, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 40.0f, 160.0f);
+ scale_matrix(&matrix, 20.0f, 80.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[0]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 160.0f, 640.0f);
+ scale_matrix(&matrix, 40.0f, 160.0f);
+ rotate_matrix(&matrix, M_PI / -5.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[1]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+ ID2D1PathGeometry_Release(geometry);
+
+ set_matrix_identity(&matrix);
+ scale_matrix(&matrix, 0.5f, 1.0f);
+ translate_matrix(&matrix, -80.0f, 0.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ set_matrix_identity(&matrix);
+ rotate_matrix(&matrix, M_PI / 2.0f);
+ translate_matrix(&matrix, 80.0f, -320.0f);
+ scale_matrix(&matrix, 2.0f, 0.25f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[2], &matrix, &transformed_geometry[3]);
+ ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[0], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[1], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[2], (ID2D1Brush *)brush, NULL);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)transformed_geometry[3], (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+ ID2D1TransformedGeometry_Release(transformed_geometry[3]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[2]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[1]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[0]);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 32,
+ "6DMNjgEWiAEahgEahgEahgEahgEahgEahgEahgEahgEahgEahgEahwEZhwEZhwEZhwEZhwEZhwEZ"
+ "hwEZhwEZhwEZiAEYiAEYiAEYiAEYiAEXiQEXiQEXiQEXigEWigEWigEWigEWigEWigEWigEWiwEU"
+ "jAEUjAEUjAEUjQESjgESjwEQkAEQkQEOkgENlAEMlQEKlgEKlwEImAEImQEHmQEGmwEFmwEEnQED"
+ "nQECngECngECnwEBnwEBnwEBnwEBnwEBnwECnQEDnQEDnQEEmwEFmgEHmQEHlwELkQERjAEXhgEd"
+ "hAEfgwEchgEXjwEMqTEA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 320, 160, 0xff652e89, 32,
+ "h58BBrYCDq0CF6QCIJwCKJMCMIwCNoUCPf8BQ/kBSPQBTu4BTe8BTPEBSfUBRvgBQf0BPYECOYUC"
+ "NIoCMI4CK+UBAS0W/AEHIwiPAgsaBZcCEAwIngIepAIaqAIWrAITsAIRsgIPtQIMtwILugIHwAIB"
+ "ypwB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 0, 160, 160, 320, 0xff652e89, 32,
+ "wW4DnAEEmwEFmgEHmAEIlwEKlQELlAEMkwEOkQEPkAEQkAERjgESjgETjAEUjAEUiwEWigEWiQEX"
+ "iQEYhwEZhwEZhgEbhQEbhAEchAEdggEeggEeggEfgAEggAEggAEhgAEggAEggQEggAEggAEggQEg"
+ "gAEggQEfgQEfggEfgQEfgQEfggEfgQEfggEeggEfggEeggEegwEdgwEeggEegwEdgwEegwEdgwEd"
+ "hAEchAEdhAEchAEchAEdhAEchAEchQEbhQEbhgEahgEahwEZhwEZiAEYiAEYiQEYiAEYiQEXiQEX"
+ "igEWigEWiwEViwEViwEVjAEUjAEUjQETjQETjgESjgETjgESjwERkAEQkQEPkwENlAEMlQELlgEK"
+ "lwEKlwEJmAEImQEHmgEGmwEFnAEEnQEEnQEDnQEDngECngEDngECngECnwECngECnwECngECngED"
+ "ngECEgGLAQMQAosBAw4EjAEDCwaMAQQJBo0BBQYIjQEHAgqNARKOARKPARCQARCQARCQAQ+RAQ6S"
+ "AQ6SAQ2TAQ2SAQ2TAQ2TAQyTAQyUAQyUAQuUAQuVAQuUAQuVAQqWAQmWAQqWAQmXAQiXAQiYAQeY"
+ "AQeZAQWbAQSDZwAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 320, 320, 0xff652e89, 32,
+ "g90BBLkCCLYCC7ICDrACEa0CFKoCF6cCGqQCHKMCHqECIJ8CIpwCJJsCJpkCKJcCKZYCK5QCLZIC"
+ "L5ACMI8CMo0CNIsCNYoCN4gCOYcCOYYCO4QCPYICPoECQIACQYACQIECQIACQIECQIECQIECP4IC"
+ "P4ICP4ECP4ICP4ICPoMCPoMCPoMCPYQCPYMCPYQCPYQCPYQCPIUCPIUCPIUCO4YCO4YCOoYCO4YC"
+ "OocCOocCOocCOYgCOYgCOIkCOIkCN4oCNosCNYwCNI0CM44CMo4CM44CMo8CMZACMJECL5ICLpMC"
+ "LZQCLJUCK5YCK5YCKpcCKZgCKJkCJ5oCJpsCJpsCJZwCJJ4CIqACIKICH6MCHaUCG6cCGakCF6wC"
+ "Fa0CE68CEbECD7MCDrQCDLYCCrgCCbkCB7sCBrsCBbwCBbwCBL0CBL0CBL0CBL0CA70CBL0CBL0C"
+ "BLwCBSUBlgIFIQSXAgYbCJcCBxcKmQIIEQ6ZAgoMEJoCDQUTnAIknAIjnQIingIhnwIgoAIfoQIe"
+ "ogIdowIcpAIbpQIapQIZpgIZpgIZpwIYpwIXqAIXqAIXqQIVqgIVqgIUqwITrQISrQIRrgIQsAIO"
+ "sQIMswILtQIIhs4B");
+ ok(match, "Figure does not match.\n");
+
+ ID2D1SolidColorBrush_Release(brush);
+ ID2D1RenderTarget_Release(rt);
+ refcount = ID2D1Factory_Release(factory);
+ ok(!refcount, "Factory has %u references left.\n", refcount);
+ IDXGISurface_Release(surface);
+ IDXGISwapChain_Release(swapchain);
+ ID3D10Device1_Release(device);
+ DestroyWindow(window);
+}
+
static void test_gdi_interop(void)
{
ID2D1GdiInteropRenderTarget *interop;
@@ -8491,6 +9227,7 @@ START_TEST(d2d1)
queue_test(test_stroke_style);
queue_test(test_gradient);
queue_test(test_draw_geometry);
+ queue_test(test_fill_geometry);
queue_test(test_gdi_interop);
queue_test(test_layer);
queue_test(test_bezier_intersect);
--
2.11.0
1
0
30 Jan '20
From: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Giovanni Mascellani <gio(a)debian.org>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 177525.
dlls/d2d1/tests/d2d1.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 189 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index c74cf115b02..2e76612e3ba 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -5761,6 +5761,7 @@ static void test_draw_geometry(void)
ID2D1TransformedGeometry *transformed_geometry[4];
ID2D1RectangleGeometry *rect_geometry[2];
D2D1_POINT_2F point = {0.0f, 0.0f};
+ D2D1_ROUNDED_RECT rounded_rect;
ID2D1SolidColorBrush *brush;
ID2D1PathGeometry *geometry;
IDXGISwapChain *swapchain;
@@ -5894,6 +5895,194 @@ static void test_draw_geometry(void)
"FRwVWxUaFV4VFhVhFhIWZBYOFmgXCBdsMnAudSh7IoMBGIQw");
todo_wine ok(match, "Figure does not match.\n");
+ ID2D1RenderTarget_BeginDraw(rt);
+ set_color(&color, 0.396f, 0.180f, 0.537f, 1.0f);
+ ID2D1RenderTarget_Clear(rt, &color);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 160.0f, 40.0f, 160.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 100.0f, 160.0f, 140.0f, 160.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 200.0f, 80.0f, 200.0f, 240.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 260.0f, 240.0f, 300.0f, 80.0f, 10.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 480.0f, 40.0f, 480.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 100.0f, 480.0f, 140.0f, 480.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 200.0f, 400.0f, 200.0f, 560.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 260.0f, 560.0f, 300.0f, 400.0f, 10.0f, 20.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 800.0f, 40.0f, 800.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 100.0f, 800.0f, 140.0f, 800.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 200.0f, 720.0f, 200.0f, 880.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 260.0f, 880.0f, 300.0f, 720.0f, 10.0f, 5.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "iGIQjgEUjAEUjgEQiGIA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 160, 160, 0xff652e89, 0, "yGBQSGA+ZDxkPmDgYQAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 0, 160, 160, 0xff652e89, 0,
+ "iDAQjgEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjgEQiDAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 0, 160, 160, 0xff652e89, 0,
+ "3C4oaUZVUExYRlxCHCgcPxU4FT0UPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FD0VOBU/YEJcRlhMUFVG7S8A");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "iGIQjgEUjAEUjgEQiGIA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "yGBQSGA+ZDxkPmDgYQAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0,
+ "iDAQjgEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjgEQiDAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 8,
+ "3C4obT5dSFRQTlRKGCgYRhYwFkMVNBVBFTYVPxU5FD4UOhQ9FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPRQ6FD4UOhQ/FTYVQRU0FUMWMBZGWEpVTVBTSltA8C8A");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 0, "iGIQjgEUjAEUjgEQiGIA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 0, "yGBQSGA+ZDxkPmDgYQAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 0,
+ "iDAQjgEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjgEQiDAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 0,
+ "3C4oZU5NWERgP2I9HigePBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZD1iP2BEWE1O6S8A");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ set_color(&color, 0.396f, 0.180f, 0.537f, 1.0f);
+ ID2D1RenderTarget_Clear(rt, &color);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 160.0f, 40.0f, 160.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 100.0f, 160.0f, 140.0f, 160.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 200.0f, 80.0f, 200.0f, 240.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 260.0f, 240.0f, 300.0f, 80.0f, 1000.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 480.0f, 40.0f, 480.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 100.0f, 480.0f, 140.0f, 480.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 200.0f, 400.0f, 200.0f, 560.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 260.0f, 560.0f, 300.0f, 400.0f, 10.0f, 1000.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+
+ set_rounded_rect(&rounded_rect, 40.0f, 800.0f, 40.0f, 800.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 100.0f, 800.0f, 140.0f, 800.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 200.0f, 720.0f, 200.0f, 880.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+ set_rounded_rect(&rounded_rect, 260.0f, 880.0f, 300.0f, 720.0f, 1000.0f, 10.0f);
+ ID2D1RenderTarget_DrawRoundedRectangle(rt, &rounded_rect, (ID2D1Brush *)brush, 10.0f, NULL);
+
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+
+ match = compare_figure(surface, 0, 0, 160, 160, 0xff652e89, 0, "iGIQjgEUjAEUjgEQiGIA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 0, 160, 160, 0xff652e89, 0, "yGBQSGA+ZDxkPmDgYQAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 0, 160, 160, 0xff652e89, 0,
+ "iDAQjgEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjgEQiDAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 0, 160, 160, 0xff652e89, 16,
+ "hDAYgwEieyh1LnAybBcIF2gWDhZkFhIWYRUWFV4WGRVbFRwVWRUeFVcVIBVVFSMUUxQmFFEVJxRP"
+ "FSgVTRUqFUwULBRLFC4USRUvFEgUMBRHFDIURhQyFEUUNBREFDQUQxQ2FEIUNhRBFDgUQBQ4FEAU"
+ "OBQ/FTkUPhQ6FD4UOhQ+FDoUPhQ6FD0UPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FD0UOhQ+FDoUPhQ6FD4UOhQ+FDoUPxQ4FEAUOBRAFDgUQRQ2FEIUNhRDFDQU"
+ "RBQ0FEUUMhRGFDIURxQwFEgUMBRJFC4USxQsFEwVKhVNFSgVTxQoFFEUJhRTFCQUVRUgFVcVHhVZ"
+ "FRwVWxUaFV4VFhVhFhIWZBYOFmgWChZsMnAudCp6IoMBGIQw");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "iGIQjgEUjAEUjgEQiGIA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "yGBQSGA+ZDxkPmDgYQAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0,
+ "iDAQjgEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjgEQiDAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 16,
+ "3C4obzpjQF5EWkhXFSAVVRQkFFMUJhRRFCgUTxQqFE0VKhVMFCwUSxQuFEoULhVIFDAUSBQwFUYU"
+ "MhRGFDIURRQ0FEQUNBRDFTQVQhQ2FEIUNhRCFDYUQRQ4FEAUOBRAFDgUQBQ4FD8UOhQ+FDoUPhQ6"
+ "FD4UOhQ+FDoUPhQ6FD0VOxQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBU7FD0UOhQ+FDoUPhQ6FD4UOhQ+FDoUPhQ6FD8UOBRA"
+ "FDgUQBQ4FEAUOBRBFDYUQhQ2FEIUNhRCFTQVQxQ0FEQUNBRFFDIURhQyFEYVMBVHFDAUSBUuFUkU"
+ "LhRLFCwUTBUrFE0UKhRPFCgUURQmFFMUJBRVSldIWUZdQWI78i8A");
+ todo_wine ok(match, "Figure does not match.\n");
+
+ match = compare_figure(surface, 0, 320, 160, 160, 0xff652e89, 0, "iGIQjgEUjAEUjgEQiGIA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 160, 320, 160, 160, 0xff652e89, 0, "yGBQSGA+ZDxkPmDgYQAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 320, 320, 160, 160, 0xff652e89, 0,
+ "iDAQjgEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
+ "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjgEQiDAA");
+ todo_wine ok(match, "Figure does not match.\n");
+ match = compare_figure(surface, 480, 320, 160, 160, 0xff652e89, 8,
+ "9i80ZERWUExYRV5AHCocPRY4FjwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
+ "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
+ "PBQ8FDwUPBQ8FDwUPBQ8FToVPRssG0BeRFpLUFVGYzT2LwAA");
+ todo_wine ok(match, "Figure does not match.\n");
+
hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
hr = ID2D1PathGeometry_Open(geometry, &sink);
--
2.11.0
1
0
[PATCH] server: Try to retrieve the unix name on handles created from file descriptors.
by Gabriel Ivăncescu 30 Jan '20
by Gabriel Ivăncescu 30 Jan '20
30 Jan '20
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46070
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
It also fixes the game Unity of Command II (same bug).
server/fd.c | 39 +++++++++++++++++++++++++++++++++++++++
server/file.c | 1 +
server/file.h | 2 ++
3 files changed, 42 insertions(+)
diff --git a/server/fd.c b/server/fd.c
index 5d80e21..2530287 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1922,6 +1922,45 @@ struct fd *create_anonymous_fd( const struct fd_ops *fd_user_ops, int unix_fd, s
return NULL;
}
+void set_unix_name_of_fd( struct fd *fd, const struct stat *fd_st )
+{
+#ifdef __linux__
+ static const char procfs_fmt[] = "/proc/self/fd/%d";
+
+ char path[PATH_MAX], procfs_path[sizeof(procfs_fmt) - 2 /* %d */ + 11];
+ struct stat path_st;
+ ssize_t len;
+
+ sprintf( procfs_path, procfs_fmt, fd->unix_fd );
+ len = readlink( procfs_path, path, sizeof(path) );
+ if (len == -1 || len >= sizeof(path) )
+ return;
+ path[len] = '\0';
+
+ /* Make sure it's an absolute path, has at least one hardlink, and the same inode */
+ if (path[0] != '/' || stat( path, &path_st ) || path_st.st_nlink < 1 ||
+ path_st.st_dev != fd_st->st_dev || path_st.st_ino != fd_st->st_ino)
+ return;
+
+ if (!(fd->unix_name = mem_alloc( len + 1 )))
+ return;
+ memcpy( fd->unix_name, path, len + 1 );
+
+#elif defined(F_GETPATH)
+ char path[PATH_MAX];
+ size_t size;
+
+ if (fcntl( fd->unix_fd, F_GETPATH, path ) == -1 || path[0] != '/')
+ return;
+
+ size = strlen(path) + 1;
+ if (!(fd->unix_name = mem_alloc( size )))
+ return;
+ memcpy( fd->unix_name, path, size );
+
+#endif
+}
+
/* retrieve the object that is using an fd */
void *get_fd_user( struct fd *fd )
{
diff --git a/server/file.c b/server/file.c
index 71b8448..1db6c7c 100644
--- a/server/file.c
+++ b/server/file.c
@@ -145,6 +145,7 @@ struct file *create_file_for_fd( int fd, unsigned int access, unsigned int shari
release_object( file );
return NULL;
}
+ set_unix_name_of_fd( file->fd, &st );
allow_fd_caching( file->fd );
return file;
}
diff --git a/server/file.h b/server/file.h
index 4341ad3..5c6054b 100644
--- a/server/file.h
+++ b/server/file.h
@@ -22,6 +22,7 @@
#define __WINE_SERVER_FILE_H
#include <sys/types.h>
+#include <sys/stat.h>
#include "object.h"
@@ -82,6 +83,7 @@ extern struct fd *open_fd( struct fd *root, const char *name, int flags, mode_t
unsigned int access, unsigned int sharing, unsigned int options );
extern struct fd *create_anonymous_fd( const struct fd_ops *fd_user_ops,
int unix_fd, struct object *user, unsigned int options );
+extern void set_unix_name_of_fd( struct fd *fd, const struct stat *fd_st );
extern struct fd *dup_fd_object( struct fd *orig, unsigned int access, unsigned int sharing,
unsigned int options );
extern struct fd *get_fd_object_for_mapping( struct fd *fd, unsigned int access, unsigned int sharing );
--
2.21.0
1
0
https://bugs.winehq.org/show_bug.cgi?id=48424
(note: the dll doesn`t export anything)
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
configure | 2 ++
configure.ac | 1 +
dlls/vga/Makefile.in | 6 ++++++
dlls/vga/version.rc | 28 ++++++++++++++++++++++++++++
dlls/vga/vga.spec | 0
5 files changed, 37 insertions(+)
create mode 100644 dlls/vga/Makefile.in
create mode 100644 dlls/vga/version.rc
create mode 100644 dlls/vga/vga.spec
diff --git a/configure b/configure
index 5fca5bd27f..89782da916 100755
--- a/configure
+++ b/configure
@@ -1612,6 +1612,7 @@ enable_vcruntime140
enable_vcruntime140_1
enable_vdmdbg
enable_version
+enable_vga
enable_virtdisk
enable_vssapi
enable_vulkan_1
@@ -20914,6 +20915,7 @@ wine_fn_config_makefile dlls/vdmdbg enable_vdmdbg
wine_fn_config_makefile dlls/ver.dll16 enable_win16
wine_fn_config_makefile dlls/version enable_version
wine_fn_config_makefile dlls/version/tests enable_tests
+wine_fn_config_makefile dlls/vga enable_vga
wine_fn_config_makefile dlls/virtdisk enable_virtdisk
wine_fn_config_makefile dlls/virtdisk/tests enable_tests
wine_fn_config_makefile dlls/vmm.vxd enable_win16
diff --git a/configure.ac b/configure.ac
index 36f65378a4..ba5c83cb6d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3723,6 +3723,7 @@ WINE_CONFIG_MAKEFILE(dlls/vdmdbg)
WINE_CONFIG_MAKEFILE(dlls/ver.dll16,enable_win16)
WINE_CONFIG_MAKEFILE(dlls/version)
WINE_CONFIG_MAKEFILE(dlls/version/tests)
+WINE_CONFIG_MAKEFILE(dlls/vga)
WINE_CONFIG_MAKEFILE(dlls/virtdisk)
WINE_CONFIG_MAKEFILE(dlls/virtdisk/tests)
WINE_CONFIG_MAKEFILE(dlls/vmm.vxd,enable_win16)
diff --git a/dlls/vga/Makefile.in b/dlls/vga/Makefile.in
new file mode 100644
index 0000000000..a2bf606488
--- /dev/null
+++ b/dlls/vga/Makefile.in
@@ -0,0 +1,6 @@
+MODULE = vga.dll
+
+EXTRADLLFLAGS = -mno-cygwin
+
+RC_SRCS = \
+ version.rc
diff --git a/dlls/vga/version.rc b/dlls/vga/version.rc
new file mode 100644
index 0000000000..4c63f7ef8a
--- /dev/null
+++ b/dlls/vga/version.rc
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2020 Louis Lenders
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine vga DLL"
+#define WINE_FILENAME_STR "vga.dll"
+
+/* these values come from Windows 7 SP1 */
+#define WINE_FILEVERSION 6,1,7600,16385
+#define WINE_FILEVERSION_STR "6.1.7600.16385"
+#define WINE_PRODUCTVERSION 6,1,7600,16385
+#define WINE_PRODUCTVERSION_STR "6.1.7600.16385"
+
+#include "wine/wine_common_ver.rc"
diff --git a/dlls/vga/vga.spec b/dlls/vga/vga.spec
new file mode 100644
index 0000000000..e69de29bb2
--
2.25.0
1
0
30 Jan '20
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/ole32/filemoniker.c | 9 ++++-----
dlls/ole32/tests/moniker.c | 6 +-----
2 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c
index 1e945f9a5f..6310a5acd5 100644
--- a/dlls/ole32/filemoniker.c
+++ b/dlls/ole32/filemoniker.c
@@ -666,7 +666,7 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
static const WCHAR bkSlash[]={'\\',0};
IBindCtx *bind=0;
int i=0,j=0,lastIdx1=0,lastIdx2=0;
- DWORD mkSys;
+ DWORD mkSys, order;
TRACE("(%p,%p,%d,%p)\n",iface,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
@@ -735,10 +735,9 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
return res;
}
- else if(mkSys==MKSYS_ANTIMONIKER){
-
- *ppmkComposite=NULL;
- return S_OK;
+ else if (is_anti_moniker(pmkRight, &order))
+ {
+ return order > 1 ? create_anti_moniker(order - 1, ppmkComposite) : S_OK;
}
else if (fOnlyIfNotGeneric){
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index ea1e5b1933..7b2dfcfe08 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -1958,16 +1958,12 @@ todo_wine
anti = create_antimoniker(2);
hr = IMoniker_ComposeWith(moniker1, anti, TRUE, &moniker2);
ok(hr == S_OK, "Failed to compose, hr %#x.\n", hr);
-todo_wine
- ok(!!moniker2, "Unexpected pointer.\n");
-if (moniker2)
-{
TEST_MONIKER_TYPE(moniker2, MKSYS_ANTIMONIKER);
hr = IMoniker_Hash(moniker2, &hash);
ok(hr == S_OK, "Failed to get hash, hr %#x.\n", hr);
ok(hash == 0x80000001, "Unexpected hash.\n");
IMoniker_Release(moniker2);
-}
+
IMoniker_Release(anti);
IMoniker_Release(moniker1);
--
2.24.1
2
6
30 Jan '20
https://bugs.winehq.org/show_bug.cgi?id=48122
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 +++++++++
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 1 +
include/ddk/wdm.h | 2 ++
3 files changed, 12 insertions(+)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 36637331c1..c85dbb7a7d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -3951,3 +3951,12 @@ PEPROCESS WINAPI IoGetRequestorProcess(IRP *irp)
TRACE("irp %p.\n", irp);
return irp->Tail.Overlay.Thread->kthread.process;
}
+
+/***********************************************************************
+ * RtlIsNtDdiVersionAvailable (NTOSKRNL.EXE.@)
+ */
+BOOLEAN WINAPI RtlIsNtDdiVersionAvailable(ULONG version)
+{
+ FIXME("stub: %d\n", version);
+ return FALSE;
+}
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index a39247811e..6b5b127a62 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -1117,6 +1117,7 @@
@ stub RtlIsGenericTableEmpty
@ stub RtlIsGenericTableEmptyAvl
@ stdcall RtlIsNameLegalDOS8Dot3(ptr ptr ptr)
+@ stdcall RtlIsNtDdiVersionAvailable(long)
@ stub RtlIsRangeAvailable
@ stub RtlIsValidOemCharacter
@ stdcall -arch=win32 -ret64 RtlLargeIntegerAdd(int64 int64)
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 5152a89842..53ea9e17cf 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1694,6 +1694,8 @@ HANDLE WINAPI PsGetProcessInheritedFromUniqueProcessId(PEPROCESS);
BOOLEAN WINAPI PsGetVersion(ULONG*,ULONG*,ULONG*,UNICODE_STRING*);
NTSTATUS WINAPI PsTerminateSystemThread(NTSTATUS);
+BOOLEAN WINAPI RtlIsNtDdiVersionAvailable(ULONG);
+
NTSTATUS WINAPI ZwAddBootEntry(PUNICODE_STRING,PUNICODE_STRING);
NTSTATUS WINAPI ZwAccessCheckAndAuditAlarm(PUNICODE_STRING,HANDLE,PUNICODE_STRING,PUNICODE_STRING,PSECURITY_DESCRIPTOR,ACCESS_MASK,PGENERIC_MAPPING,BOOLEAN,PACCESS_MASK,PBOOLEAN,PBOOLEAN);
NTSTATUS WINAPI ZwAdjustPrivilegesToken(HANDLE,BOOLEAN,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
--
2.25.0
1
0
[PATCH 1/4] ddraw: Update the primary stateblock in d3d_device1_SetMatrix().
by Zebediah Figura 30 Jan '20
by Zebediah Figura 30 Jan '20
30 Jan '20
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/ddraw/device.c | 45 +++++++++++++++++++++++++++++----------------
1 file changed, 29 insertions(+), 16 deletions(-)
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 0999c01cb2..f19d81ccea 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1332,18 +1332,19 @@ static HRESULT WINAPI d3d_device1_CreateMatrix(IDirect3DDevice *iface, D3DMATRIX
*
*****************************************************************************/
static HRESULT WINAPI d3d_device1_SetMatrix(IDirect3DDevice *iface,
- D3DMATRIXHANDLE D3DMatHandle, D3DMATRIX *D3DMatrix)
+ D3DMATRIXHANDLE matrix_handle, D3DMATRIX *matrix)
{
- struct d3d_device *This = impl_from_IDirect3DDevice(iface);
+ struct d3d_device *device = impl_from_IDirect3DDevice(iface);
D3DMATRIX *m;
- TRACE("iface %p, matrix_handle %#x, matrix %p.\n", iface, D3DMatHandle, D3DMatrix);
+ TRACE("iface %p, matrix_handle %#x, matrix %p.\n", iface, matrix_handle, matrix);
- if (!D3DMatrix) return DDERR_INVALIDPARAMS;
+ if (!matrix)
+ return DDERR_INVALIDPARAMS;
wined3d_mutex_lock();
- m = ddraw_get_object(&This->handle_table, D3DMatHandle - 1, DDRAW_HANDLE_MATRIX);
+ m = ddraw_get_object(&device->handle_table, matrix_handle - 1, DDRAW_HANDLE_MATRIX);
if (!m)
{
WARN("Invalid matrix handle.\n");
@@ -1352,21 +1353,33 @@ static HRESULT WINAPI d3d_device1_SetMatrix(IDirect3DDevice *iface,
}
if (TRACE_ON(ddraw))
- dump_D3DMATRIX(D3DMatrix);
+ dump_D3DMATRIX(matrix);
- *m = *D3DMatrix;
+ *m = *matrix;
- if (D3DMatHandle == This->world)
- wined3d_device_set_transform(This->wined3d_device,
- WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)D3DMatrix);
+ if (matrix_handle == device->world)
+ {
+ wined3d_stateblock_set_transform(device->state,
+ WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)matrix);
+ wined3d_device_set_transform(device->wined3d_device,
+ WINED3D_TS_WORLD_MATRIX(0), (struct wined3d_matrix *)matrix);
+ }
- if (D3DMatHandle == This->view)
- wined3d_device_set_transform(This->wined3d_device,
- WINED3D_TS_VIEW, (struct wined3d_matrix *)D3DMatrix);
+ if (matrix_handle == device->view)
+ {
+ wined3d_stateblock_set_transform(device->state,
+ WINED3D_TS_VIEW, (struct wined3d_matrix *)matrix);
+ wined3d_device_set_transform(device->wined3d_device,
+ WINED3D_TS_VIEW, (struct wined3d_matrix *)matrix);
+ }
- if (D3DMatHandle == This->proj)
- wined3d_device_set_transform(This->wined3d_device,
- WINED3D_TS_PROJECTION, (struct wined3d_matrix *)D3DMatrix);
+ if (matrix_handle == device->proj)
+ {
+ wined3d_stateblock_set_transform(device->state,
+ WINED3D_TS_PROJECTION, (struct wined3d_matrix *)matrix);
+ wined3d_device_set_transform(device->wined3d_device,
+ WINED3D_TS_PROJECTION, (struct wined3d_matrix *)matrix);
+ }
wined3d_mutex_unlock();
--
2.25.0
2
7