[PATCH v2 7/8] d2d1: Add tests for cubic-bezier path geometry.
Connor McAdams
conmanx360 at gmail.com
Fri May 15 14:03:20 CDT 2020
Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
---
dlls/d2d1/tests/d2d1.c | 357 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 357 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 7c0ee91099..a3fe5f10a8 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -2494,6 +2494,45 @@ static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink, unsigned int holl
ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
}
+static void fill_geometry_sink_cubic_bezier(ID2D1GeometrySink *sink, unsigned int hollow_count)
+{
+ D2D1_FIGURE_BEGIN begin;
+ unsigned int idx = 0;
+ D2D1_POINT_2F point;
+
+ set_point(&point, 25.0f, 220.0f);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
+ cubic_to(sink, 37.5f, 170.0f, 12.5f, 120.0f, 25.0f, 70.0f);
+ cubic_to(sink, 37.5f, 120.0f, 50.0f, 20.0f, 62.5f, 70.0f);
+ cubic_to(sink, 50.0f, 120.0f, 75.0f, 170.0f, 62.5f, 220.0f);
+ cubic_to(sink, 50.0f, 170.0f, 37.5f, 270.0f, 25.0f, 220.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 20.0f, 145.0f);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
+ cubic_to(sink, 55.0f, 0.0f, 35.0f, 0.0f, 70.0f, 145.0f);
+ cubic_to(sink, 35.0f, 290.0f, 55.0f, 290.0f, 20.0f, 145.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 25.0f, 672.0f);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
+ cubic_to(sink, 37.5f, 622.0f, 12.5f, 572.0f, 25.0f, 522.0f);
+ cubic_to(sink, 37.5f, 572.0f, 50.0f, 472.0f, 62.5f, 522.0f);
+ cubic_to(sink, 50.0f, 572.0f, 75.0f, 622.0f, 62.5f, 672.0f);
+ cubic_to(sink, 50.0f, 622.0f, 37.5f, 722.0f, 25.0f, 672.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ set_point(&point, 20.0f, 597.0f);
+ begin = idx++ < hollow_count ? D2D1_FIGURE_BEGIN_HOLLOW : D2D1_FIGURE_BEGIN_FILLED;
+ ID2D1GeometrySink_BeginFigure(sink, point, begin);
+ cubic_to(sink, 55.0f, 452.0f, 35.0f, 452.0f, 70.0f, 597.0f);
+ cubic_to(sink, 35.0f, 742.0f, 55.0f, 742.0f, 20.0f, 597.0f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+}
+
static void test_path_geometry(void)
{
ID2D1TransformedGeometry *transformed_geometry;
@@ -2786,6 +2825,154 @@ static void test_path_geometry(void)
/* Figure 28. */
{SEGMENT_LINE, {{{ 75.0f, 300.0f}}}},
{SEGMENT_LINE, {{{ 5.0f, 300.0f}}}},
+ /* Figure 29. */
+ {SEGMENT_BEZIER, {{{3.75000000e+01f, 1.70000000e+02f},
+ {1.25000000e+01f, 1.20000000e+02f},
+ {2.50000000e+01f, 7.00000000e+01f}}}},
+ {SEGMENT_BEZIER, {{{3.75000000e+01f, 1.20000000e+02f},
+ {5.00000000e+01f, 2.00000000e+01f},
+ {6.25000000e+01f, 7.00000000e+01f}}}},
+ {SEGMENT_BEZIER, {{{5.00000000e+01f, 1.20000000e+02f},
+ {7.50000000e+01f, 1.70000000e+02f},
+ {6.25000000e+01f, 2.20000000e+02f}}}},
+ {SEGMENT_BEZIER, {{{5.00000000e+01f, 1.70000000e+02f},
+ {3.75000000e+01f, 2.70000000e+02f},
+ {2.50000000e+01f, 2.20000000e+02f}}}},
+ /* Figure 30. */
+ {SEGMENT_BEZIER, {{{5.50000000e+01f, 0.00000000e+00f},
+ {3.50000000e+01f, 0.00000000e+00f},
+ {7.00000000e+01f, 1.45000000e+02f}}}},
+ {SEGMENT_BEZIER, {{{3.50000000e+01f, 2.90000000e+02f},
+ {5.50000000e+01f, 2.90000000e+02f},
+ {2.00000000e+01f, 1.45000000e+02f}}}},
+ /* Figure 31. */
+ {SEGMENT_BEZIER, {{{3.75000000e+01f, 6.22000000e+02f},
+ {1.25000000e+01f, 5.72000000e+02f},
+ {2.50000000e+01f, 5.22000000e+02f}}}},
+ {SEGMENT_BEZIER, {{{3.75000000e+01f, 5.72000000e+02f},
+ {5.00000000e+01f, 4.72000000e+02f},
+ {6.25000000e+01f, 5.22000000e+02f}}}},
+ {SEGMENT_BEZIER, {{{5.00000000e+01f, 5.72000000e+02f},
+ {7.50000000e+01f, 6.22000000e+02f},
+ {6.25000000e+01f, 6.72000000e+02f}}}},
+ {SEGMENT_BEZIER, {{{5.00000000e+01f, 6.22000000e+02f},
+ {3.75000000e+01f, 7.22000000e+02f},
+ {2.50000000e+01f, 6.72000000e+02f}}}},
+ /* Figure 32. */
+ {SEGMENT_BEZIER, {{{5.50000000e+01f, 4.52000000e+02f},
+ {3.50000000e+01f, 4.52000000e+02f},
+ {7.00000000e+01f, 5.97000000e+02f}}}},
+ {SEGMENT_BEZIER, {{{3.50000000e+01f, 7.42000000e+02f},
+ {5.50000000e+01f, 7.42000000e+02f},
+ {2.00000000e+01f, 5.97000000e+02f}}}},
+ /* Figure 33. */
+ {SEGMENT_LINE, {{{2.50000000e+01f, 7.00000000e+01f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 7.00000000e+01f}}}},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 7.00000000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 2.20000000e+02f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 2.20000000e+02f}}}},
+ {SEGMENT_LINE, {{{2.50000000e+01f, 2.20000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 34. */
+ {SEGMENT_LINE, {{{4.50000000e+01f, 3.62500000e+01f}}}},
+ {SEGMENT_LINE, {{{7.00000000e+01f, 1.45000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{4.50000000e+01f, 2.53750000e+02f}}}},
+ {SEGMENT_LINE, {{{2.00000000e+01f, 1.45000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 35. */
+ {SEGMENT_LINE, {{{2.50000000e+01f, 5.22000000e+02f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 5.22000000e+02f}}}},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 5.22000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 6.72000000e+02f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 6.72000000e+02f}}}},
+ {SEGMENT_LINE, {{{2.50000000e+01f, 6.72000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 36. */
+ {SEGMENT_LINE, {{{4.50000000e+01f, 4.88250000e+02f}}}},
+ {SEGMENT_LINE, {{{7.00000000e+01f, 5.97000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{4.50000000e+01f, 7.05750000e+02f}}}},
+ {SEGMENT_LINE, {{{2.00000000e+01f, 5.97000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 37. */
+ {SEGMENT_LINE, {{{2.50000000e+01f, 1.45000000e+02f}}}},
+ {SEGMENT_LINE, {{{2.50000000e+01f, 7.00000000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{3.43750000e+01f, 8.40625000e+01f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 7.00000000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.31250000e+01f, 5.59375000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 7.00000000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 1.45000000e+02f}}}},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 2.20000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.31250000e+01f, 2.05937500e+02f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 2.20000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{3.43750000e+01f, 2.34062500e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{2.50000000e+01f, 2.20000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 38. */
+ {SEGMENT_LINE, {{{3.76562500e+01f, 6.34375000e+01f}}}},
+ {SEGMENT_LINE, {{{4.50000000e+01f, 3.62500000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.23437500e+01f, 6.34375000e+01f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{7.00000000e+01f, 1.45000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.23437500e+01f, 2.26562500e+02f}}}},
+ {SEGMENT_LINE, {{{4.50000000e+01f, 2.53750000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{3.76562500e+01f, 2.26562500e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{2.00000000e+01f, 1.45000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 39. */
+ {SEGMENT_LINE, {{{2.50000000e+01f, 5.97000000e+02f}}}},
+ {SEGMENT_LINE, {{{2.50000000e+01f, 5.22000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{3.43750000e+01f, 5.36062500e+02f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 5.22000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.31250000e+01f, 5.07937500e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 5.22000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 5.97000000e+02f}}}},
+ {SEGMENT_LINE, {{{6.25000000e+01f, 6.72000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.31250000e+01f, 6.57937500e+02f}}}},
+ {SEGMENT_LINE, {{{4.37500000e+01f, 6.72000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{3.43750000e+01f, 6.86062500e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{2.50000000e+01f, 6.72000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 40. */
+ {SEGMENT_LINE, {{{3.76562500e+01f, 5.15437500e+02f}}}},
+ {SEGMENT_LINE, {{{4.50000000e+01f, 4.88250000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.23437500e+01f, 5.15437500e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{7.00000000e+01f, 5.97000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{5.23437500e+01f, 6.78562500e+02f}}}},
+ {SEGMENT_LINE, {{{4.50000000e+01f, 7.05750000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{3.76562500e+01f, 6.78562500e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ {SEGMENT_LINE, {{{2.00000000e+01f, 5.97000000e+02f}}}, D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN},
+ /* Figure 41. */
+ {SEGMENT_BEZIER, {{{1.96464462e+02f, 1.60274170e+02f},
+ {1.87625626e+02f, 5.42081528e+01f},
+ {2.05303299e+02f, 5.42081528e+01f}}}},
+ {SEGMENT_BEZIER, {{{2.05303299e+02f, 1.24918823e+02f},
+ {2.31819809e+02f, 8.95634918e+01f},
+ {2.31819809e+02f, 1.60274170e+02f}}}},
+ {SEGMENT_BEZIER, {{{2.14142136e+02f, 1.60274170e+02f},
+ {2.22980972e+02f, 2.66340179e+02f},
+ {2.05303299e+02f, 2.66340179e+02f}}}},
+ {SEGMENT_BEZIER, {{{2.05303299e+02f, 1.95629517e+02f},
+ {1.78786804e+02f, 2.30984833e+02f},
+ {1.78786804e+02f, 1.60274170e+02f}}}},
+ /* Figure 42. */
+ {SEGMENT_BEZIER, {{{2.38890869e+02f, 8.95634918e+01f},
+ {2.24748734e+02f, 3.29949493e+01f},
+ {2.23864853e+02f, 2.34520386e+02f}}}},
+ {SEGMENT_BEZIER, {{{1.73483490e+02f, 2.38055908e+02f},
+ {1.87625641e+02f, 2.94624451e+02f},
+ {1.88509521e+02f, 9.30990295e+01f}}}},
+ /* Figure 43. */
+ {SEGMENT_BEZIER, {{{1.16561401e+02f, 4.79886414e+02f},
+ {1.07722572e+02f, 3.73820404e+02f},
+ {1.25400238e+02f, 3.73820435e+02f}}}},
+ {SEGMENT_BEZIER, {{{1.25400238e+02f, 4.44531067e+02f},
+ {1.51916748e+02f, 4.09175751e+02f},
+ {1.51916733e+02f, 4.79886414e+02f}}}},
+ {SEGMENT_BEZIER, {{{1.34239075e+02f, 4.79886414e+02f},
+ {1.43077911e+02f, 5.85952454e+02f},
+ {1.25400238e+02f, 5.85952454e+02f}}}},
+ {SEGMENT_BEZIER, {{{1.25400238e+02f, 5.15241760e+02f},
+ {9.88837280e+01f, 5.50597107e+02f},
+ {9.88837280e+01f, 4.79886414e+02f}}}},
+ /* Figure 44. */
+ {SEGMENT_BEZIER, {{{1.58987808e+02f, 4.09175781e+02f},
+ {1.44845673e+02f, 3.52607239e+02f},
+ {1.43961792e+02f, 5.54132629e+02f}}}},
+ {SEGMENT_BEZIER, {{{9.35804291e+01f, 5.57668152e+02f},
+ {1.07722565e+02f, 6.14236694e+02f},
+ {1.08606453e+02f, 4.12711273e+02f}}}},
};
static const struct expected_geometry_figure expected_figures[] =
{
@@ -2829,6 +3016,30 @@ static void test_path_geometry(void)
{D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 612.0f}, 8, &expected_segments[164]},
/* 28 */
{D2D1_FIGURE_BEGIN_HOLLOW, D2D1_FIGURE_END_OPEN, { 40.0f, 20.0f}, 2, &expected_segments[172]},
+ /* 29 */
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 25.0f, 220.0f}, 4, &expected_segments[174]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 145.0f}, 2, &expected_segments[178]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 25.0f, 672.0f}, 4, &expected_segments[180]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 597.0f}, 2, &expected_segments[184]},
+ /* 33 */
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 25.0f, 220.0f}, 6, &expected_segments[186]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 145.0f}, 4, &expected_segments[192]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 25.0f, 672.0f}, 6, &expected_segments[196]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 597.0f}, 4, &expected_segments[202]},
+ /* 37 */
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 25.0f, 220.0f}, 12, &expected_segments[206]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 145.0f}, 8, &expected_segments[218]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 25.0f, 672.0f}, 12, &expected_segments[226]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED, { 20.0f, 597.0f}, 8, &expected_segments[238]},
+ /* 41 */
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED,
+ {1.78786804e+02f, 1.60274170e+02f}, 4, &expected_segments[246]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED,
+ {1.88509521e+02f, 9.30990295e+01f}, 2, &expected_segments[250]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED,
+ {9.88837280e+01f, 4.79886414e+02f}, 4, &expected_segments[252]},
+ {D2D1_FIGURE_BEGIN_FILLED, D2D1_FIGURE_END_CLOSED,
+ {1.08606453e+02f, 4.12711273e+02f}, 2, &expected_segments[256]},
};
if (!(device = create_device()))
@@ -3070,6 +3281,8 @@ static void test_path_geometry(void)
ID2D1PathGeometry_Release(geometry);
+
+
/* GetBounds() with bezier segments. */
hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr);
@@ -3087,6 +3300,12 @@ static void test_path_geometry(void)
ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
rect.left, rect.top, rect.right, rect.bottom);
+ ID2D1RenderTarget_BeginDraw(rt);
+ set_color(&color, 0.396f, 0.180f, 0.537f, 1.0f);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)geometry, (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+
set_matrix_identity(&matrix);
translate_matrix(&matrix, 80.0f, 640.0f);
scale_matrix(&matrix, 2.0f, 0.5f);
@@ -3556,7 +3775,145 @@ static void test_path_geometry(void)
ok(SUCCEEDED(hr), "Failed to simplify geometry, hr %#x.\n", hr);
geometry_sink_check(&simplify_sink, D2D1_FILL_MODE_ALTERNATE, 1, &expected_figures[28], 1);
geometry_sink_cleanup(&simplify_sink);
+ ID2D1PathGeometry_Release(geometry);
+
+ /* GetBounds() with cubic bezier segments. */
+ 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_cubic_bezier(sink, 0);
+ 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, 20.0f, 36.25f, 70.0f, 705.75f, 0);
+ 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, 120.0f, 658.125f, 220.0f, 992.875f, 0);
+ ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+
+ ID2D1PathGeometry_Release(geometry);
+
+ /* GetBounds() with cubic 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_cubic_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, 20.0f, 488.25f, 70.0f, 705.75f, 0);
+ 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, 120.0f, 884.125f, 220.0f, 992.875f, 0);
+ 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_cubic_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);
+ 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);
+ ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+ rect.left, rect.top, rect.right, rect.bottom);
+
+ ID2D1PathGeometry_Release(geometry);
+
+ /* Cubic bezier simplify tests. */
+ 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_cubic_bezier(sink, 0);
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr);
+ hr = ID2D1PathGeometry_GetFigureCount(geometry, &count);
+ ok(SUCCEEDED(hr), "Failed to get figure count, hr %#x.\n", hr);
+ ok(count == 4, "Got unexpected figure count %u.\n", count);
+ hr = ID2D1PathGeometry_GetSegmentCount(geometry, &count);
+ ok(SUCCEEDED(hr), "Failed to get segment count, hr %#x.\n", hr);
+ ok(count == 16, "Got unexpected segment count %u.\n", count);
+ ID2D1GeometrySink_Release(sink);
+
+ geometry_sink_init(&simplify_sink);
+ hr = ID2D1PathGeometry_Simplify(geometry, D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES,
+ NULL, 0.0f, &simplify_sink.ID2D1SimplifiedGeometrySink_iface);
+ ok(SUCCEEDED(hr), "Failed to simplify geometry, hr %#x.\n", hr);
+ geometry_sink_check(&simplify_sink, D2D1_FILL_MODE_ALTERNATE, 4, &expected_figures[29], 1);
+ geometry_sink_cleanup(&simplify_sink);
+ geometry_sink_init(&simplify_sink);
+ hr = ID2D1PathGeometry_Simplify(geometry, D2D1_GEOMETRY_SIMPLIFICATION_OPTION_LINES,
+ NULL, 100.0f, &simplify_sink.ID2D1SimplifiedGeometrySink_iface);
+ ok(SUCCEEDED(hr), "Failed to simplify geometry, hr %#x.\n", hr);
+ geometry_sink_check(&simplify_sink, D2D1_FILL_MODE_ALTERNATE, 4, &expected_figures[33], 1);
+ geometry_sink_cleanup(&simplify_sink);
+ geometry_sink_init(&simplify_sink);
+ hr = ID2D1PathGeometry_Simplify(geometry, D2D1_GEOMETRY_SIMPLIFICATION_OPTION_LINES,
+ NULL, 10.0f, &simplify_sink.ID2D1SimplifiedGeometrySink_iface);
+ ok(SUCCEEDED(hr), "Failed to simplify geometry, hr %#x.\n", hr);
+ geometry_sink_check(&simplify_sink, D2D1_FILL_MODE_ALTERNATE, 4, &expected_figures[37], 1);
+ geometry_sink_cleanup(&simplify_sink);
+ set_matrix_identity(&matrix);
+ scale_matrix(&matrix, 0.5f, 2.0f);
+ translate_matrix(&matrix, 400.0f, -33.0f);
+ rotate_matrix(&matrix, M_PI / 4.0f);
+ scale_matrix(&matrix, 2.0f, 0.5f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory, (ID2D1Geometry *)geometry, &matrix, &transformed_geometry);
+ ok(SUCCEEDED(hr), "Failed to create transformed geometry, hr %#x.\n", hr);
+
+ geometry_sink_init(&simplify_sink);
+ hr = ID2D1TransformedGeometry_Simplify(transformed_geometry, D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES,
+ NULL, 0.0f, &simplify_sink.ID2D1SimplifiedGeometrySink_iface);
+ ok(SUCCEEDED(hr), "Failed to simplify geometry, hr %#x.\n", hr);
+ geometry_sink_check(&simplify_sink, D2D1_FILL_MODE_ALTERNATE, 4, &expected_figures[41], 4);
+ geometry_sink_cleanup(&simplify_sink);
+ ID2D1TransformedGeometry_Release(transformed_geometry);
ID2D1PathGeometry_Release(geometry);
ID2D1SolidColorBrush_Release(brush);
--
2.20.1
More information about the wine-devel
mailing list