Nikolay Sivov : d2d1: Implement d2d_device_context_ID2D1DeviceContext_DrawGlyphRun().
Alexandre Julliard
julliard at winehq.org
Tue Oct 23 16:10:01 CDT 2018
Module: wine
Branch: master
Commit: 7ef66068f21f338f5331a12d6886496f108f19fe
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7ef66068f21f338f5331a12d6886496f108f19fe
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Oct 23 12:36:42 2018 +0330
d2d1: Implement d2d_device_context_ID2D1DeviceContext_DrawGlyphRun().
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/device.c | 158 +++++++++++++++++++++++++++--------------------------
1 file changed, 81 insertions(+), 77 deletions(-)
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index 2593413..0e96224 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1344,85 +1344,10 @@ static void STDMETHODCALLTYPE d2d_device_context_DrawGlyphRun(ID2D1DeviceContext
D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run, ID2D1Brush *brush,
DWRITE_MEASURING_MODE measuring_mode)
{
- struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
- DWRITE_TEXT_ANTIALIAS_MODE antialias_mode = DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE;
- IDWriteRenderingParams *rendering_params;
- DWRITE_RENDERING_MODE rendering_mode;
- HRESULT hr;
-
TRACE("iface %p, baseline_origin %s, glyph_run %p, brush %p, measuring_mode %#x.\n",
iface, debug_d2d_point_2f(&baseline_origin), glyph_run, brush, measuring_mode);
- if (FAILED(context->error.code))
- return;
-
- rendering_params = context->text_rendering_params ? context->text_rendering_params
- : context->default_text_rendering_params;
-
- rendering_mode = IDWriteRenderingParams_GetRenderingMode(rendering_params);
-
- switch (context->drawing_state.textAntialiasMode)
- {
- case D2D1_TEXT_ANTIALIAS_MODE_ALIASED:
- if (rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL
- || rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC
- || rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL
- || rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC)
- {
- d2d_device_context_set_error(context, E_INVALIDARG);
- }
- break;
- case D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE:
- if (rendering_mode == DWRITE_RENDERING_MODE_ALIASED
- || rendering_mode == DWRITE_RENDERING_MODE_OUTLINE)
- {
- d2d_device_context_set_error(context, E_INVALIDARG);
- }
- break;
- case D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE:
- if (rendering_mode == DWRITE_RENDERING_MODE_ALIASED)
- d2d_device_context_set_error(context, E_INVALIDARG);
- break;
- default:
- ;
- }
-
- if (FAILED(context->error.code))
- return;
-
- rendering_mode = DWRITE_RENDERING_MODE_DEFAULT;
- switch (context->drawing_state.textAntialiasMode)
- {
- 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:
- ;
- }
-
- if (rendering_mode == DWRITE_RENDERING_MODE_DEFAULT)
- {
- if (FAILED(hr = IDWriteFontFace_GetRecommendedRenderingMode(glyph_run->fontFace, glyph_run->fontEmSize,
- max(context->desc.dpiX, context->desc.dpiY) / 96.0f,
- 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_device_context_draw_glyph_run_outline(context, baseline_origin, glyph_run, brush);
- else
- d2d_device_context_draw_glyph_run_bitmap(context, baseline_origin, glyph_run, brush,
- rendering_mode, measuring_mode, antialias_mode);
+ ID2D1DeviceContext_DrawGlyphRun(iface, baseline_origin, glyph_run, NULL, brush, measuring_mode);
}
static void STDMETHODCALLTYPE d2d_device_context_SetTransform(ID2D1DeviceContext *iface,
@@ -2145,8 +2070,87 @@ static void STDMETHODCALLTYPE d2d_device_context_ID2D1DeviceContext_DrawGlyphRun
D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run,
const DWRITE_GLYPH_RUN_DESCRIPTION *glyph_run_desc, ID2D1Brush *brush, DWRITE_MEASURING_MODE measuring_mode)
{
- FIXME("iface %p, baseline_origin %s, glyph_run %p, glyph_run_desc %p, brush %p, measuring_mode %#x stub!\n",
+ DWRITE_TEXT_ANTIALIAS_MODE antialias_mode = DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE;
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+ IDWriteRenderingParams *rendering_params;
+ DWRITE_RENDERING_MODE rendering_mode;
+ HRESULT hr;
+
+ TRACE("iface %p, baseline_origin %s, glyph_run %p, glyph_run_desc %p, brush %p, measuring_mode %#x.\n",
iface, debug_d2d_point_2f(&baseline_origin), glyph_run, glyph_run_desc, brush, measuring_mode);
+
+ if (FAILED(context->error.code))
+ return;
+
+ rendering_params = context->text_rendering_params ? context->text_rendering_params
+ : context->default_text_rendering_params;
+
+ rendering_mode = IDWriteRenderingParams_GetRenderingMode(rendering_params);
+
+ switch (context->drawing_state.textAntialiasMode)
+ {
+ case D2D1_TEXT_ANTIALIAS_MODE_ALIASED:
+ if (rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL
+ || rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC
+ || rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL
+ || rendering_mode == DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC)
+ d2d_device_context_set_error(context, E_INVALIDARG);
+ break;
+
+ case D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE:
+ if (rendering_mode == DWRITE_RENDERING_MODE_ALIASED
+ || rendering_mode == DWRITE_RENDERING_MODE_OUTLINE)
+ d2d_device_context_set_error(context, E_INVALIDARG);
+ break;
+
+ case D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE:
+ if (rendering_mode == DWRITE_RENDERING_MODE_ALIASED)
+ d2d_device_context_set_error(context, E_INVALIDARG);
+ break;
+
+ default:
+ break;
+ }
+
+ if (FAILED(context->error.code))
+ return;
+
+ rendering_mode = DWRITE_RENDERING_MODE_DEFAULT;
+ switch (context->drawing_state.textAntialiasMode)
+ {
+ 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:
+ break;
+ }
+
+ if (rendering_mode == DWRITE_RENDERING_MODE_DEFAULT)
+ {
+ if (FAILED(hr = IDWriteFontFace_GetRecommendedRenderingMode(glyph_run->fontFace, glyph_run->fontEmSize,
+ max(context->desc.dpiX, context->desc.dpiY) / 96.0f,
+ 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_device_context_draw_glyph_run_outline(context, baseline_origin, glyph_run, brush);
+ else
+ d2d_device_context_draw_glyph_run_bitmap(context, baseline_origin, glyph_run, brush,
+ rendering_mode, measuring_mode, antialias_mode);
}
static void STDMETHODCALLTYPE d2d_device_context_DrawImage(ID2D1DeviceContext *iface, ID2D1Image *image,
More information about the wine-cvs
mailing list