[gtk/wip/baedert/for-master: 1/4] stack: stop keeping a cached child render node around
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/for-master: 1/4] stack: stop keeping a cached child render node around
- Date: Sat, 13 Jun 2020 19:11:35 +0000 (UTC)
commit 8bf74d380e318179ce55ea8da2b7fc23d407eed8
Author: Timm Bäder <mail baedert org>
Date: Fri Jun 12 21:40:34 2020 +0200
stack: stop keeping a cached child render node around
All widgets cache their render node already. Just allocate the
last_visible_child always at 0/0 and then move its rendernode around
during snapshot.
Fixes #2678
gtk/gtkstack.c | 92 +++++++++++++++++-----------------------------------------
1 file changed, 27 insertions(+), 65 deletions(-)
---
diff --git a/gtk/gtkstack.c b/gtk/gtkstack.c
index 303059643e..b0715960d6 100644
--- a/gtk/gtkstack.c
+++ b/gtk/gtkstack.c
@@ -138,8 +138,6 @@ typedef struct {
guint transition_duration;
GtkStackPage *last_visible_child;
- GskRenderNode *last_visible_node;
- GtkAllocation last_visible_surface_allocation;
guint tick_id;
GtkProgressTracker tracker;
gboolean first_frame_skipped;
@@ -645,8 +643,6 @@ gtk_stack_finalize (GObject *obj)
gtk_stack_unschedule_ticks (stack);
- g_clear_pointer (&priv->last_visible_node, gsk_render_node_unref);
-
G_OBJECT_CLASS (gtk_stack_parent_class)->finalize (obj);
}
@@ -986,15 +982,11 @@ gtk_stack_progress_updated (GtkStack *stack)
else
gtk_widget_queue_draw (GTK_WIDGET (stack));
- if (gtk_progress_tracker_get_state (&priv->tracker) == GTK_PROGRESS_STATE_AFTER)
+ if (gtk_progress_tracker_get_state (&priv->tracker) == GTK_PROGRESS_STATE_AFTER &&
+ priv->last_visible_child != NULL)
{
- g_clear_pointer (&priv->last_visible_node, gsk_render_node_unref);
-
- if (priv->last_visible_child != NULL)
- {
- gtk_widget_set_child_visible (priv->last_visible_child->widget, FALSE);
- priv->last_visible_child = NULL;
- }
+ gtk_widget_set_child_visible (priv->last_visible_child->widget, FALSE);
+ priv->last_visible_child = NULL;
}
}
@@ -1210,15 +1202,13 @@ set_visible_child (GtkStack *stack,
gtk_widget_set_child_visible (priv->last_visible_child->widget, FALSE);
priv->last_visible_child = NULL;
- g_clear_pointer (&priv->last_visible_node, gsk_render_node_unref);
-
if (priv->visible_child && priv->visible_child->widget)
{
if (gtk_widget_is_visible (widget))
{
priv->last_visible_child = priv->visible_child;
- priv->last_visible_widget_width = gtk_widget_get_allocated_width
(priv->last_visible_child->widget);
- priv->last_visible_widget_height = gtk_widget_get_allocated_height
(priv->last_visible_child->widget);
+ priv->last_visible_widget_width = gtk_widget_get_width (widget);
+ priv->last_visible_widget_height = gtk_widget_get_height (widget);
}
else
{
@@ -2063,14 +2053,11 @@ gtk_stack_snapshot_crossfade (GtkWidget *widget,
gtk_snapshot_push_cross_fade (snapshot, progress);
- if (priv->last_visible_node)
+ if (priv->last_visible_child)
{
- gtk_snapshot_save (snapshot);
- gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (
- priv->last_visible_surface_allocation.x,
- priv->last_visible_surface_allocation.y));
- gtk_snapshot_append_node (snapshot, priv->last_visible_node);
- gtk_snapshot_restore (snapshot);
+ gtk_widget_snapshot_child (widget,
+ priv->last_visible_child->widget,
+ snapshot);
}
gtk_snapshot_pop (snapshot);
@@ -2130,11 +2117,11 @@ gtk_stack_snapshot_under (GtkWidget *widget,
gtk_snapshot_pop (snapshot);
- if (priv->last_visible_node)
+ if (priv->last_visible_child)
{
gtk_snapshot_save (snapshot);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (pos_x, pos_y));
- gtk_snapshot_append_node (snapshot, priv->last_visible_node);
+ gtk_widget_snapshot_child (widget, priv->last_visible_child->widget, snapshot);
gtk_snapshot_restore (snapshot);
}
}
@@ -2150,7 +2137,7 @@ gtk_stack_snapshot_cube (GtkWidget *widget,
if (priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_ROTATE_RIGHT)
progress = 1 - progress;
- if (priv->last_visible_node && progress > 0.5)
+ if (priv->last_visible_child && progress > 0.5)
{
gtk_snapshot_save (snapshot);
gtk_snapshot_translate_3d (snapshot, &GRAPHENE_POINT3D_INIT (
@@ -2166,11 +2153,8 @@ gtk_stack_snapshot_cube (GtkWidget *widget,
- gtk_widget_get_width (widget) / 2.f,
- gtk_widget_get_height (widget) / 2.f,
gtk_widget_get_width (widget) / 2.f));
- gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (
- priv->last_visible_surface_allocation.x,
- priv->last_visible_surface_allocation.y));
if (priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_ROTATE_LEFT)
- gtk_snapshot_append_node (snapshot, priv->last_visible_node);
+ gtk_widget_snapshot_child (widget, priv->last_visible_child->widget, snapshot);
else
gtk_widget_snapshot_child (widget, priv->visible_child->widget, snapshot);
gtk_snapshot_restore (snapshot);
@@ -2190,17 +2174,14 @@ gtk_stack_snapshot_cube (GtkWidget *widget,
- gtk_widget_get_width (widget) / 2.f,
- gtk_widget_get_height (widget) / 2.f,
gtk_widget_get_width (widget) / 2.f));
- gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (
- priv->last_visible_surface_allocation.x,
- priv->last_visible_surface_allocation.y));
if (priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_ROTATE_LEFT)
gtk_widget_snapshot_child (widget, priv->visible_child->widget, snapshot);
else
- gtk_snapshot_append_node (snapshot, priv->last_visible_node);
+ gtk_widget_snapshot_child (widget, priv->last_visible_child->widget, snapshot);
gtk_snapshot_restore (snapshot);
- if (priv->last_visible_node && progress <= 0.5)
+ if (priv->last_visible_child && progress <= 0.5)
{
gtk_snapshot_save (snapshot);
gtk_snapshot_translate_3d (snapshot, &GRAPHENE_POINT3D_INIT (
@@ -2216,11 +2197,8 @@ gtk_stack_snapshot_cube (GtkWidget *widget,
- gtk_widget_get_width (widget) / 2.f,
- gtk_widget_get_height (widget) / 2.f,
gtk_widget_get_width (widget) / 2.f));
- gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (
- priv->last_visible_surface_allocation.x,
- priv->last_visible_surface_allocation.y));
if (priv->active_transition_type == GTK_STACK_TRANSITION_TYPE_ROTATE_LEFT)
- gtk_snapshot_append_node (snapshot, priv->last_visible_node);
+ gtk_widget_snapshot_child (widget, priv->last_visible_child->widget, snapshot);
else
gtk_widget_snapshot_child (widget, priv->visible_child->widget, snapshot);
gtk_snapshot_restore (snapshot);
@@ -2234,7 +2212,7 @@ gtk_stack_snapshot_slide (GtkWidget *widget,
GtkStack *stack = GTK_STACK (widget);
GtkStackPrivate *priv = gtk_stack_get_instance_private (stack);
- if (priv->last_visible_node)
+ if (priv->last_visible_child)
{
int x, y;
int width, height;
@@ -2283,7 +2261,7 @@ gtk_stack_snapshot_slide (GtkWidget *widget,
gtk_snapshot_save (snapshot);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, y));
- gtk_snapshot_append_node (snapshot, priv->last_visible_node);
+ gtk_widget_snapshot_child (widget, priv->last_visible_child->widget, snapshot);
gtk_snapshot_restore (snapshot);
}
@@ -2303,18 +2281,6 @@ gtk_stack_snapshot (GtkWidget *widget,
{
if (gtk_progress_tracker_get_state (&priv->tracker) != GTK_PROGRESS_STATE_AFTER)
{
- if (priv->last_visible_node == NULL &&
- priv->last_visible_child != NULL)
- {
- GtkSnapshot *last_visible_snapshot;
-
- gtk_widget_get_allocation (priv->last_visible_child->widget,
- &priv->last_visible_surface_allocation);
- last_visible_snapshot = gtk_snapshot_new ();
- gtk_widget_snapshot (priv->last_visible_child->widget, last_visible_snapshot);
- priv->last_visible_node = gtk_snapshot_free_to_node (last_visible_snapshot);
- }
-
gtk_snapshot_push_clip (snapshot,
&GRAPHENE_RECT_INIT(
0, 0,
@@ -2325,7 +2291,7 @@ gtk_stack_snapshot (GtkWidget *widget,
switch (priv->active_transition_type)
{
case GTK_STACK_TRANSITION_TYPE_CROSSFADE:
- gtk_stack_snapshot_crossfade (widget, snapshot);
+ gtk_stack_snapshot_crossfade (widget, snapshot);
break;
case GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT:
case GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT:
@@ -2341,11 +2307,11 @@ gtk_stack_snapshot (GtkWidget *widget,
case GTK_STACK_TRANSITION_TYPE_UNDER_DOWN:
case GTK_STACK_TRANSITION_TYPE_UNDER_LEFT:
case GTK_STACK_TRANSITION_TYPE_UNDER_RIGHT:
- gtk_stack_snapshot_under (widget, snapshot);
+ gtk_stack_snapshot_under (widget, snapshot);
break;
case GTK_STACK_TRANSITION_TYPE_ROTATE_LEFT:
case GTK_STACK_TRANSITION_TYPE_ROTATE_RIGHT:
- gtk_stack_snapshot_cube (widget, snapshot);
+ gtk_stack_snapshot_cube (widget, snapshot);
break;
case GTK_STACK_TRANSITION_TYPE_NONE:
case GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT:
@@ -2383,24 +2349,20 @@ gtk_stack_size_allocate (GtkWidget *widget,
if (priv->last_visible_child)
{
+ int child_width, child_height;
int min, nat;
gtk_widget_measure (priv->last_visible_child->widget, GTK_ORIENTATION_HORIZONTAL,
-1,
&min, &nat, NULL, NULL);
- child_allocation.width = MAX (min, width);
+ child_width = MAX (min, width);
gtk_widget_measure (priv->last_visible_child->widget, GTK_ORIENTATION_VERTICAL,
child_allocation.width,
&min, &nat, NULL, NULL);
- child_allocation.height = MAX (min, height);
-
- gtk_widget_size_allocate (priv->last_visible_child->widget, &child_allocation, -1);
+ child_height = MAX (min, height);
- if (!gdk_rectangle_equal (&priv->last_visible_surface_allocation,
- &child_allocation))
- {
- g_clear_pointer (&priv->last_visible_node, gsk_render_node_unref);
- }
+ gtk_widget_size_allocate (priv->last_visible_child->widget,
+ &(GtkAllocation) { 0, 0, child_width, child_height }, -1);
}
child_allocation.width = width;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]