From 3d54031236d9b463e9041c1c39f79af7370f9749 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 3 Aug 2022 10:55:38 +0300 Subject: [PATCH] d2d1/commandlist: Update text rendering params on DrawGlyphRun(). Signed-off-by: Nikolay Sivov --- dlls/d2d1/command_list.c | 35 ++++++++++++++++++++++++++++++++--- dlls/d2d1/d2d1_private.h | 1 + 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/dlls/d2d1/command_list.c b/dlls/d2d1/command_list.c index 84170b0efb1..0d40b59b2c1 100644 --- a/dlls/d2d1/command_list.c +++ b/dlls/d2d1/command_list.c @@ -20,6 +20,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(d2d); +enum d2d_command_list_flags +{ + D2D_COMMAND_LIST_HAS_NULL_TEXT_RENDERING_PARAMS = 0x1, +}; + enum d2d_command_type { D2D_COMMAND_SET_ANTIALIAS_MODE, @@ -751,20 +756,37 @@ void d2d_command_list_fill_rectangle(struct d2d_command_list *command_list, command->brush = brush; } -void d2d_command_list_set_text_rendering_params(struct d2d_command_list *command_list, - IDWriteRenderingParams *params) +static void d2d_command_list_set_text_rendering_params_internal(struct d2d_command_list *command_list, + BOOL allow_null, IDWriteRenderingParams *params) { struct d2d_command_set_text_rendering_params *command; - if (!params) return; + if (!params && !allow_null) return; + + if ((command_list->flags & D2D_COMMAND_LIST_HAS_NULL_TEXT_RENDERING_PARAMS) + && !params) + { + return; + } d2d_command_list_reference_object(command_list, params); + if (params) + command_list->flags &= ~D2D_COMMAND_LIST_HAS_NULL_TEXT_RENDERING_PARAMS; + else + command_list->flags |= D2D_COMMAND_LIST_HAS_NULL_TEXT_RENDERING_PARAMS; + command = d2d_command_list_require_space(command_list, sizeof(*command)); command->c.op = D2D_COMMAND_SET_TEXT_RENDERING_PARAMS; command->params = params; } +void d2d_command_list_set_text_rendering_params(struct d2d_command_list *command_list, + IDWriteRenderingParams *params) +{ + d2d_command_list_set_text_rendering_params_internal(command_list, FALSE, params); +} + static inline void d2d_command_list_write_field(BYTE **data, void *dst, const void *src, size_t size) { void **ptr = dst; @@ -799,6 +821,13 @@ void d2d_command_list_draw_glyph_run(struct d2d_command_list *command_list, return; } + /* Set rendering parameters automatically. Explicitly set null parameters are not recorded, + either separately or as a part of a restored state block. Forcing parameters update on + DrawGlyphRun() ensures that state is reset correctly. */ + + d2d_command_list_set_text_rendering_params_internal(command_list, TRUE, + context->text_rendering_params); + /* Get combined size of variable data. */ glyph_count = run->glyphCount; diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index a9982fcaeb9..eae8801fe4b 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -720,6 +720,7 @@ struct d2d_command_list ID2D1Factory *factory; enum d2d_command_list_state state; + unsigned int flags; size_t size; size_t capacity;