From e296c6a3567bb4090683dc56aadf31703dcf8460 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 10 Oct 2019 07:31:08 -0400 Subject: [PATCH] gsk: Store color bit info in text nodes Keep the 'has color glyphs' info in text nodes, instead of determining it over and over in both the vulkan and gl backends. --- gsk/gl/gskglrenderer.c | 20 +------------------- gsk/gskrendernode.h | 1 + gsk/gskrendernodeimpl.c | 30 ++++++++++++++++++++++++++++++ gsk/vulkan/gskvulkanrenderpass.c | 22 ++-------------------- 4 files changed, 34 insertions(+), 39 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 84a047e1ba..8ea44f9b0f 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -26,7 +26,6 @@ #include "gdk/gdkrgbaprivate.h" #include -#include #define SHADER_VERSION_GLES 100 #define SHADER_VERSION_GL2_LEGACY 110 @@ -191,23 +190,6 @@ dump_node (GskRenderNode *node, cairo_surface_destroy (surface); } -static gboolean -font_has_color_glyphs (const PangoFont *font) -{ - cairo_scaled_font_t *scaled_font; - gboolean has_color = FALSE; - - scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)font); - if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_FT) - { - FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font); - has_color = (FT_HAS_COLOR (ft_face) != 0); - cairo_ft_scaled_font_unlock_face (scaled_font); - } - - return has_color; -} - static inline void rgba_to_float (const GdkRGBA *c, float *f) @@ -572,7 +554,7 @@ render_text_node (GskGLRenderer *self, float y = offset->y + builder->dy; /* If the font has color glyphs, we don't need to recolor anything */ - if (!force_color && font_has_color_glyphs (font)) + if (!force_color && gsk_text_node_has_color_glyphs (node)) { ops_set_program (builder, &self->blit_program); } diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index 79f0c6a059..876905ebc2 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -295,6 +295,7 @@ GskRenderNode * gsk_text_node_new (PangoFont const graphene_point_t *offset); GDK_AVAILABLE_IN_ALL PangoFont * gsk_text_node_peek_font (GskRenderNode *node); +gboolean gsk_text_node_has_color_glyphs (GskRenderNode *node); GDK_AVAILABLE_IN_ALL guint gsk_text_node_get_num_glyphs (GskRenderNode *node); GDK_AVAILABLE_IN_ALL diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 8878ca3bd9..8c7be01555 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -28,6 +28,7 @@ #include "gsktransformprivate.h" #include "gdk/gdktextureprivate.h" +#include static void rectangle_init_from_graphene (cairo_rectangle_int_t *cairo, @@ -3408,6 +3409,7 @@ struct _GskTextNode GskRenderNode render_node; PangoFont *font; + gboolean has_color_glyphs; GdkRGBA color; graphene_point_t offset; @@ -3491,6 +3493,23 @@ static const GskRenderNodeClass GSK_TEXT_NODE_CLASS = { gsk_text_node_diff, }; +static gboolean +font_has_color_glyphs (const PangoFont *font) +{ + cairo_scaled_font_t *scaled_font; + gboolean has_color = FALSE; + + scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)font); + if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_FT) + { + FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font); + has_color = (FT_HAS_COLOR (ft_face) != 0); + cairo_ft_scaled_font_unlock_face (scaled_font); + } + + return has_color; +} + /** * gsk_text_node_new: * @font: the #PangoFont containing the glyphs @@ -3523,6 +3542,7 @@ gsk_text_node_new (PangoFont *font, self = (GskTextNode *) gsk_render_node_new (&GSK_TEXT_NODE_CLASS, sizeof (PangoGlyphInfo) * glyphs->num_glyphs); self->font = g_object_ref (font); + self->has_color_glyphs = font_has_color_glyphs (font); self->color = *color; self->offset = *offset; self->num_glyphs = glyphs->num_glyphs; @@ -3565,6 +3585,16 @@ gsk_text_node_peek_font (GskRenderNode *node) return self->font; } +gboolean +gsk_text_node_has_color_glyphs (GskRenderNode *node) +{ + GskTextNode *self = (GskTextNode *) node; + + g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_TEXT_NODE), FALSE); + + return self->has_color_glyphs; +} + guint gsk_text_node_get_num_glyphs (GskRenderNode *node) { diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 414d8b55d4..fb19d8d04d 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -26,8 +26,6 @@ #include "gskvulkanrendererprivate.h" #include "gskprivate.h" -#include - #define ORTHO_NEAR_PLANE -10000 #define ORTHO_FAR_PLANE 10000 @@ -236,23 +234,6 @@ gsk_vulkan_render_pass_free (GskVulkanRenderPass *self) g_slice_free (GskVulkanRenderPass, self); } -static gboolean -font_has_color_glyphs (const PangoFont *font) -{ - cairo_scaled_font_t *scaled_font; - gboolean has_color = FALSE; - - scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)font); - if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_FT) - { - FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font); - has_color = (FT_HAS_COLOR (ft_face) != 0); - cairo_ft_scaled_font_unlock_face (scaled_font); - } - - return has_color; -} - #define FALLBACK(...) G_STMT_START { \ GSK_RENDERER_NOTE (gsk_vulkan_render_get_renderer (render), FALLBACK, g_message (__VA_ARGS__)); \ goto fallback; \ @@ -367,13 +348,14 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self, const PangoFont *font = gsk_text_node_peek_font (node); const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node); guint num_glyphs = gsk_text_node_get_num_glyphs (node); + gboolean has_color_glyphs = gsk_text_node_has_color_glyphs (node); int i; guint count; guint texture_index; gint x_position; GskVulkanRenderer *renderer = GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)); - if (font_has_color_glyphs (font)) + if (has_color_glyphs) { if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds)) pipeline_type = GSK_VULKAN_PIPELINE_COLOR_TEXT; -- 2.30.2