1/*
2 * Copyright © 2021 Red Hat, Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 *
17 * Authors: Matthias Clasen
18 */
19
20#include <gtk/gtk.h>
21#include "gsk/gskrendernodeprivate.h"
22
23static void
24test_can_diff_basic (void)
25{
26 GskRenderNode *container1, *container2;
27 GskRenderNode *color1, *color2;
28
29 color1 = gsk_color_node_new (rgba: &(GdkRGBA){0, 1, 0, 1 }, bounds: &GRAPHENE_RECT_INIT (0, 0, 10, 10));
30 color2 = gsk_color_node_new (rgba: &(GdkRGBA){1, 1, 0, 1 }, bounds: &GRAPHENE_RECT_INIT (0, 0, 10, 10));
31
32 container1 = gsk_container_node_new (children: &color1, n_children: 1);
33 container2 = gsk_container_node_new (children: &color2, n_children: 1);
34
35 /* We can diff two color nodes */
36 g_assert_true (gsk_render_node_can_diff (color1, color2));
37 /* We can diff two container nodes */
38 g_assert_true (gsk_render_node_can_diff (container1, container2));
39 /* We can diff container nodes against anything else */
40 g_assert_true (gsk_render_node_can_diff (container1, color2));
41 g_assert_true (gsk_render_node_can_diff (color1, container2));
42
43 gsk_render_node_unref (node: color1);
44 gsk_render_node_unref (node: color2);
45
46 gsk_render_node_unref (node: container1);
47 gsk_render_node_unref (node: container2);
48}
49
50static void
51test_can_diff_transform (void)
52{
53 GskRenderNode *color1, *color2;
54 GskRenderNode *opacity;
55 GskRenderNode *transform1, *transform2, *transform3, *transform4;
56 GskTransform *t1, *t2;
57
58 color1 = gsk_color_node_new (rgba: &(GdkRGBA){0, 1, 0, 1 }, bounds: &GRAPHENE_RECT_INIT (0, 0, 10, 10));
59 color2 = gsk_color_node_new (rgba: &(GdkRGBA){1, 1, 0, 1 }, bounds: &GRAPHENE_RECT_INIT (0, 0, 10, 10));
60 opacity = gsk_opacity_node_new (child: color2, opacity: 0.5);
61
62 t1 = gsk_transform_translate (NULL, point: &GRAPHENE_POINT_INIT (10, 10));
63 t2 = gsk_transform_scale (NULL, factor_x: 2, factor_y: 1);
64
65 transform1 = gsk_transform_node_new (child: color1, transform: t1);
66 transform2 = gsk_transform_node_new (child: color2, transform: t1);
67 transform3 = gsk_transform_node_new (child: color2, transform: t2);
68 transform4 = gsk_transform_node_new (child: opacity, transform: t1);
69
70 /* The case we can handle */
71 g_assert_true (gsk_render_node_can_diff (transform1, transform2));
72
73 /* These, we can't */
74 g_assert_false (gsk_render_node_can_diff (transform1, transform3));
75 g_assert_false (gsk_render_node_can_diff (transform1, transform4));
76
77 gsk_render_node_unref (node: color1);
78 gsk_render_node_unref (node: color2);
79 gsk_render_node_unref (node: opacity);
80 gsk_render_node_unref (node: transform1);
81 gsk_render_node_unref (node: transform2);
82 gsk_render_node_unref (node: transform3);
83 gsk_render_node_unref (node: transform4);
84
85 gsk_transform_unref (self: t1);
86 gsk_transform_unref (self: t2);
87}
88
89int
90main (int argc,
91 char *argv[])
92{
93 gtk_test_init (argcp: &argc, argvp: &argv, NULL);
94
95 g_test_add_func (testpath: "/node/can-diff/basic", test_func: test_can_diff_basic);
96 g_test_add_func (testpath: "/node/can-diff/transform", test_func: test_can_diff_transform);
97
98 return g_test_run ();
99}
100

source code of gtk/testsuite/gsk/diff.c