summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2020-09-15 06:20:56 +0200
committerTimm Bäder <mail@baedert.org>2020-09-18 15:39:07 +0200
commit6a089816fc41031a94bcae102d5000f14d582cbf (patch)
tree2f9d51df55ca01014ddb9c29c60c71ad73ff5ee9
parent2886e19772b99fff4ce1c4cefc8a6c5379333cdf (diff)
downloadgtk+-6a089816fc41031a94bcae102d5000f14d582cbf.tar.gz
gsk: Parse radial gradient nodes
-rw-r--r--gsk/gskrendernodeparser.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index e94034eae1..5520167950 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -1013,6 +1013,63 @@ parse_repeating_linear_gradient_node (GtkCssParser *parser)
}
static GskRenderNode *
+parse_radial_gradient_node_internal (GtkCssParser *parser,
+ gboolean repeating)
+{
+ graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 50, 50);
+ graphene_point_t center = GRAPHENE_POINT_INIT (25, 25);
+ double hradius = 25.0;
+ double vradius = 25.0;
+ double start = 0.5;
+ double end = 1.0;
+ GArray *stops = NULL;
+ const Declaration declarations[] = {
+ { "bounds", parse_rect, NULL, &bounds },
+ { "center", parse_point, NULL, &center },
+ { "hradius", parse_double, NULL, &hradius },
+ { "vradius", parse_double, NULL, &vradius },
+ { "start", parse_double, NULL, &start },
+ { "end", parse_double, NULL, &end },
+ { "stops", parse_stops, clear_stops, &stops },
+ };
+ GskRenderNode *result;
+
+ parse_declarations (parser, declarations, G_N_ELEMENTS(declarations));
+ if (stops == NULL)
+ {
+ GskColorStop from = { 0.0, GDK_RGBA("AAFF00") };
+ GskColorStop to = { 1.0, GDK_RGBA("FF00CC") };
+
+ stops = g_array_new (FALSE, FALSE, sizeof (GskColorStop));
+ g_array_append_val (stops, from);
+ g_array_append_val (stops, to);
+ }
+
+ if (repeating)
+ result = gsk_repeating_radial_gradient_node_new (&bounds, &center, hradius, vradius, start, end,
+ (GskColorStop *) stops->data, stops->len);
+ else
+ result = gsk_radial_gradient_node_new (&bounds, &center, hradius, vradius, start, end,
+ (GskColorStop *) stops->data, stops->len);
+
+ g_array_free (stops, TRUE);
+
+ return result;
+}
+
+static GskRenderNode *
+parse_radial_gradient_node (GtkCssParser *parser)
+{
+ return parse_radial_gradient_node_internal (parser, FALSE);
+}
+
+static GskRenderNode *
+parse_repeating_radial_gradient_node (GtkCssParser *parser)
+{
+ return parse_radial_gradient_node_internal (parser, TRUE);
+}
+
+static GskRenderNode *
parse_inset_shadow_node (GtkCssParser *parser)
{
GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50);
@@ -1535,10 +1592,12 @@ parse_node (GtkCssParser *parser,
{ "debug", parse_debug_node },
{ "inset-shadow", parse_inset_shadow_node },
{ "linear-gradient", parse_linear_gradient_node },
+ { "radial-gradient", parse_radial_gradient_node },
{ "opacity", parse_opacity_node },
{ "outset-shadow", parse_outset_shadow_node },
{ "repeat", parse_repeat_node },
{ "repeating-linear-gradient", parse_repeating_linear_gradient_node },
+ { "repeating-radial-gradient", parse_repeating_radial_gradient_node },
{ "rounded-clip", parse_rounded_clip_node },
{ "shadow", parse_shadow_node },
{ "text", parse_text_node },