[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