Nikolay Sivov : d2d1: Pass current text antialias mode down to IDWriteGlyphRunAnalysis.

Alexandre Julliard julliard at winehq.org
Tue Jul 18 13:58:54 CDT 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Jul 18 09:46:15 2017 +0300

d2d1: Pass current text antialias mode down to IDWriteGlyphRunAnalysis.

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

---

 dlls/d2d1/render_target.c | 54 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 15 deletions(-)

diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index 71eaf3d..86a73f5 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -1090,7 +1090,8 @@ static void d2d_rt_draw_glyph_run_outline(struct d2d_d3d_render_target *render_t
 
 static void d2d_rt_draw_glyph_run_bitmap(struct d2d_d3d_render_target *render_target,
         D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run, ID2D1Brush *brush,
-        float ppd, DWRITE_RENDERING_MODE rendering_mode, DWRITE_MEASURING_MODE measuring_mode)
+        float ppd, DWRITE_RENDERING_MODE rendering_mode, DWRITE_MEASURING_MODE measuring_mode,
+        DWRITE_TEXT_ANTIALIAS_MODE antialias_mode)
 {
     D2D1_MATRIX_3X2_F prev_transform, *transform;
     ID2D1RectangleGeometry *geometry = NULL;
@@ -1100,7 +1101,8 @@ static void d2d_rt_draw_glyph_run_bitmap(struct d2d_d3d_render_target *render_ta
     IDWriteGlyphRunAnalysis *analysis;
     DWRITE_TEXTURE_TYPE texture_type;
     D2D1_BRUSH_PROPERTIES brush_desc;
-    IDWriteFactory *dwrite_factory;
+    IDWriteFactory2 *dwrite_factory;
+    DWRITE_GLYPH_RUN scaled_run;
     void *opacity_values = NULL;
     size_t opacity_values_size;
     D2D1_SIZE_U bitmap_size;
@@ -1109,16 +1111,19 @@ static void d2d_rt_draw_glyph_run_bitmap(struct d2d_d3d_render_target *render_ta
     HRESULT hr;
 
     if (FAILED(hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
-            &IID_IDWriteFactory, (IUnknown **)&dwrite_factory)))
+            &IID_IDWriteFactory2, (IUnknown **)&dwrite_factory)))
     {
         ERR("Failed to create dwrite factory, hr %#x.\n", hr);
         return;
     }
 
-    hr = IDWriteFactory_CreateGlyphRunAnalysis(dwrite_factory, glyph_run, ppd,
+    scaled_run = *glyph_run;
+    scaled_run.fontEmSize *= ppd;
+    hr = IDWriteFactory2_CreateGlyphRunAnalysis(dwrite_factory, &scaled_run,
             (DWRITE_MATRIX *)&render_target->drawing_state.transform, rendering_mode, measuring_mode,
-            baseline_origin.x, baseline_origin.y, &analysis);
-    IDWriteFactory_Release(dwrite_factory);
+            DWRITE_GRID_FIT_MODE_DEFAULT, antialias_mode, baseline_origin.x,
+            baseline_origin.y, &analysis);
+    IDWriteFactory2_Release(dwrite_factory);
     if (FAILED(hr))
     {
         ERR("Failed to create glyph run analysis, hr %#x.\n", hr);
@@ -1216,6 +1221,7 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_DrawGlyphRun(ID2D1RenderTarg
         DWRITE_MEASURING_MODE measuring_mode)
 {
     struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
+    DWRITE_TEXT_ANTIALIAS_MODE antialias_mode = DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE;
     IDWriteRenderingParams *rendering_params;
     DWRITE_RENDERING_MODE rendering_mode;
     HRESULT hr;
@@ -1227,24 +1233,42 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_DrawGlyphRun(ID2D1RenderTarg
     if (FAILED(render_target->error.code))
         return;
 
-    if (render_target->drawing_state.textAntialiasMode != D2D1_TEXT_ANTIALIAS_MODE_DEFAULT)
-        FIXME("Ignoring text antialiasing mode %#x.\n", render_target->drawing_state.textAntialiasMode);
-
-    ppd = max(render_target->desc.dpiX, render_target->desc.dpiY) / 96.0f;
     rendering_params = render_target->text_rendering_params ? render_target->text_rendering_params
             : render_target->default_text_rendering_params;
-    if (FAILED(hr = IDWriteFontFace_GetRecommendedRenderingMode(glyph_run->fontFace, glyph_run->fontEmSize,
-            ppd, measuring_mode, rendering_params, &rendering_mode)))
+
+    rendering_mode = DWRITE_RENDERING_MODE_DEFAULT;
+    switch (render_target->drawing_state.textAntialiasMode)
     {
-        ERR("Failed to get recommended rendering mode, hr %#x.\n", hr);
-        rendering_mode = DWRITE_RENDERING_MODE_OUTLINE;
+    case D2D1_TEXT_ANTIALIAS_MODE_DEFAULT:
+        if (IDWriteRenderingParams_GetClearTypeLevel(rendering_params) > 0.0f)
+            antialias_mode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
+        break;
+    case D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE:
+        antialias_mode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
+        break;
+    case D2D1_TEXT_ANTIALIAS_MODE_ALIASED:
+        rendering_mode = DWRITE_RENDERING_MODE_ALIASED;
+        break;
+    default:
+        ;
+    }
+
+    ppd = max(render_target->desc.dpiX, render_target->desc.dpiY) / 96.0f;
+    if (rendering_mode == DWRITE_RENDERING_MODE_DEFAULT)
+    {
+        if (FAILED(hr = IDWriteFontFace_GetRecommendedRenderingMode(glyph_run->fontFace, glyph_run->fontEmSize,
+                ppd, measuring_mode, rendering_params, &rendering_mode)))
+        {
+            ERR("Failed to get recommended rendering mode, hr %#x.\n", hr);
+            rendering_mode = DWRITE_RENDERING_MODE_OUTLINE;
+        }
     }
 
     if (rendering_mode == DWRITE_RENDERING_MODE_OUTLINE)
         d2d_rt_draw_glyph_run_outline(render_target, baseline_origin, glyph_run, brush);
     else
         d2d_rt_draw_glyph_run_bitmap(render_target, baseline_origin, glyph_run, brush,
-                ppd, rendering_mode, measuring_mode);
+                ppd, rendering_mode, measuring_mode, antialias_mode);
 }
 
 static void STDMETHODCALLTYPE d2d_d3d_render_target_SetTransform(ID2D1RenderTarget *iface,




More information about the wine-cvs mailing list