From 3a928c898007709066dabbc8f50c40f3f90a2527 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 12 Mar 2021 19:28:36 -0500 Subject: [PATCH] textlayout: Render cursors at the end Don't place the insertion cursor render nodes in the middle of the text nodes for all the text. This helps the renderer batching the text draw calls together. --- gtk/gtktextlayout.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c index 9c994137ae..358a92e517 100644 --- a/gtk/gtktextlayout.c +++ b/gtk/gtktextlayout.c @@ -4142,6 +4142,8 @@ gtk_text_layout_snapshot (GtkTextLayout *layout, GSList *line_list; GSList *tmp_list; GdkRGBA color; + GtkSnapshot *cursor_snapshot; + GskRenderNode *cursors; g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout)); g_return_if_fail (layout->default_style != NULL); @@ -4158,6 +4160,8 @@ gtk_text_layout_snapshot (GtkTextLayout *layout, if (line_list == NULL) return; /* nothing on the screen */ + cursor_snapshot = gtk_snapshot_new (); + crenderer = gsk_pango_renderer_acquire (); gsk_pango_renderer_set_shape_handler (crenderer, snapshot_shape); @@ -4267,14 +4271,14 @@ gtk_text_layout_snapshot (GtkTextLayout *layout, dir = (line_display->direction == GTK_TEXT_DIR_RTL) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; if (cursor.is_insert || cursor.is_selection_bound) - gtk_snapshot_push_opacity (crenderer->snapshot, cursor_alpha); + gtk_snapshot_push_opacity (cursor_snapshot, cursor_alpha); - gtk_snapshot_render_insertion_cursor (crenderer->snapshot, context, + gtk_snapshot_render_insertion_cursor (cursor_snapshot, context, line_display->x_offset, offset_y + line_display->top_margin, line_display->layout, cursor.pos, dir); if (cursor.is_insert || cursor.is_selection_bound) - gtk_snapshot_pop (crenderer->snapshot); + gtk_snapshot_pop (cursor_snapshot); } } } /* line_display->height > 0 */ @@ -4288,6 +4292,13 @@ gtk_text_layout_snapshot (GtkTextLayout *layout, gtk_text_layout_wrap_loop_end (layout); + cursors = gtk_snapshot_free_to_node (cursor_snapshot); + if (cursors) + { + gtk_snapshot_append_node (crenderer->snapshot, cursors); + gsk_render_node_unref (cursors); + } + /* Only update eviction source once per snapshot */ gtk_text_line_display_cache_delay_eviction (priv->cache);