summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-03-12 19:28:36 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-03-12 19:28:36 -0500
commit3a928c898007709066dabbc8f50c40f3f90a2527 (patch)
tree522b2208cd98a5ed7b2dcdded63a8559adfb8a23
parent42dfc21b2dfdc11a9ab1bc51cfba50156733acdc (diff)
downloadgtk+-3a928c898007709066dabbc8f50c40f3f90a2527.tar.gz
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.
-rw-r--r--gtk/gtktextlayout.c17
1 files 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);