Implement diff() for color matrix nodes
authorTimm Bäder <mail@baedert.org>
Wed, 13 May 2020 14:26:35 +0000 (16:26 +0200)
committerTimm Bäder <mail@baedert.org>
Sat, 16 May 2020 06:22:55 +0000 (08:22 +0200)
This way we don't redraw color matrix nodes all the time.

gsk/gskrendernodeimpl.c

index 767e7f87c7a88c24f171495dcb4bfb6689a8ce35..5fa0dbc46a9f54f5b8f6c7e1178acf24cc88b85d 100644 (file)
@@ -2331,6 +2331,28 @@ gsk_color_matrix_node_draw (GskRenderNode *node,
   cairo_pattern_destroy (pattern);
 }
 
+static void
+gsk_color_matrix_node_diff (GskRenderNode  *node1,
+                            GskRenderNode  *node2,
+                            cairo_region_t *region)
+{
+  GskColorMatrixNode *self1 = (GskColorMatrixNode *) node1;
+  GskColorMatrixNode *self2 = (GskColorMatrixNode *) node2;
+
+  if (!graphene_vec4_equal (&self1->color_offset, &self2->color_offset))
+    goto nope;
+
+  if (!graphene_matrix_equal_fast (&self1->color_matrix, &self2->color_matrix))
+    goto nope;
+
+  gsk_render_node_diff (self1->child, self2->child, region);
+  return;
+
+nope:
+  gsk_render_node_diff_impossible (node1, node2, region);
+  return;
+}
+
 /**
  * gsk_color_matrix_node_new: 
  * @child: The node to draw
@@ -4311,7 +4333,7 @@ gsk_render_node_init_types_once (void)
       gsk_color_matrix_node_finalize,
       gsk_color_matrix_node_draw,
       NULL,
-      NULL,
+      gsk_color_matrix_node_diff,
     };
 
     GType node_type = gsk_render_node_type_register_static (I_("GskColorMatrixNode"), &node_info);