diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-03-12 19:28:36 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-03-12 19:28:36 -0500 |
commit | 3a928c898007709066dabbc8f50c40f3f90a2527 (patch) | |
tree | 522b2208cd98a5ed7b2dcdded63a8559adfb8a23 /gtk/gtktextlayout.c | |
parent | 42dfc21b2dfdc11a9ab1bc51cfba50156733acdc (diff) | |
download | gtk+-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.
Diffstat (limited to 'gtk/gtktextlayout.c')
-rw-r--r-- | gtk/gtktextlayout.c | 17 |
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); |