From 40e7998669fff7a7c6d068e66b38c301406414bc Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Sat, 12 Oct 2024 11:52:31 +0200 Subject: [PATCH] clutter/pango: Avoid going through global context As we have access to the actor context in most of the cases except for render nodes. Part-of: --- clutter/clutter/clutter-paint-nodes.c | 4 ++- clutter/clutter/clutter-text.c | 8 ++++-- clutter/clutter/pango/clutter-pango-private.h | 8 ++++-- clutter/clutter/pango/clutter-pango-render.c | 28 ++++++++----------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/clutter/clutter/clutter-paint-nodes.c b/clutter/clutter/clutter-paint-nodes.c index 6e4fe9920..ee2b895d6 100644 --- a/clutter/clutter/clutter-paint-nodes.c +++ b/clutter/clutter/clutter-paint-nodes.c @@ -746,6 +746,7 @@ clutter_text_node_draw (ClutterPaintNode *node, clutter_paint_context_get_color_state (paint_context); ClutterColorState *target_color_state = clutter_paint_context_get_target_color_state (paint_context); + ClutterContext *context = _clutter_context_get_default (); PangoRectangle extents; CoglFramebuffer *fb; guint i; @@ -786,7 +787,8 @@ clutter_text_node_draw (ClutterPaintNode *node, clipped = TRUE; } - clutter_show_layout (fb, + clutter_show_layout (context, + fb, tnode->layout, op->op.texrect[0], op->op.texrect[1], diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c index d35a25805..ab5e3e3f0 100644 --- a/clutter/clutter/clutter-text.c +++ b/clutter/clutter/clutter-text.c @@ -917,6 +917,7 @@ clutter_text_create_layout (ClutterText *text, gfloat allocation_height) { ClutterTextPrivate *priv = clutter_text_get_instance_private (text); + ClutterContext *context = clutter_actor_get_context (CLUTTER_ACTOR (text)); LayoutCache *oldest_cache = priv->cached_layouts; gboolean found_free_cache = FALSE; gint width = -1; @@ -1074,7 +1075,7 @@ clutter_text_create_layout (ClutterText *text, oldest_cache->layout = clutter_text_create_layout_no_cache (text, width, height, ellipsize); - clutter_ensure_glyph_cache_for_layout (oldest_cache->layout); + clutter_ensure_glyph_cache_for_layout (context, oldest_cache->layout); /* Mark the 'time' this cache was created and advance the time */ oldest_cache->age = priv->cache_age++; @@ -2005,7 +2006,7 @@ paint_selection_rectangle (ClutterText *self, color->blue / 255.0f, paint_opacity / 255.0f * color->alpha / 255.0f); - clutter_show_layout (fb, layout, priv->text_x, 0, &cogl_color, + clutter_show_layout (context, fb, layout, priv->text_x, 0, &cogl_color, color_state, target_color_state); cogl_framebuffer_pop_clip (fb); @@ -2663,6 +2664,7 @@ clutter_text_paint (ClutterActor *self, { ClutterText *text = CLUTTER_TEXT (self); ClutterTextPrivate *priv = clutter_text_get_instance_private (text); + ClutterContext *context = clutter_actor_get_context(self); ClutterColorState *color_state = clutter_paint_context_get_color_state (paint_context); ClutterColorState *target_color_state = @@ -2832,7 +2834,7 @@ clutter_text_paint (ClutterActor *self, priv->text_color.blue / 255.0f, real_opacity / 255.0f); - clutter_show_layout (fb, layout, priv->text_x, priv->text_y, &color, + clutter_show_layout (context, fb, layout, priv->text_x, priv->text_y, &color, color_state, target_color_state); selection_paint (text, fb, paint_context); diff --git a/clutter/clutter/pango/clutter-pango-private.h b/clutter/clutter/pango/clutter-pango-private.h index e5b03b722..665f7bb74 100644 --- a/clutter/clutter/pango/clutter-pango-private.h +++ b/clutter/clutter/pango/clutter-pango-private.h @@ -46,6 +46,7 @@ PangoRenderer * clutter_pango_renderer_new (CoglContext *context); /** * clutter_ensure_glyph_cache_for_layout: + * @context: A #ClutterContext * @layout: A #PangoLayout * * This updates any internal glyph cache textures as necessary to be @@ -54,10 +55,12 @@ PangoRenderer * clutter_pango_renderer_new (CoglContext *context); * This api should be used to avoid mid-scene modifications of * glyph-cache textures which can lead to undefined rendering results. */ -void clutter_ensure_glyph_cache_for_layout (PangoLayout *layout); +void clutter_ensure_glyph_cache_for_layout (ClutterContext *context, + PangoLayout *layout); /** * clutter_show_layout: (skip) + * @context: A #ClutterContext * @framebuffer: A #CoglFramebuffer to draw too. * @layout: a #PangoLayout * @x: X coordinate to render the layout at @@ -67,7 +70,8 @@ void clutter_ensure_glyph_cache_for_layout (PangoLayout *layout); * Draws a solidly coloured @layout on the given @framebuffer at (@x, * @y) within the `framebuffer`'s current model-view coordinate space. */ -void clutter_show_layout (CoglFramebuffer *framebuffer, +void clutter_show_layout (ClutterContext *context, + CoglFramebuffer *framebuffer, PangoLayout *layout, float x, float y, diff --git a/clutter/clutter/pango/clutter-pango-render.c b/clutter/clutter/pango/clutter-pango-render.c index c99ca954d..22d218a95 100644 --- a/clutter/clutter/pango/clutter-pango-render.c +++ b/clutter/clutter/pango/clutter-pango-render.c @@ -257,7 +257,8 @@ clutter_pango_render_qdata_destroy (PangoLayoutQdata *qdata) } void -clutter_show_layout (CoglFramebuffer *fb, +clutter_show_layout (ClutterContext *context, + CoglFramebuffer *fb, PangoLayout *layout, float x, float y, @@ -267,9 +268,7 @@ clutter_show_layout (CoglFramebuffer *fb, { ClutterPangoRenderer *renderer; PangoLayoutQdata *qdata; - ClutterContext *context; - context = _clutter_context_get_default (); renderer = CLUTTER_PANGO_RENDERER (clutter_context_get_font_renderer (context)); if (G_UNLIKELY (!renderer)) return; @@ -298,7 +297,7 @@ clutter_show_layout (CoglFramebuffer *fb, if (qdata->display_list == NULL) { - clutter_ensure_glyph_cache_for_layout (layout); + clutter_ensure_glyph_cache_for_layout (context, layout); qdata->display_list = clutter_pango_display_list_new (renderer->pipeline_cache); @@ -353,15 +352,11 @@ clutter_pango_renderer_get_cached_glyph (PangoRenderer *renderer, } static void -clutter_pango_ensure_glyph_cache_for_layout_line_internal (PangoLayoutLine *line) +clutter_pango_ensure_glyph_cache_for_layout_line_internal (PangoRenderer *renderer, + PangoLayoutLine *line) { - ClutterContext *context; - PangoRenderer *renderer; GSList *l; - context = _clutter_context_get_default (); - renderer = clutter_context_get_font_renderer (context); - for (l = line->runs; l; l = l->next) { PangoLayoutRun *run = l->data; @@ -386,14 +381,13 @@ clutter_pango_ensure_glyph_cache_for_layout_line_internal (PangoLayoutLine *line } void -clutter_ensure_glyph_cache_for_layout (PangoLayout *layout) +clutter_ensure_glyph_cache_for_layout (ClutterContext *context, + PangoLayout *layout) { - ClutterContext *context; - ClutterPangoRenderer *renderer; + PangoRenderer *renderer; PangoLayoutIter *iter; - context = _clutter_context_get_default (); - renderer = CLUTTER_PANGO_RENDERER (clutter_context_get_font_renderer (context)); + renderer = clutter_context_get_font_renderer (context); g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -406,7 +400,7 @@ clutter_ensure_glyph_cache_for_layout (PangoLayout *layout) line = pango_layout_iter_get_line_readonly (iter); - clutter_pango_ensure_glyph_cache_for_layout_line_internal (line); + clutter_pango_ensure_glyph_cache_for_layout_line_internal (renderer, line); } while (pango_layout_iter_next_line (iter)); @@ -414,7 +408,7 @@ clutter_ensure_glyph_cache_for_layout (PangoLayout *layout) /* Now that we know all of the positions are settled we'll fill in any dirty glyphs */ - clutter_pango_glyph_cache_set_dirty_glyphs (renderer->glyph_cache); + clutter_pango_glyph_cache_set_dirty_glyphs (CLUTTER_PANGO_RENDERER (renderer)->glyph_cache); } static void