diff options
author | Benjamin Otte <otte@redhat.com> | 2016-12-26 17:09:18 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-12-26 17:22:02 +0100 |
commit | c0c44c7b9cfb33ead68a31ac13319f82e22128b3 (patch) | |
tree | 2de1a4ae85397ff8ec38e6da3ecdd7cbd096f239 | |
parent | 573ceb03407b3a4b067aff07fad6bdf196ca8624 (diff) | |
download | gtk+-c0c44c7b9cfb33ead68a31ac13319f82e22128b3.tar.gz |
tests: Add linear gradient test
-rw-r--r-- | tests/rendernode-create-tests.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/rendernode-create-tests.c b/tests/rendernode-create-tests.c index b2d75f15c7..eddb22ad3b 100644 --- a/tests/rendernode-create-tests.c +++ b/tests/rendernode-create-tests.c @@ -223,6 +223,87 @@ clipped_colors (guint n) return container; } +static int +compare_color_stops (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const GskColorStop *stopa = a; + const GskColorStop *stopb = b; + + if (stopa->offset < stopb->offset) + return -1; + else if (stopa->offset > stopb->offset) + return 1; + else + return 0; +} + +GskRenderNode * +linear_gradient (guint n) +{ + GskRenderNode *nodes[n]; + GskRenderNode *container; + graphene_rect_t bounds; + GskColorStop stops[5]; + graphene_point_t start, end; + guint i, j, n_stops; + + for (i = 0; i < n; i++) + { + bounds.size.width = g_random_int_range (20, 100); + bounds.origin.x = g_random_int_range (0, 1000 - bounds.size.width); + bounds.size.height = g_random_int_range (20, 100); + bounds.origin.y = g_random_int_range (0, 1000 - bounds.size.height); + do { + start.x = g_random_double_range (- bounds.size.width / 4, bounds.size.width / 4); + if (start.x >= 0) + start.x += bounds.origin.x; + else + start.x += bounds.origin.x + bounds.size.width; + start.y = g_random_double_range (- bounds.size.height / 4, bounds.size.height / 4); + if (start.y >= 0) + start.y += bounds.origin.y; + else + start.y += bounds.origin.y + bounds.size.height; + end.x = g_random_double_range (- bounds.size.width / 4, bounds.size.width / 4); + if (end.x >= 0) + end.x += bounds.origin.x; + else + end.x += bounds.origin.x + bounds.size.width; + end.y = g_random_double_range (- bounds.size.height / 4, bounds.size.height / 4); + if (end.y >= 0) + end.y += bounds.origin.y; + else + end.y += bounds.origin.y + bounds.size.height; + } while (graphene_point_equal (&start, &end)); + n_stops = g_random_int_range (2, 5); + for (j = 0; j < n_stops; j++) + { + if (j == 0) + stops[j].offset = 0; + else if (j == n_stops - 1) + stops[j].offset = 1; + else + stops[j].offset = g_random_double_range (0, 1); + hsv_to_rgb (&stops[j].color, g_random_double (), g_random_double_range (0.15, 0.4), g_random_double_range (0.6, 0.85)); + stops[j].color.alpha = g_random_double_range (0, 1); + } + g_qsort_with_data (stops, n_stops, sizeof (stops[0]), compare_color_stops, 0); + if (g_random_boolean ()) + nodes[i] = gsk_linear_gradient_node_new (&bounds, &start, &end, stops, n_stops); + else + nodes[i] = gsk_repeating_linear_gradient_node_new (&bounds, &start, &end, stops, n_stops); + } + + container = gsk_container_node_new (nodes, n); + + for (i = 0; i < n; i++) + gsk_render_node_unref (nodes[i]); + + return container; +} + int main (int argc, char **argv) { @@ -234,6 +315,7 @@ main (int argc, char **argv) { "clipped-colors.node", clipped_colors }, { "rounded-borders.node", rounded_borders }, { "rounded-backgrounds.node", rounded_backgrounds }, + { "linear-gradient.node", linear_gradient }, }; GError *error = NULL; GskRenderNode *node; |