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.
This commit is contained in:
Matthias Clasen 2021-03-12 19:28:36 -05:00
parent 42dfc21b2d
commit 3a928c8980

View File

@ -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);