[gtk/wip/baedert/for-master] snapshot: Factor out color matrix merging
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/for-master] snapshot: Factor out color matrix merging
- Date: Fri, 29 Nov 2019 08:52:47 +0000 (UTC)
commit 8eb5e8b3c6602cd6eb2679e290b0d153a4914170
Author: Timm Bäder <mail baedert org>
Date: Fri Nov 29 09:13:27 2019 +0100
snapshot: Factor out color matrix merging
We will use that elsewhere in the next commit.
gtk/gtksnapshot.c | 73 ++++++++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 30 deletions(-)
---
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index e63101321d..661abc33c4 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -428,13 +428,48 @@ gtk_snapshot_push_blur (GtkSnapshot *snapshot,
state->data.blur.radius = radius;
}
+static GskRenderNode *
+merge_color_matrix_nodes (const graphene_matrix_t *matrix2,
+ const graphene_vec4_t *offset2,
+ GskRenderNode *child)
+{
+ GskRenderNode *grandchild = gsk_render_node_ref (gsk_color_matrix_node_get_child (child));
+ const graphene_matrix_t *mat1 = gsk_color_matrix_node_peek_color_matrix (child);
+ const graphene_vec4_t *offset1 = gsk_color_matrix_node_peek_color_offset (child);
+ graphene_matrix_t mat2 = *matrix2;
+ graphene_vec4_t off2 = *offset2;
+ GskRenderNode *result;
+
+ g_assert (gsk_render_node_get_node_type (child) == GSK_COLOR_MATRIX_NODE);
+
+ /* color matrix node: color = mat * p + offset; for a pixel p.
+ * color = mat1 * (mat2 * p + offset2) + offset1;
+ * = mat1 * mat2 * p + offset2 * mat1 + offset1
+ * = (mat1 * mat2) * p + (offset2 * mat1 + offset1)
+ * Which this code does.
+ * mat1 and offset1 come from @child.
+ */
+
+ graphene_matrix_transform_vec4 (mat1, offset2, &off2);
+ graphene_vec4_add (&off2, offset1, &off2);
+
+ graphene_matrix_multiply (mat1, &mat2, &mat2);
+ gsk_render_node_unref (child);
+ child = NULL;
+
+ result = gsk_color_matrix_node_new (grandchild, &mat2, &off2);
+ gsk_render_node_unref (grandchild);
+
+ return result;
+}
+
static GskRenderNode *
gtk_snapshot_collect_color_matrix (GtkSnapshot *snapshot,
GtkSnapshotState *state,
GskRenderNode **nodes,
guint n_nodes)
{
- GskRenderNode *node, *color_matrix_node;
+ GskRenderNode *node, *result;
node = gtk_snapshot_collect_default (snapshot, state, nodes, n_nodes);
if (node == NULL)
@@ -442,41 +477,19 @@ gtk_snapshot_collect_color_matrix (GtkSnapshot *snapshot,
if (gsk_render_node_get_node_type (node) == GSK_COLOR_MATRIX_NODE)
{
- GskRenderNode *child = gsk_render_node_ref (gsk_color_matrix_node_get_child (node));
- const graphene_matrix_t *mat1 = gsk_color_matrix_node_peek_color_matrix (node);
- graphene_matrix_t mat2;
- graphene_vec4_t offset2;
-
- /* color matrix node: color = mat * p + offset; for a pixel p.
- * color = mat1 * (mat2 * p + offset2) + offset1;
- * = mat1 * mat2 * p + offset2 * mat1 + offset1
- * = (mat1 * mat2) * p + (offset2 * mat1 + offset1)
- * Which this code does.
- * mat1 and offset1 come from @child.
- */
-
- mat2 = state->data.color_matrix.matrix;
- offset2 = state->data.color_matrix.offset;
- graphene_matrix_transform_vec4 (mat1, &offset2, &offset2);
- graphene_vec4_add (&offset2, gsk_color_matrix_node_peek_color_offset (node), &offset2);
-
- graphene_matrix_multiply (mat1, &mat2, &mat2);
-
- gsk_render_node_unref (node);
- node = NULL;
- color_matrix_node = gsk_color_matrix_node_new (child, &mat2, &offset2);
-
- gsk_render_node_unref (child);
+ result = merge_color_matrix_nodes (&state->data.color_matrix.matrix,
+ &state->data.color_matrix.offset,
+ node);
}
else
{
- color_matrix_node = gsk_color_matrix_node_new (node,
- &state->data.color_matrix.matrix,
- &state->data.color_matrix.offset);
+ result = gsk_color_matrix_node_new (node,
+ &state->data.color_matrix.matrix,
+ &state->data.color_matrix.offset);
gsk_render_node_unref (node);
}
- return color_matrix_node;
+ return result;
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]