Henri Verbeet : d2d1: Take the source transformation into account when creating a transformed geometry.

Alexandre Julliard julliard at winehq.org
Fri Feb 3 13:31:34 CST 2017


Module: wine
Branch: master
Commit: d10dfd41021ce4b6c68f66b239a5313b018dae54
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d10dfd41021ce4b6c68f66b239a5313b018dae54

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Feb  3 13:37:12 2017 +0100

d2d1: Take the source transformation into account when creating a transformed geometry.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d2d1/d2d1_private.h |  1 +
 dlls/d2d1/geometry.c     | 11 ++++++++---
 dlls/d2d1/tests/d2d1.c   |  4 ++--
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 2274a8e..336be96 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -366,6 +366,7 @@ struct d2d_geometry
         struct
         {
             ID2D1Geometry *src_geometry;
+            D2D_MATRIX_3X2_F transform;
         } transformed;
     } u;
 };
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 79250ab..b268b7d 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -3090,7 +3090,7 @@ static void STDMETHODCALLTYPE d2d_transformed_geometry_GetTransform(ID2D1Transfo
 
     TRACE("iface %p, transform %p.\n", iface, transform);
 
-    *transform = geometry->transform;
+    *transform = geometry->u.transformed.transform;
 }
 
 static const struct ID2D1TransformedGeometryVtbl d2d_transformed_geometry_vtbl =
@@ -3120,10 +3120,15 @@ void d2d_transformed_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *
         ID2D1Geometry *src_geometry, const D2D_MATRIX_3X2_F *transform)
 {
     struct d2d_geometry *src_impl;
+    D2D_MATRIX_3X2_F g;
 
-    d2d_geometry_init(geometry, factory, transform, (ID2D1GeometryVtbl *)&d2d_transformed_geometry_vtbl);
-    ID2D1Geometry_AddRef(geometry->u.transformed.src_geometry = src_geometry);
     src_impl = unsafe_impl_from_ID2D1Geometry(src_geometry);
+
+    g = src_impl->transform;
+    d2d_matrix_multiply(&g, transform);
+    d2d_geometry_init(geometry, factory, &g, (ID2D1GeometryVtbl *)&d2d_transformed_geometry_vtbl);
+    ID2D1Geometry_AddRef(geometry->u.transformed.src_geometry = src_geometry);
+    geometry->u.transformed.transform = *transform;
     geometry->fill = src_impl->fill;
     geometry->outline = src_impl->outline;
 }
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 9a11f10..7dccbd7 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -3817,7 +3817,7 @@ static void test_draw_geometry(void)
             "ATNaJogBM2IlgAEzayV4M3MlbzN8JWczhAElXjONASVWM5UBJU0zngElRTOmASU8M68BJTQztgEm"
             "KzO/ASUkM8cBJRsz0AElEzPYASUKM+EBJQIz6QFR8gFJ+gFAgwI4igIwkwIomwIfpAIXrAIOtQIG"
             "8XYA");
-    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, 32,
             "ujEBngECnQEDnQEEmwEFmgEHmQEHmAEIlwEKlgEKlQELlAENkwENkgEOkQEQjwERjwESjQETjAEU"
             "jAEKAQqKAQoCCokBCgMKiQEKBAqHAQoFCoYBCgYKhgEKBwqEAQoICoMBCgkKgwEKCgqBAQoLCoAB"
@@ -3836,7 +3836,7 @@ static void test_draw_geometry(void)
             "ChcKdQoWCncKFAp4ChQKeAoTCnoKEQp7ChALewoQCn0KDgp+Cg0LfgoNCoABCgsKgQEKCgqDAQoJ"
             "CoMBCggKhAEKBwqGAQoGCoYBCgUKhwEKBAqJAQoDCokBCgIKigEKAQqMARSMARONARKPARGPARCR"
             "AQ6SAQ2TAQ2UAQuVAQqWAQqXAQiYAQeZAQeaAQWbAQSdAQOdAQKeAQG6MQAA");
-    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, 64,
             "82ICvQIEugIHuAIJtgIKtAINsgIPsAIRrQITrAIVqQIYpwIZpgIbowIeoQIgnwIhnQIkmwImmAIp"
             "lgIVARSVAhUDFJICFQUVkAIVBxSPAhUJFIwCFQwUigIVDRWHAhYPFIYCFRIUhAIVFBSBAhUWFf8B"




More information about the wine-cvs mailing list