From 1e404f66258e987a029cec72204d7df466408e77 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 8 Jun 2024 20:53:28 -0400 Subject: [PATCH] Add gtk_snapshot_push_color_state --- gtk/gtksnapshot.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ gtk/gtksnapshot.h | 4 ++++ 2 files changed, 55 insertions(+) diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index 34bc8a798d..9e62888f6e 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -137,6 +137,9 @@ struct _GtkSnapshotState { struct { GdkSubsurface *subsurface; } subsurface; + struct { + GdkColorState *color_state; + } color_state; } data; }; @@ -2914,3 +2917,51 @@ gtk_snapshot_push_subsurface (GtkSnapshot *snapshot, state->data.subsurface.subsurface = g_object_ref (subsurface); } + +static GskRenderNode * +gtk_snapshot_collect_color_state (GtkSnapshot *snapshot, + GtkSnapshotState *state, + GskRenderNode **nodes, + guint n_nodes) +{ + GskRenderNode *node, *color_state_node; + + node = gtk_snapshot_collect_default (snapshot, state, nodes, n_nodes); + if (node == NULL) + return NULL; + + color_state_node = gsk_color_state_node_new (node, state->data.color_state.color_state); + gsk_render_node_unref (node); + + return color_state_node; +} + +static void +gtk_snapshot_clear_color_state (GtkSnapshotState *state) +{ + gdk_color_state_unref (state->data.color_state.color_state); +} + +/** + * gtk_snapshot_push_color_state: + * @snapshot: a `GtkSnapshot` + * @color_state: the color state to use + * + * Inserts a color state node. + * + * Since: 4.16 + */ +void +gtk_snapshot_push_color_state (GtkSnapshot *snapshot, + GdkColorState *color_state) +{ + const GtkSnapshotState *current_state = gtk_snapshot_get_current_state (snapshot); + GtkSnapshotState *state; + + state = gtk_snapshot_push_state (snapshot, + current_state->transform, + gtk_snapshot_collect_color_state, + gtk_snapshot_clear_color_state); + + state->data.color_state.color_state = gdk_color_state_ref (color_state); +} diff --git a/gtk/gtksnapshot.h b/gtk/gtksnapshot.h index d3d25e8c67..256a72228d 100644 --- a/gtk/gtksnapshot.h +++ b/gtk/gtksnapshot.h @@ -106,6 +106,10 @@ GDK_AVAILABLE_IN_4_10 void gtk_snapshot_push_mask (GtkSnapshot *snapshot, GskMaskMode mask_mode); +GDK_AVAILABLE_IN_4_16 +void gtk_snapshot_push_color_state (GtkSnapshot *snapshot, + GdkColorState *color_state); + GDK_AVAILABLE_IN_ALL void gtk_snapshot_push_cross_fade (GtkSnapshot *snapshot, double progress);