When a rectangle side has zero length, the miter join generator is confused because it cannot recover the join angle. This patch avoids that by using artificially non-degenerate previous and next vertices.
Signed-off-by: Giovanni Mascellani gio@debian.org --- dlls/d2d1/geometry.c | 19 ++++++++++++++----- dlls/d2d1/tests/d2d1.c | 6 +++--- 2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c index 6f4f4e5188..59f4e77d90 100644 --- a/dlls/d2d1/geometry.c +++ b/dlls/d2d1/geometry.c @@ -3789,7 +3789,7 @@ static const struct ID2D1RectangleGeometryVtbl d2d_rectangle_geometry_vtbl = HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory, const D2D1_RECT_F *rect) { struct d2d_face *f; - D2D1_POINT_2F *v; + D2D1_POINT_2F *v, v0p, v0n, v1p, v1n, v2p, v2n, v3p, v3n; float l, r, t, b;
d2d_geometry_init(geometry, factory, &identity, (ID2D1GeometryVtbl *)&d2d_rectangle_geometry_vtbl); @@ -3818,6 +3818,15 @@ HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory d2d_face_set(&f[1], 0, 2, 3); geometry->fill.face_count = 2;
+ d2d_point_set(&v0p, l+1.0f, t); + d2d_point_set(&v0n, l, t+1.0f); + d2d_point_set(&v1p, l, b-1.0f); + d2d_point_set(&v1n, l+1.0f, b); + d2d_point_set(&v2p, r-1.0f, b); + d2d_point_set(&v2n, r, b-1.0f); + d2d_point_set(&v3p, r, t+1.0f); + d2d_point_set(&v3n, r-1.0f, t); + if (!d2d_geometry_outline_add_line_segment(geometry, &v[0], &v[1])) goto fail; if (!d2d_geometry_outline_add_line_segment(geometry, &v[1], &v[2])) @@ -3827,13 +3836,13 @@ HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory if (!d2d_geometry_outline_add_line_segment(geometry, &v[3], &v[0])) goto fail;
- if (!d2d_geometry_outline_add_join(geometry, &v[3], &v[0], &v[1])) + if (!d2d_geometry_outline_add_join(geometry, &v0p, &v[0], &v0n)) goto fail; - if (!d2d_geometry_outline_add_join(geometry, &v[0], &v[1], &v[2])) + if (!d2d_geometry_outline_add_join(geometry, &v1p, &v[1], &v1n)) goto fail; - if (!d2d_geometry_outline_add_join(geometry, &v[1], &v[2], &v[3])) + if (!d2d_geometry_outline_add_join(geometry, &v2p, &v[2], &v2n)) goto fail; - if (!d2d_geometry_outline_add_join(geometry, &v[2], &v[3], &v[0])) + if (!d2d_geometry_outline_add_join(geometry, &v3p, &v[3], &v3n)) goto fail;
return S_OK; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 60dfb924cb..42cf524deb 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -5889,16 +5889,16 @@ static void test_draw_geometry(void) ok(match, "Figure does not match.\n");
match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "5mAUjAEUjAEUjAEUjAEUhmIA"); - todo_wine ok(match, "Figure does not match.\n"); + ok(match, "Figure does not match.\n"); match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "vmBkPGQ8ZDxkPGTeYQAA"); - todo_wine ok(match, "Figure does not match.\n"); + ok(match, "Figure does not match.\n"); match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0, "5i4UjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU" "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU" "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU" "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU" "jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUhjAA"); - todo_wine ok(match, "Figure does not match.\n"); + ok(match, "Figure does not match.\n"); match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 0, "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=63111
Your paranoid android.
=== w2008s64 (task log) ===
Task errors: The previous 1 run(s) terminated abnormally
=== debian10 (32 bit report) ===
Report errors: d2d1:d2d1 has no test summary line (early exit of the main process?) d2d1:d2d1 has unaccounted for todo messages
=== debian10 (32 bit Chinese:China report) ===
Report errors: d2d1:d2d1 has no test summary line (early exit of the main process?) d2d1:d2d1 has unaccounted for todo messages
=== debian10 (build log) ===
X Error of failed request: GLXBadFBConfig Major opcode of failed request: 150 (GLX) Minor opcode of failed request: 34 () X Error of failed request: GLXBadFBConfig Major opcode of failed request: 150 (GLX) Minor opcode of failed request: 34 ()