[PATCH] d2d1: Use transformed geometry to translate glyph run outline

Nikolay Sivov nsivov at codeweavers.com
Fri Oct 28 06:23:46 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d2d1/render_target.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index 798dd0d..b143958 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -873,8 +873,9 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_DrawTextLayout(ID2D1RenderTa
 static void d2d_rt_draw_glyph_run_outline(struct d2d_d3d_render_target *render_target,
         D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run, ID2D1Brush *brush)
 {
-    D2D1_MATRIX_3X2_F *transform, prev_transform;
+    ID2D1TransformedGeometry *transformed_geometry;
     ID2D1PathGeometry *geometry;
+    D2D1_MATRIX_3X2_F transform;
     ID2D1GeometrySink *sink;
     HRESULT hr;
 
@@ -905,15 +906,25 @@ static void d2d_rt_draw_glyph_run_outline(struct d2d_d3d_render_target *render_t
         ERR("Failed to close geometry sink, hr %#x.\n", hr);
     ID2D1GeometrySink_Release(sink);
 
-    transform = &render_target->drawing_state.transform;
-    prev_transform = *transform;
-    transform->_31 += baseline_origin.x * transform->_11 + baseline_origin.y * transform->_21;
-    transform->_32 += baseline_origin.x * transform->_12 + baseline_origin.y * transform->_22;
-    d2d_rt_fill_geometry(render_target, unsafe_impl_from_ID2D1Geometry((ID2D1Geometry *)geometry),
+    transform._11 = 1.0f;
+    transform._12 = 0.0f;
+    transform._21 = 0.0f;
+    transform._22 = 1.0f;
+    transform._31 = baseline_origin.x;
+    transform._32 = baseline_origin.y;
+    hr = ID2D1Factory_CreateTransformedGeometry(render_target->factory, (ID2D1Geometry *)geometry,
+            &transform, &transformed_geometry);
+    ID2D1PathGeometry_Release(geometry);
+    if (FAILED(hr))
+    {
+        ERR("Failed to create transformed glyph run geometry, hr %#x.\n", hr);
+        return;
+    }
+
+    d2d_rt_fill_geometry(render_target, unsafe_impl_from_ID2D1Geometry((ID2D1Geometry *)transformed_geometry),
             unsafe_impl_from_ID2D1Brush(brush), NULL);
-    *transform = prev_transform;
 
-    ID2D1PathGeometry_Release(geometry);
+    ID2D1TransformedGeometry_Release(transformed_geometry);
 }
 
 static void d2d_rt_draw_glyph_run_bitmap(struct d2d_d3d_render_target *render_target,
-- 
2.9.3




More information about the wine-patches mailing list