Nikolay Sivov : d2d1/commandlist: Update text rendering params on DrawGlyphRun().
Alexandre Julliard
julliard at winehq.org
Wed Aug 3 15:30:40 CDT 2022
Module: wine
Branch: master
Commit: 3d54031236d9b463e9041c1c39f79af7370f9749
URL: https://gitlab.winehq.org/wine/wine/-/commit/3d54031236d9b463e9041c1c39f79af7370f9749
Author: Nikolay Sivov <nsivov at 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 at 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;
More information about the wine-cvs
mailing list