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