Module: wine Branch: master Commit: 3d54031236d9b463e9041c1c39f79af7370f9749 URL: https://gitlab.winehq.org/wine/wine/-/commit/3d54031236d9b463e9041c1c39f79af...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Aug 3 10:55:38 2022 +0300
d2d1/commandlist: Update text rendering params on DrawGlyphRun().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
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;