From 6c473d5ff71bd6b74476b7bf0fa20687a3af160b Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 21 May 2019 05:41:06 +0200 Subject: [PATCH 01/14] glrenderer: Handle NULL debug messages --- gsk/gl/gskglrenderer.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 1a9f20bf02..3a57fb1eef 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -2605,11 +2605,16 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self, break; case GSK_DEBUG_NODE: - ops_push_debug_group (builder, gsk_debug_node_get_message (node)); - gsk_gl_renderer_add_render_ops (self, - gsk_debug_node_get_child (node), - builder); - ops_pop_debug_group (builder); + { + const char *message = gsk_debug_node_get_message (node); + if (message) + ops_push_debug_group (builder, message); + gsk_gl_renderer_add_render_ops (self, + gsk_debug_node_get_child (node), + builder); + if (message) + ops_pop_debug_group (builder); + } break; case GSK_COLOR_NODE: From c8fc40e793bc51bd2098c94ec05241c42dfb6d85 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 14 May 2019 03:11:33 +0200 Subject: [PATCH 02/14] rendernodeparser: Print properties alphabetically Because now we have a rule. Also update some tests to the new order. --- gsk/gskrendernodeparser.c | 69 +- .../gsk/serializedeserialize/testswitch.node | 178 +- .../serializedeserialize/widgetfactory.node | 1698 ++++++++--------- 3 files changed, 973 insertions(+), 972 deletions(-) diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index e0b881310d..ec122e594d 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -1536,9 +1536,9 @@ render_node_print (Printer *p, { start_node (p, "cross-fade"); + append_node_param (p, "end", gsk_cross_fade_node_get_end_child (node)); append_float_param (p, "progress", gsk_cross_fade_node_get_progress (node)); append_node_param (p, "start", gsk_cross_fade_node_get_start_child (node)); - append_node_param (p, "end", gsk_cross_fade_node_get_end_child (node)); end_node (p); } @@ -1553,8 +1553,8 @@ render_node_print (Printer *p, start_node (p, "linear-gradient"); append_rect_param (p, "bounds", &node->bounds); - append_point_param (p, "start", gsk_linear_gradient_node_peek_start (node)); append_point_param (p, "end", gsk_linear_gradient_node_peek_end (node)); + append_point_param (p, "start", gsk_linear_gradient_node_peek_start (node)); _indent (p); g_string_append (p->str, "stops:"); @@ -1584,8 +1584,8 @@ render_node_print (Printer *p, { start_node (p, "opacity"); - append_float_param (p, "opacity", gsk_opacity_node_get_opacity (node)); append_node_param (p, "child", gsk_opacity_node_get_child (node)); + append_float_param (p, "opacity", gsk_opacity_node_get_opacity (node)); end_node (p); } @@ -1595,12 +1595,12 @@ render_node_print (Printer *p, { start_node (p, "outset-shadow"); - append_rounded_rect_param (p, "outline", gsk_outset_shadow_node_peek_outline (node)); + append_float_param (p, "blur", gsk_outset_shadow_node_get_blur_radius (node)); append_rgba_param (p, "color", gsk_outset_shadow_node_peek_color (node)); append_float_param (p, "dx", gsk_outset_shadow_node_get_dx (node)); append_float_param (p, "dy", gsk_outset_shadow_node_get_dy (node)); + append_rounded_rect_param (p, "outline", gsk_outset_shadow_node_peek_outline (node)); append_float_param (p, "spread", gsk_outset_shadow_node_get_spread (node)); - append_float_param (p, "blur", gsk_outset_shadow_node_get_blur_radius (node)); end_node (p); } @@ -1610,8 +1610,8 @@ render_node_print (Printer *p, { start_node (p, "clip"); - append_rect_param (p, "clip", gsk_clip_node_peek_clip (node)); append_node_param (p, "child", gsk_clip_node_get_child (node)); + append_rect_param (p, "clip", gsk_clip_node_peek_clip (node)); end_node (p); } @@ -1621,8 +1621,8 @@ render_node_print (Printer *p, { start_node (p, "rounded-clip"); - append_rounded_rect_param (p, "clip", gsk_rounded_clip_node_peek_clip (node)); append_node_param (p, "child", gsk_rounded_clip_node_get_child (node)); + append_rounded_rect_param (p, "clip", gsk_rounded_clip_node_peek_clip (node)); end_node (p); @@ -1633,8 +1633,8 @@ render_node_print (Printer *p, { start_node (p, "transform"); - append_transform_param (p, "transform", gsk_transform_node_get_transform (node)); append_node_param (p, "child", gsk_transform_node_get_child (node)); + append_transform_param (p, "transform", gsk_transform_node_get_transform (node)); end_node (p); } @@ -1644,9 +1644,9 @@ render_node_print (Printer *p, { start_node (p, "color-matrix"); + append_node_param (p, "child", gsk_color_matrix_node_get_child (node)); append_matrix_param (p, "matrix", gsk_color_matrix_node_peek_color_matrix (node)); append_vec4_param (p, "offset", gsk_color_matrix_node_peek_color_offset (node)); - append_node_param (p, "child", gsk_color_matrix_node_get_child (node)); end_node (p); } @@ -1656,6 +1656,17 @@ render_node_print (Printer *p, { start_node (p, "border"); + _indent (p); + g_string_append (p->str, "colors: "); + append_rgba (p->str, &gsk_border_node_peek_colors (node)[0]); + g_string_append_c (p->str, ' '); + append_rgba (p->str, &gsk_border_node_peek_colors (node)[1]); + g_string_append_c (p->str, ' '); + append_rgba (p->str, &gsk_border_node_peek_colors (node)[2]); + g_string_append_c (p->str, ' '); + append_rgba (p->str, &gsk_border_node_peek_colors (node)[3]); + g_string_append (p->str, ";\n"); + append_rounded_rect_param (p, "outline", gsk_border_node_peek_outline (node)); _indent (p); @@ -1669,17 +1680,6 @@ render_node_print (Printer *p, string_append_double (p->str, gsk_border_node_peek_widths (node)[3]); g_string_append (p->str, ";\n"); - _indent (p); - g_string_append (p->str, "colors: "); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[0]); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[1]); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[2]); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[3]); - g_string_append (p->str, ";\n"); - end_node (p); } break; @@ -1692,6 +1692,8 @@ render_node_print (Printer *p, start_node (p, "shadow"); _indent (p); + append_node_param (p, "child", gsk_shadow_node_get_child (node)); + g_string_append (p->str, "shadows: "); for (i = 0; i < n_shadows; i ++) { @@ -1716,8 +1718,6 @@ render_node_print (Printer *p, g_string_append_c (p->str, ';'); g_string_append_c (p->str, '\n'); - append_node_param (p, "child", gsk_shadow_node_get_child (node)); - end_node (p); } break; @@ -1726,12 +1726,12 @@ render_node_print (Printer *p, { start_node (p, "inset-shadow"); - append_rounded_rect_param (p, "outline", gsk_inset_shadow_node_peek_outline (node)); + append_float_param (p, "blur", gsk_inset_shadow_node_get_blur_radius (node)); append_rgba_param (p, "color", gsk_inset_shadow_node_peek_color (node)); append_float_param (p, "dx", gsk_inset_shadow_node_get_dx (node)); append_float_param (p, "dy", gsk_inset_shadow_node_get_dy (node)); + append_rounded_rect_param (p, "outline", gsk_inset_shadow_node_peek_outline (node)); append_float_param (p, "spread", gsk_inset_shadow_node_get_spread (node)); - append_float_param (p, "blur", gsk_inset_shadow_node_get_blur_radius (node)); end_node (p); } @@ -1771,6 +1771,8 @@ render_node_print (Printer *p, guint i; start_node (p, "text"); + append_rgba_param (p, "color", gsk_text_node_peek_color (node)); + _indent (p); desc = pango_font_describe ((PangoFont *)gsk_text_node_peek_font (node));; font_name = pango_font_description_to_string (desc); @@ -1778,10 +1780,6 @@ render_node_print (Printer *p, g_free (font_name); pango_font_description_free (desc); - append_float_param (p, "x", gsk_text_node_get_x (node)); - append_float_param (p, "y", gsk_text_node_get_y (node)); - append_rgba_param (p, "color", gsk_text_node_peek_color (node)); - _indent (p); g_string_append (p->str, "glyphs: "); glyph = gsk_text_node_peek_glyphs (node); @@ -1789,7 +1787,6 @@ render_node_print (Printer *p, glyph->glyph, glyph->geometry.width, glyph->geometry.x_offset, glyph->geometry.y_offset, glyph->attr.is_cluster_start); - for (i = 1; i < n_glyphs; i ++) { glyph = gsk_text_node_peek_glyphs (node) + i; @@ -1798,10 +1795,13 @@ render_node_print (Printer *p, glyph->geometry.x_offset, glyph->geometry.y_offset, glyph->attr.is_cluster_start); } - g_string_append_c (p->str, ';'); g_string_append_c (p->str, '\n'); + append_float_param (p, "x", gsk_text_node_get_x (node)); + append_float_param (p, "y", gsk_text_node_get_y (node)); + + end_node (p); } break; @@ -1811,10 +1811,10 @@ render_node_print (Printer *p, start_node (p, "debug"); _indent (p); + append_node_param (p, "child", gsk_debug_node_get_child (node)); /* TODO: We potentially need to escape certain characters in the message */ g_string_append_printf (p->str, "message: \"%s\";\n", gsk_debug_node_get_message (node)); - append_node_param (p, "child", gsk_debug_node_get_child (node)); end_node (p); } break; @@ -1833,10 +1833,10 @@ render_node_print (Printer *p, case GSK_REPEAT_NODE: { start_node (p, "repeat"); - append_rect_param (p, "bounds", &node->bounds); - append_rect_param (p, "child-bounds", gsk_repeat_node_peek_child_bounds (node)); + append_rect_param (p, "bounds", &node->bounds); append_node_param (p, "child", gsk_repeat_node_get_child (node)); + append_rect_param (p, "child-bounds", gsk_repeat_node_peek_child_bounds (node)); end_node (p); } @@ -1849,6 +1849,8 @@ render_node_print (Printer *p, start_node (p, "blend"); + append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node)); + _indent (p); for (i = 0; i < G_N_ELEMENTS (blend_modes); i++) { @@ -1859,7 +1861,6 @@ render_node_print (Printer *p, } } append_node_param (p, "top", gsk_blend_node_get_top_child (node)); - append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node)); end_node (p); } diff --git a/testsuite/gsk/serializedeserialize/testswitch.node b/testsuite/gsk/serializedeserialize/testswitch.node index 940d821e00..7c3c7f2728 100644 --- a/testsuite/gsk/serializedeserialize/testswitch.node +++ b/testsuite/gsk/serializedeserialize/testswitch.node @@ -1,5 +1,4 @@ transform { - transform: translate(0, 0); child: container { color { bounds: 0 0 404 204; @@ -8,382 +7,383 @@ transform { container { container { transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(225,222,219); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); } container { container { outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 0; color: rgba(0,0,0,0.1); dx: 0; dy: 1; + outline: -1 -1 26 26 / 13; spread: 0; - blur: 0; } outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; dy: 1; + outline: -1 -1 26 26 / 13; spread: 0; - blur: 2; } rounded-clip { - clip: -1 -1 26 26 / 13; child: linear-gradient { bounds: 0 0 24 24; - start: 12 0; end: 12 24; + start: 12 0; stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); } + clip: -1 -1 26 26 / 13; } inset-shadow { - outline: 0 0 24 24 / 12; + blur: 0; color: rgb(255,255,255); dx: 0; dy: 1; + outline: 0 0 24 24 / 12; spread: 0; - blur: 0; } } border { + colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); } } } + transform: translate(1, 1); } transform { - transform: translate(56, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; x: 145; y: 18; - color: rgb(46,52,54); - glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; } + transform: translate(56, 0); } } transform { - transform: translate(0, 38); child: container { transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(53,132,228); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(24,95,180) rgb(24,95,180) rgb(24,95,180) rgb(24,95,180); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(24,95,180) rgb(24,95,180) rgb(24,95,180) rgb(24,95,180); } transform { - transform: translate(24, 0); child: container { container { outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 0; color: rgba(0,0,0,0.1); dx: 0; dy: 1; + outline: -1 -1 26 26 / 13; spread: 0; - blur: 0; } outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; dy: 1; + outline: -1 -1 26 26 / 13; spread: 0; - blur: 2; } rounded-clip { - clip: -1 -1 26 26 / 13; child: cross-fade { + end: linear-gradient { + bounds: 0 0 24 24; + end: 12 24; + start: 12 0; + stops: 0.1 rgb(255,255,255),0.9 rgb(255,255,255); + } progress: 0.756154; start: cross-fade { + end: linear-gradient { + bounds: 0 0 24 24; + end: 12 24; + start: 12 0; + stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); + } progress: 0.788575; start: color { bounds: 0 0 24 24; color: rgb(246,245,244); } - end: linear-gradient { - bounds: 0 0 24 24; - start: 12 0; - end: 12 24; - stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); - } - } - end: linear-gradient { - bounds: 0 0 24 24; - start: 12 0; - end: 12 24; - stops: 0.1 rgb(255,255,255),0.9 rgb(255,255,255); } } + clip: -1 -1 26 26 / 13; } inset-shadow { - outline: 0 0 24 24 / 12; + blur: 0; color: rgb(255,255,255); dx: 0; dy: 1; + outline: 0 0 24 24 / 12; spread: 0; - blur: 0; } } border { + colors: rgb(24,95,180) rgb(24,95,180) rgb(24,95,180) rgb(24,95,180); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(24,95,180) rgb(24,95,180) rgb(24,95,180) rgb(24,95,180); } } + transform: translate(24, 0); } } + transform: translate(1, 1); } transform { - transform: translate(56, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; x: 147; y: 18; - color: rgb(46,52,54); - glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; } + transform: translate(56, 0); } } + transform: translate(0, 38); } transform { - transform: translate(0, 76); child: container { transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(250,249,248); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); } container { rounded-clip { - clip: -1 -1 26 26 / 13; child: color { bounds: 0 0 24 24; color: rgb(250,249,248); } + clip: -1 -1 26 26 / 13; } border { + colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); } } } + transform: translate(1, 1); } transform { - transform: translate(56, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; x: 145; y: 18; - color: rgb(46,52,54); - glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; } + transform: translate(56, 0); } } + transform: translate(0, 76); } transform { - transform: translate(0, 114); child: container { transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(250,249,248); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); } transform { - transform: translate(24, 0); child: container { rounded-clip { - clip: -1 -1 26 26 / 13; child: color { bounds: 0 0 24 24; color: rgb(250,249,248); } + clip: -1 -1 26 26 / 13; } border { + colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); } } + transform: translate(24, 0); } } + transform: translate(1, 1); } transform { - transform: translate(56, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; x: 147; y: 18; - color: rgb(46,52,54); - glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; } + transform: translate(56, 0); } } + transform: translate(0, 114); } transform { - transform: translate(0, 152); child: container { transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(225,222,219); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); } container { container { outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 0; color: rgba(0,0,0,0.1); dx: 0; dy: 1; + outline: -1 -1 26 26 / 13; spread: 0; - blur: 0; } outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; dy: 1; + outline: -1 -1 26 26 / 13; spread: 0; - blur: 2; } rounded-clip { - clip: -1 -1 26 26 / 13; child: linear-gradient { bounds: 0 0 24 24; - start: 12 0; end: 12 24; + start: 12 0; stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); } + clip: -1 -1 26 26 / 13; } inset-shadow { - outline: 0 0 24 24 / 12; + blur: 0; color: rgb(255,255,255); dx: 0; dy: 1; + outline: 0 0 24 24 / 12; spread: 0; - blur: 0; } } border { + colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); } } } + transform: translate(1, 1); } transform { - transform: translate(78, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; x: 123; y: 18; - color: rgb(46,52,54); - glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; } + transform: translate(78, 0); } transform { - transform: translate(388, 0); child: transform { - transform: translate(1, 6); child: container { container { outset-shadow { - outline: -1 -1 16 16 / 3; + blur: 0; color: rgba(0,0,0,0.1); dx: 0; dy: 1; + outline: -1 -1 16 16 / 3; spread: 0; - blur: 0; } outset-shadow { - outline: -1 -1 16 16 / 3; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; dy: 1; + outline: -1 -1 16 16 / 3; spread: 0; - blur: 2; } linear-gradient { bounds: 0 0 14 14; - start: 7 0; end: 7 14; + start: 7 0; stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); } inset-shadow { - outline: 0 0 14 14 / 2; + blur: 0; color: rgb(255,255,255); dx: 0; dy: 1; + outline: 0 0 14 14 / 2; spread: 0; - blur: 0; } } border { + colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); outline: -1 -1 16 16 / 3; widths: 1 1 1 1; - colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); } } + transform: translate(1, 6); } + transform: translate(388, 0); } } + transform: translate(0, 152); } } } + transform: translate(0, 0); } diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node b/testsuite/gsk/serializedeserialize/widgetfactory.node index 780a847bd4..95dd44a686 100644 --- a/testsuite/gsk/serializedeserialize/widgetfactory.node +++ b/testsuite/gsk/serializedeserialize/widgetfactory.node @@ -1,22 +1,21 @@ transform { - transform: translate(0, 0); child: container { container { outset-shadow { - outline: 26 23 1464 788 / 8 8 0 0; + blur: 6; color: rgba(0,0,0,0.2); dx: 0; dy: 2; + outline: 26 23 1464 788 / 8 8 0 0; spread: 2; - blur: 6; } outset-shadow { - outline: 26 23 1464 788 / 8 8 0 0; + blur: 0; color: rgba(0,0,0,0.18); dx: 0; dy: 0; + outline: 26 23 1464 788 / 8 8 0 0; spread: 1; - blur: 0; } } color { @@ -24,1411 +23,1407 @@ transform { color: rgb(246,245,244); } transform { - transform: translate(26, 23) translate(6, 0); child: container { container { rounded-clip { - clip: -6 0 1464 47 / 7 7 0 0; child: linear-gradient { bounds: -6 0 1464 46; - start: 1458 23; end: -6 23; + start: 1458 23; stops: 0.08 rgb(227,234,242),0.25 rgb(246,245,244); } + clip: -6 0 1464 47 / 7 7 0 0; } rounded-clip { - clip: -6 0 1464 47 / 7 7 0 0; child: color-matrix { - matrix: matrix3d(0.0196078, 0.615686, 0.266667, 0, 0.780392, 0.270588, -0.211765, 0, 0.619608, -0.203922, -0.211765, 0, 0, 0, 0, 0.1); - offset: 0.180392 0.203922 0.211765 0; child: texture { bounds: 1081.2 0 256 256; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABmJLR0QA/wD/AP+gvaeTAAAbAUlEQVR4nO2deZRfRZXHP+nOvhBIMBDWDAFMwBDWyCDIDoNA2B13FBhAZQTEASIiAZ1RBBf0jA6KolFU8CCIiBoggLJEAwFDWBICISGbIQsJWZpsPX/cbtJp+vf7vaWqbr337uec7+mcpPPqVr2qeu9V3boXDMMwDMMwDMMwDMOoAs3aBhiGB44CHgOOAHYBugGLgI2KNhmGEYhHgdZOehN4EBgPHIhMCoZhlIwTeOfg70qLgQnAyUAvFUsNw3BKN2AKySaAjnoD+KWCvYYRJQcANwF/A7ZStiUNp5F+8LdrlYK9hhEN/YDPAM+x5cAoypOxG/APsk8Ai8KbbBj67AR8A1hG7cFxoZp1yRlL9sHfCswKb7Jh6LEr8pq/lsaDowXYX8fMxDxGvgng6fAmG0Z4dgJ+DKwn3QB5CRioYG8SjiTf4G8F/hrcasMIyNbA9cAasg+S24JbnYyJ5J8A7gtutWEE5JPkHyStwEcD292I/YBN5K/Xz0Mbbhgh2RM3E8AbwLCwptflTtzU66bQhhtGSLoh3m8uBsujxHGOZCTi3++iTl8KbHsUNGkbYASjFZjs6FrvA8Y5ulYersJdH17q6DqGES3jcPO0bAXWAWPCmr8Fw0m/k1FPHwxrfhzYG0C1eMLhtXogXoIDHF4zDVcC3R1e73WH1zKMKOmLOPW4emq2ArcErYGwE/BWRntraXTQGhiGEo/gduC0IodwQvI9h7a3a6egNTAMJa7F/eBZBuwcyP5huH+LaQX6BLLfMFQ5AveDpxXxxguxpjTBg+1rAthtGFHQi3zuwPV0lWfbR+Fu37+j5nq22zCiYhJ+JoCNwDEe7b7Xk92VPQnochvFKA4PISfoXNOEvKLvB/yzwe82A9shi2/bt6kbcmipCdnj/ycwH3gFOb58ogebAZZ7um702ARQTR7yeO2hyKnB45BDOk3ACCQS714dNIw43ImhwuHAbAKoJn8HViNhwHxwNHJIpw9wMPHGEWinRdsALWwCqCbrgMeBYz2WcarHa7tmrbYBWpgrcHXx+RlQNCr7BmATQHWxCWAz9gZgVI4nkXRZhpwrqCSxrMIa4dmEbAUO1zYkAkYjC5VPUbHPAZsAqs1wxDW46vQEDgXORxbGn0YWSmOgCfF/WEmFtysNPxyPH8+6omsx8Gl0P5HfhcQ8mN1m0/3K9hglZCB+fOvLosnAvplbNxuHAL+g6xOPvs9aGBVkGvoDLWZtBG7Gb5LUJiRN+eMNbFmPfKoYhjNuRn+QFUGzgfdmbONaDAT+CzmNmNSOucBgx3YYFeVQYAH6g6soWocM2G5ZGrsDuwHfQRb2sthxjwMbjIpzPu7j6lVFDyCnF9NyAHJa0kU0449nKN8w6IdE89UeREXXa8A+Cdq7JzJYn3Jc/uvAtgnKN4y3GYL7jlhlrUCOPXfFrsBX8PuJ9dMaZRvGO9gFeBH9QVM2bQAubGvjJiQi0h24TVpSTz4jMBklYS/klVV7sJRZdyi18UygN4ZRg9HAEvQHiMmfzsAwumA4sBD9Dmrypx+QAzsMFIaJiF/3aGAQcgzXdyDKHYCHCZewwwjPXcCnkInAiJST6Hrmngv8CllAGuG4zEHAszXKNZVDf0K2GI2IaSb5QFyARNM9D9g9R5nd8Rf33xSHHsdfQFfDIR8j+02eC/wM+CQSQjsp38hRpil+PQVsgxE9TcDzuLvxrwA/Bj5B7TeEM5BIP9qd1ORHz+D4IJAdKPDHWcjesC8WA08gr4OPI9Fi/gIM8Fimocd04CjEBdgZNgH4YyqSIssw8vICEr+xUbq11FiIIT8cgQ1+ww0zkUxLzgc/2ATgi0u0DTBKwRzksNFCXwXYJ4B7dkNmbXOyMvIwBzi87ac37A3APedgg9/Ixzzktd/r4Ad7A3BNM/AqkvPeSMZ6ZItzJrKzsRpY0/Zv/YC+SByDPZG3qx4KNoZkIbKGNDNEYZYd2C3HYYO/EUuQMwqTgEeAl5BJIAk9kIngcGRV/EjKFSBzKXK+P8jgN9yzLeKjre0wEptagN8jvhEun+DNyICZgPhBaNczj9YgOQGMgtMNuAKJFKPdqbS1EriJbAE00zIYGI88RbXrnVYbgFOdt4ihyjHI3q1259LQWuBa/CbTqMVWwHVtNmi3QxJtAs720hKGOu1n8rU7WUj9kTgyDu9BMT7HrvDVAEYcdAMupvwx+Fva6hkbn0B2FrTbp5bG+Ku6ERMHATPQ73A+NJPwSTTTsB8wC/126ko/8lhvIzL6IIti2p3OpaYgqaxjZxCNk29q6E101koMRU6jHJF6JwL9HbeNT/oD96Pfbp31Hz4rbcTJDsTZGZPqL8gbTdHoA/wV/fbrqMlea2xES/sCYQv6nTCNnqXYYakGItF1tNuxXZuAHb3W2Iia0cBz6HfEJHqdcrg770JcTkP2GVBx+gA3o98RGz2pPuCrARQ4mXhiKN7lua5GQfgIsjKs3SG70o0e663Ft9Fv11bknvfyXFejIIwApqHfKTtqNnI0t2z0Q87da7dvKxIDwDAAyfgak8/AWL/VVeV09Nu3FbjKd0WNYrEz+p2yFdmuLDsPod/Od3uvpVEo/h39TtmKBOAoO0ej384LvNfSKBTfQb9TPuG9lvHwKPrtHXSL1YKCxs3B2gYgk1BV+L62AcD+2gYYcdAN/e3AFRTT3TcrfYA30G3zy7zXsgP2BhAvu6B/0OZ2JLJOVViLvkNO0GAqNgHEywhtA4B7tA1QQLvONgEYALxbufwNyKm5qvEwsFGx/Fqp371gE0C87Kxc/lRkDaBqLAeeVix/F2T7N0iQEJsA4iVEKO16TFEuXxPNuncHfo1kSboPOB+PfcEmgHgZqlz+i8rlaxJD3XsBJyAnROcjPgpXIkfHLaVfBZiO7nbUsf6rGC3Ho+8QVE/zgVuAM4GtPbWBocyr6HayPb3XMF5GoD/Ik2o9Ep5tHBL92N4OSoJ2ViHtNQhNdkB/YGfVYuAOJB9CkcO2VZ6V6HYkbSckTQagP5BdaAOyrXkxsGtXFbXXhXhZi8QE0KI7uvvhmjQjg6dsTEU8He9CYlDaBBAx85FXUS0GICm3q8gA5A2srLQik1yrbQPGyyLl8gcol69J2evenqfS/AAiZo5y+WUfBPUoe6qulvY/2AQQL7OVy+9y0agiDNM2wDNvn/C0CSA++iI54z+lbIf2YSRNyl73t98AumtaYWxBd+Ac4MvEkSYqhuPIWtgEYASjG3AG8FXi6nhjtA1QpOx1b2n8K4ZvmpDUVFPQdxip5URSRT/zrZG6a7e/T70d5t3WAMLTBJyFHPa5BzhQ15yaNAOHaRuhwFFI3cvMvPY/2AQQjl7AhcAsxFd7pK45iThV2wAFTtE2IADzGv+K4Yp+iC/2a+i/+qXVCsqZD7AWfdE/gxFCloo8AIOAa4Al6N/wPPqw64aJmI+i394hdIKrBjPeyXbADejH9Helx902T9RMRr+9Q2iUqwYzNjMIGI+8NmvfYNc60l0zRctx6LdzKA1sr7SdBszPQODzwCWU14f8IWR1vMw8Arxf2whHrEUW+uYALwOvdNDLdIj2bBNAPo5BVvSrEHnldPSz5vjiTOA32kYk4C3klOj8Dj8Xdvq5AElvlgibAPJxJDBJ24hAzAX2AlZrG+KY/sALBM7KW4M3kFiQszv8bP/zImRB2YiIfkhQRu1vulD6lptmi4qb0G/XVmCG74oafngS/c4TSpsol6PMSUidtNu1Ffi657oanvgu+p0npJYg6auKzjBgGfrt2a5DvNbW8MaH0O88oTUd2fYsKoOB59Fvx3YtwtzyC8vO6HcgDT1KMd2E+yLOTdrt11E/9Fpjwzsz0e9EGnqAYsUO3Ap4EP1266wqOFqVmhvQ70RamoZu+PKkbAc8hX57ddZs7PW/8ByKfkfS1CvEG9cA4CBkoGm3U1ca76/aRiiaEE8s7c6kqXVIMNPYnMvOZ3Mc/Ni0CRjur+pGSH6MfoeKQQ8QR2zDEcT5vd9RD3qrfUJim62LzMlIiK9GrEAyuC5F9tSXIvvRHX8uafu9NcjTay0SyHEtcACyAh8z64BvImsjywOXvQ3yJnIp0DNw2Wk5CfiDpgE2AbijDxL5Z3Wb3kQG8Sokykz7YF/voKz7KEZQh5XA/wLfBl73XNYQZNB/lmLsTEwD9kXeBAwjFQcQjwtrErUAv0eCobp8KjcjJzInIJOudj3T6CMO28GoIHei34mzaDlwN/A5YB/STQg9gdHIm9bvkNNz2vXJoleIJCeHfQIUl72BZ4ikI+VgI7JFNxP5TFqFfD6BvMr3B7ZFFhaHUY6Q3ecAt2obYRSfb6P/NDOl0xTM8ScYQ4FzkW/EOWy+CR/QNMohA5DQT9qd2pRMGyl/2jF1tkXi8z2GNHhXN2IW0FvLQMechX7HNiXT/9W4h0ZOmti8GryGZDfjahVL/fBH9Du3qbH2qnUDjeychMRMS3sz1gD/Et5cL+xE8ROQVEF31LqBRnbGk/2G3B3eXG/EFN7KVFtn1LqBGpRhNbI1x/89BTjRlSHK3It9YxaBHwDv0jainTJMAJty/v+biGNBsBvydOiT4xqfB/7hxhzDE+8CbtQ2okxcTf7Xsi8Ft3pL+rPZs+814BM5rrUnth5QBJVlK1qdq8h/M1YjXmYa7I4E2exs0++A7TNecwzF842vmhYgwUmNnHwRNzdEI+3V8dQPTb2E7Om5TwY21Lm2SV+/rXn3jMSMw90NCfladj7JswpNQLIQpeXChNc36SnrBG+0cQXubsZMoJdne3sDv8hg23RgZMqy9slQjimsliOh5Y2MXI7bGzLOo61Dgck5bHsTebVPyvdzlGUKp/uxk7mZuQy3N2MVfhYED8TNwZ0NwEUJyuuHRCTS7tymZPpM17fRaMSluL8Zf8Wtj8RZuF2VfyZBmec5LM/kX6uRLdygmCNQ1xxKsqdsI7ohaxS34zaN1s8S/M4FDssz/NMX+CnlCHgSlIvwNyPnOb21FbLN49qu9UiWm3rs76FcUxhd0cX9NOrwGfzdjFeQ+AJpORB4yZNN9yYo/6eeyjb5Vwuye2Mk5AL83pCJJI+71wx8Ab+ZaD7YwIbtkU6k3ZFN2TWV4sd6DIbPN4B2/Z7GjjgHAU96tmM5jQ8uXRugPaqmJwmfWPTyzjfW6BrXfgC19He6DiCyB3ALtcOPuVSj4769gEWB2qMKWoaEIG9GnshXINmZQpS9BssbmIivEK5DtAC/QjrC9cDjhA3CcUiDtrCtPzfaiLhfd3Vuf3fg4UB2TMIchBpyE/odJoRmUL8zdEPSTWnbWWStQ+L1N3K5bkICz4Y4cZnnaHgluAv9jhNCX2zQDsdGYGNRtQrJsZDWJ38P4AnPtiVx+qo0z6LfgXxrI407Z4jIwLeTLQBrrHoGeZLnOZffHQkos86DfUuwSMJ1aSJ5GPAia2KDdtgbv2sRm5BwY+1tfgwS4dZHp/etZcDNiLenS0YhE4orO1fTeM2n8uyHfocKoUaZZH/ksewW4Mwa5Q5FnqAP4Nf3Ia/mAN8Djsbv/npv4Fvk3xFqQSZZowHXoN+5fOsN6gcKHYK/rak3gCPrlN2RrZCgpj9BPCi1260V+AOSSj00RyAJT7PYvIHaE67RgT5IAE3tTuZbP2zQDtd4KnchsG+DsuuxLRJh6RrEfXk24UOUnZfD/rwMQPxD0ti7CV2bc3Mism3xfmTRyufJpu+iPzhDqN4TuAcw30OZ85B03K7p2XbdE4HPIavvPtvuaA91SMuJyGTayNYNSCLboLh0MhgMvAwM7PB365Cn9KvIE2BOm+a2aX7b76RhJHAd+V+TViEOHVORcFszgKXIItF6ZAbv16YRyCLPPsC/Iqm4QrAU8e3fUOPfz8J9uqnXgKOQBKq+uRM43eP1hyOfI9oMRrYZP17j3zcAZwO/DGZRGy4ngOtJ77+8CXFdnYN0vMVI2KsVbeqHLNpsjQzCA8gXP20l4sn3a8SLL+3kA9JmByEd90z8umv+DPhknX+fRPJv9CS8igz+2Q6vWY+PAT/3dO0NyBn79Z6un4VjEXfu3Tr83RrgQ8h5k8IyhLjj0L+KnBrMElm3Hk3Aacg5AR92n1an7JG43fqbTfhkqVvjb/cg1CSWlj5IPst1yBve+1StccR49Ad5V1qKhMbu6a3mmzkWeN6x/UPqlOdyDeRFYMe8DZCRiQltTKtJISuRgf0RT8LC0wd5ddce7J11G/UHkA96IesTLhxkGn2DP+agjFbgObJnIHLBp2vYlVcTQlaiypyL/mDvqNXIgoomo8m/F35bgzL6IYtGecqYRvhJsjM74MeL8eshK1FlfB+GSKN5xBNOaQiy0Ji1LtclLOcisjkCPU22cGc+mIr7vnBx0BpUlL3RH/TtmkX4RaxG9AZ+Q7b6XJKinL2RAZ302k8Cg3LVzC3/g/v+cFbQGlSUb6A/8FuRbUStRaxG9AD+TPo6XZmynJ7IQGq0/vAQ4rYbE4fhvk+UYnU9dmahP/iXEf+Ryf7AFNLVK+si1ihqf3rcQ/1zBVp0R+IduuwXsb0Nlo7R6A/+TcAJvivqiO1IF69vBV2HpEpCE/BZtkwNditxR5q9A7d9o1HwVCMnpxI2Hl5XusF7Ld0ylnT1exB5e8jKjkhykhuIP7bcp3DXL5YGtr2ynIJeAsoXCOPg45pbSVfP6cDBKpaGZSjuHijTAtteaUYggzH0BHBciMp5YCAS6ilNXTch3+8foNy549LsZNTTn0IbXnW2Au4m3OBPkh4rZsaRve4LgBuRI9c9QhvuGVfbgT8Jbbgh35hfJkyCjKJv8QwAXid/O6xEJt7/BMZQzE+ijrjaDvxqaMONzZyM33WBR8NVxStfwn3btCBbgN8BPkzxtsJcbQd+NrThxpbshb/suOcErIdPdiXMLso/kfWDK5HPhr4hKpeDrJ6THXVKcKuNdzAIuB+3nXktW0YcKjp5zgpk1QbkBODNSPi2vb3XMh0utgNHBbfa6JLuuD23XvTFv85cTPgJoCtt47uiKRiMRPHJU588vhOGB87DTeSXy0Ib7plYDlO913dFUzKJ7HVZpGBvYWkKVM4twPHIqnUe/uLAlph4EYlfoM2e2gZ04q4c/zeGIKCFIdQEABKB9yhk+ysLrUjIrTKxkTiSP+6ubUAnfovc7yzYBJCCkBMAwFPA4WR7TZtHHE9L18TgthpbbLr5yOnJJKxCHgwTETfr4KG1i4zG6bAXkGQJDyMOMUmZ48UafZZoG0C4PAdpGIeEX29Bdn/WIQ+AjYifySLkobBCy0AjH8eRLnjmH3TM9M6l6C8Cvuy9lkaUhP4E6MhE4Jspfn+VL0OUWa5tAPFFCDICoTkBgOQTeFHZBm1iOKfvOmGKURC0J4C3kLiCSSirc0cMTjhlXFw1EqA9AQD8MeHvlfU1dWttA5DUaUYFiWECSPptP8ynEYrEEJs/RCZgI0JimABGJ/y9HSnnt2rS+vvieeB2ZRuMCjOB5NtVY5Rs9EUz8gYUettvGhK8JfZw6kbJeQ/pIgh9QcdMb7yHcIP+OWTXZWSIihlGI5pJf+qrbM5Al+BvwG8CJgOXA8NDVcgwkvLfpO/Ua4lj1dwVk3E76DciIdOuIL4DPobxNieRPXjouQr2+mAY7kKCPQZcgGQfMoyoOZh8C1+PhTfZC1eTb9C/jmT8sW96ozDsjaRtyvvEOzS04Y7pDywmW90XI4t5ZXWMMkrKSOSct4tX3qTeg7GSJTHIW8jAjz2qr2G8g9FIeGoXg79d/xa0Bu7IkhpsAeXzgTAqwhhgGW4HfyswA+gVsB6uuJV09VyF+AsYRuE4DL9Zgr4VripOOIX0dfyaiqWGkZPjkGOmvgZ/K7KNdmKoCuVke7J9Br1fw1jDyMNYJJabz8HfruXE/4o8AAmImqV+sWXuMYy6fJB0sf5caC5xBrYEydg7kex1K/qWp1EhzkZyz4Uc/O16GdjNfxVT0Ru4k3z1Oj+41YaRgQvI7t7rSguA/XxXNCHbAU+Qv06/CG24YaTlUsKkuk6iNeinEN8PmI2b+ixHPiMMI0q+iP6g70q/RlbeQ9IL+Cru10BOCFkJw0iDRo77pFoGXEQYh6HjkaxHPurx8wD2G0YmzkR/oDfSXODTuA8t3tRW/yc9298CDHFsu2E4oRnJyKo9yJNoJZKq/BiyvxU0AYcAN+LuOz+Jrspor2HUxFVWmnORgVUkVgOPAE8DzwIvIWfslyBbmf0RB56+SPDMUW06BBiqYO88ZJtzvULZhlGXZmA6+k/4suu8pDfEMEKT5aCLKZ1eBnokvSGG0Yhmh9eagRz93cPhNY0t2QZZb3lG2xCjHLjOTLsHknSit4NrvYV8l89AIgmtRI4Wd0e+wYcBR1C90FizkOhKG7QNMYyuGE/6V9t1wN+A7wIfRSaSJG8n/ZDAmNqv5qH18QRtYxgq9ETeAup14NcQT71LkVX1vG8M1zcor2x6Ebefb4bhlP3Z7A67Adlq+x7wEWBnD+X1Qg4CaQ/MkPqwk5YzDE+MRaICDQhUXpZIu0XWdOLI7mwYUTAIcZLRHpghdYaTljOMkvAo4QfhOsQleKFC2VNxv5NjGIXlWsINvtXAZWz5ibM94hYd8oTkSTnbzDBKw5GEGXQrkRyH9TgMuBf/gVImp20kwygrgwjz5D8shU2HAFM823RsCnsMo9S4yj9YS1mCdDYhYcpcp0dr1yMZbDKMUvJn/A3+3+W0bVvgNg92XZPTLsMoDd/Hz+BfhruoPGNx96byZUc2GUYpuAo/E8DnHNs5ELiZfIuENvgNoxNn437wv4C/c/jHA3My2HS1J3sMo9AcjfsJYKxnm7dCPl2SvA1sAi73bI9hFJZ343bwh/S2ex/1Q4u3IMelDcOoQT/cTgCnhDWfPkiMg845FhcgPgWGYTRgGW4G/zPo+drvy+aU4pPQiURsGIWkUUCSpNI+bdcTOB079msYqfgT+Qf/c9jAM0pOWTv4fAfXuA5ZcTeM0lLWCWBBzv//AvAbF4YYRszYBNA1X8ee/oZRWPJkKZqDZd8xKkJZ3wDyrAF8DUvAaRiFZgeyPf0XIo44hmEUmGbgViRYZ5oJ4DINYw1DiypElB2GxO8bDYxCzgrsyDuf9EvbfndVQNsMQ5UqTAC1GIy41+7S9nMhcJ+qRYZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIYh/D/GS6zNWk3S1gAAAABJRU5ErkJggg=="); } + matrix: matrix3d(0.0196078, 0.615686, 0.266667, 0, 0.780392, 0.270588, -0.211765, 0, 0.619608, -0.203922, -0.211765, 0, 0, 0, 0, 0.1); + offset: 0.180392 0.203922 0.211765 0; } + clip: -6 0 1464 47 / 7 7 0 0; } inset-shadow { - outline: -6 0 1464 46 / 7 7 0 0; + blur: 0; color: rgba(255,255,255,0.8); dx: 0; dy: 1; + outline: -6 0 1464 46 / 7 7 0 0; spread: 0; - blur: 0; } } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -6 0 1464 47 / 7 7 0 0; widths: 0 0 1 0; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(526, 0); child: container { transform { - transform: translate(17, 11); child: container { rounded-clip { - clip: -17 -5 133 34 / 5 0 0 5; child: color { bounds: -16 -4 132 32; color: rgb(228,228,224); } + clip: -17 -5 133 34 / 5 0 0 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 133 34 / 5 0 0 5; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(28, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; x: 0; y: 17; - color: rgb(46,52,54); - glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; } + transform: translate(28, 0); } } + transform: translate(17, 11); } transform { - transform: translate(133, 0) translate(17, 11); child: container { color { bounds: -16 -4 132 32; color: rgb(246,245,244); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 133 34; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(28, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; x: 0; y: 17; - color: rgb(46,52,54); - glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; } + transform: translate(28, 0); } } + transform: translate(133, 0) translate(17, 11); } transform { - transform: translate(266, 0) translate(17, 11); child: container { rounded-clip { - clip: -17 -5 134 34 / 0 5 5 0; child: color { bounds: -16 -4 132 32; color: rgb(246,245,244); } + clip: -17 -5 134 34 / 0 5 5 0; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 134 34 / 0 5 5 0; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(28, 0); child: text { + color: rgb(46,52,54); font: "Cantarell 11"; + glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; x: 0; y: 17; - color: rgb(46,52,54); - glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; } + transform: translate(28, 0); } } + transform: translate(266, 0) translate(17, 11); } } + transform: translate(526, 0); } transform { - transform: translate(1367, 0) translate(6, 11); child: container { rounded-clip { - clip: -6 -5 36 34 / 5; child: color { bounds: -5 -4 34 32; color: rgb(246,245,244); } + clip: -6 -5 36 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -6 -5 36 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 4 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAH0lEQVQ4jWNgGPKAEY3/n1R9TNRzy0CB0TAYDQOqAADB/QMKPEUKLAAAAABJRU5ErkJggg=="); } - } - } - } - transform { - transform: translate(1409, 0); - child: transform { - transform: translate(7, 0) translate(10, 11); - child: color-matrix { matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); offset: 0.572549 0.584314 0.584314 0; + } + } + transform: translate(1367, 0) translate(6, 11); + } + transform { + child: transform { + child: color-matrix { child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAfUlEQVQ4je3RMQoCMRBG4Q+voEIKC/H+d7Cwd1GULSzEUyg2azOyQ1gxB9gHgcnknxdCmJliwAHr1FtiH2d/uUTwHJIVuuj1LYINbklyivqObYuglgx4YDcVXPwQvPFM+1esJgquxjf3qS4tgmM1UJKkaxF8g/m2YvyJmYoPk2IlW2Wofj0AAAAASUVORK5CYII="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(7, 0) translate(10, 11); } + transform: translate(1409, 0); } } + transform: translate(26, 23) translate(6, 0); } transform { - transform: translate(26, 70) translate(10, 10); child: container { container { container { container { transform { - transform: translate(9, 1); child: container { rounded-clip { - clip: -9 -1 374 34 / 5 0 0 5; child: color { bounds: -9 -1 374 34; color: rgb(252,252,252); } + clip: -9 -1 374 34 / 5 0 0 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -9 -1 374 34 / 5 0 0 5; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } clip { - clip: 0 0 357 32; child: container { text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; x: 0; y: 21; - color: rgb(50,50,50); - glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; } clip { - clip: 0 6 101 19; child: container { color { bounds: 0 0 357 32; color: rgb(53,132,228); } text { + color: rgb(252,252,252); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; x: 0; y: 21; - color: rgb(252,252,252); - glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; } } + clip: 0 6 101 19; } } + clip: 0 0 357 32; } } + transform: translate(9, 1); } transform { - transform: translate(374, 0) translate(10, 5); child: container { rounded-clip { - clip: -10 -5 36 34 / 0 5 5 0; child: color { bounds: -9 -4 34 32; color: rgb(246,245,244); } + clip: -10 -5 36 34 / 0 5 5 0; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(53,132,228); outline: -10 -5 36 34 / 0 5 5 0; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(53,132,228); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } } + transform: translate(374, 0) translate(10, 5); } } transform { - transform: translate(0, 44); child: container { transform { - transform: translate(9, 1); child: container { rounded-clip { - clip: -9 -1 374 34 / 5 0 0 5; child: color { bounds: -9 -1 374 34; color: rgb(250,249,248); } + clip: -9 -1 374 34 / 5 0 0 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -9 -1 374 34 / 5 0 0 5; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } clip { - clip: 0 0 357 32; child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; x: 0; y: 21; - color: rgb(212,207,202); - glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; } + clip: 0 0 357 32; } } + transform: translate(9, 1); } transform { - transform: translate(374, 0) translate(10, 5); child: container { rounded-clip { - clip: -10 -5 36 34 / 0 5 5 0; child: color { bounds: -9 -4 34 32; color: rgb(250,249,248); } + clip: -10 -5 36 34 / 0 5 5 0; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 36 34 / 0 5 5 0; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); - offset: 0.831373 0.811765 0.792157 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); + offset: 0.831373 0.811765 0.792157 0; } } + transform: translate(374, 0) translate(10, 5); } } + transform: translate(0, 44); } transform { - transform: translate(0, 88) translate(9, 1); child: container { rounded-clip { - clip: -9 -1 410 34 / 5; child: color { bounds: -9 -1 410 34; color: rgb(252,252,252); } + clip: -9 -1 410 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -9 -1 410 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } clip { - clip: 0 0 370 32; child: opacity { - opacity: 0.54902; child: text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 30 10240 0 0 1, 349 4096 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 862 3072 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 862 3072 0 0 1, 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 358 13312 0 0 1, 370 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1; x: 0; y: 21; - color: rgb(50,50,50); - glyphs: 30 10240 0 0 1, 349 4096 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 862 3072 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 862 3072 0 0 1, 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 358 13312 0 0 1, 370 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1; } + opacity: 0.54902; } + clip: 0 0 370 32; } transform { - transform: translate(370, 0) translate(6, 0); child: color-matrix { - matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 1); - offset: 0.654902 0.666667 0.666667 0; child: texture { bounds: 0 8 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAyklEQVQ4jc3S3UpCURAF4K8w8ypQA1EfpkcI8SmEEh9STYzQQNCE3sELiQiiLhy1I/ucbl0wDHt+Fmv2DOeGCh4xxic2eIrYVdSM8JNqbmMeyZS9oPnnnUEZr5FY4h63aKCDdeSe8wgGEXxDNaGujvcTRRnsmTuJ5v3Mp5bBRwQbCYK8PwGl8N/hvxIEF4nYAZfhF+HvioqL8BCyVqgl8jVM5ewfrjGLgjW6uAnrOq5xWqSi5XgLeYfU+m+UMvqYYGt3ykP0QuUZ4hei9keg1mtPrwAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 1); + offset: 0.654902 0.666667 0.666667 0; } + transform: translate(370, 0) translate(6, 0); } } + transform: translate(0, 88) translate(9, 1); } transform { - transform: translate(0, 132) translate(9, 1); child: container { rounded-clip { - clip: -9 -1 410 34 / 5; child: color { bounds: -9 -1 410 34; color: rgb(250,249,248); } + clip: -9 -1 410 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -9 -1 410 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } clip { - clip: 0 0 392 32; child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; x: 0; y: 21; - color: rgb(212,207,202); - glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; } + clip: 0 0 392 32; } } + transform: translate(0, 132) translate(9, 1); } transform { - transform: translate(0, 176); child: container { transform { - transform: translate(9, 1); child: container { rounded-clip { - clip: -9 -1 374 35 / 5 0 0 5; child: color { bounds: -9 -1 374 35; color: rgb(252,252,252); } + clip: -9 -1 374 35 / 5 0 0 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -9 -1 374 35 / 5 0 0 5; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } clip { - clip: 0 0 357 33; child: text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; x: 0; y: 22; - color: rgb(50,50,50); - glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; } + clip: 0 0 357 33; } } + transform: translate(9, 1); } transform { - transform: translate(374, 0) translate(6, 5); child: container { rounded-clip { - clip: -6 -5 36 35 / 0 5 5 0; child: color { bounds: -5 -4 34 33; color: rgb(246,245,244); } + clip: -6 -5 36 35 / 0 5 5 0; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -6 -5 36 35 / 0 5 5 0; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 4 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAfUlEQVQ4je3RMQoCMRBG4Q+voEIKC/H+d7Cwd1GULSzEUyg2azOyQ1gxB9gHgcnknxdCmJliwAHr1FtiH2d/uUTwHJIVuuj1LYINbklyivqObYuglgx4YDcVXPwQvPFM+1esJgquxjf3qS4tgmM1UJKkaxF8g/m2YvyJmYoPk2IlW2Wofj0AAAAASUVORK5CYII="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } } + transform: translate(374, 0) translate(6, 5); } } + transform: translate(0, 176); } transform { - transform: translate(0, 221); child: container { transform { - transform: translate(10, 5); child: container { rounded-clip { - clip: -10 -5 137 34 / 5 0 0 5; child: color { bounds: -9 -4 136 32; color: rgb(246,245,244); } + clip: -10 -5 137 34 / 5 0 0 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 137 34 / 5 0 0 5; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 103 8192 0 0 1, 287 8192 0 0 1, 311 5120 0 0 1, 430 5120 0 0 1; x: 2; y: 17; - color: rgb(146,149,149); - glyphs: 103 8192 0 0 1, 287 8192 0 0 1, 311 5120 0 0 1, 430 5120 0 0 1; } transform { - transform: translate(102, 0); child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(102, 0); } } } + transform: translate(10, 5); } transform { - transform: translate(137, 0); child: transform { - transform: translate(10, 5); child: container { color { bounds: -9 -4 135 32; color: rgb(246,245,244); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 136 34; widths: 1 0 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 113 13312 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 280 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; x: 2; y: 17; - color: rgb(146,149,149); - glyphs: 113 13312 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 280 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; } transform { - transform: translate(101, 0); child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(101, 0); } } } + transform: translate(10, 5); } + transform: translate(137, 0); } transform { - transform: translate(273, 0); child: transform { - transform: translate(10, 5); child: container { rounded-clip { - clip: -10 -5 137 34 / 0 5 5 0; child: color { bounds: -9 -4 135 32; color: rgb(246,245,244); } + clip: -10 -5 137 34 / 0 5 5 0; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 137 34 / 0 5 5 0; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 165 9216 0 0 1, 324 4096 0 0 1, 312 8192 0 0 1, 319 8192 0 0 1, 430 5120 0 0 1; x: 2; y: 17; - color: rgb(146,149,149); - glyphs: 165 9216 0 0 1, 324 4096 0 0 1, 312 8192 0 0 1, 319 8192 0 0 1, 430 5120 0 0 1; } transform { - transform: translate(101, 0); child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(101, 0); } } } + transform: translate(10, 5); } + transform: translate(273, 0); } } + transform: translate(0, 221); } transform { - transform: translate(0, 265); child: container { text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; x: 0; y: 22; - color: rgb(146,149,149); - glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; } transform { - transform: translate(52, 0); child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; x: 0; y: 22; - color: rgb(212,207,202); - glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; } + transform: translate(52, 0); } transform { - transform: translate(104, 0) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 112 34 / 5; child: color { bounds: -1 -1 112 34; color: rgb(252,252,252); } + clip: -1 -1 112 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 112 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { transform { - transform: translate(6, 6); child: text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 682 8192 0 0 1, 677 9216 0 0 1; x: 0; y: 15; - color: rgb(50,50,50); - glyphs: 682 8192 0 0 1, 677 9216 0 0 1; } + transform: translate(6, 6); } transform { - transform: translate(40, 0) translate(6, 0); child: container { border { + colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); outline: -6 0 35 32; widths: 0 0 0 1; - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); } color-matrix { - matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 1); - offset: 0.654902 0.666667 0.666667 0; child: texture { bounds: 4 8 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAHElEQVQ4jWNgGAXDADCi8f+Tqo+Jem4ZBUMYAABDXwEEvj+CVwAAAABJRU5ErkJggg=="); } - } - } - } - transform { - transform: translate(75, 0) translate(6, 0); - child: container { - border { - outline: -6 0 35 32 / 0 5 5 0; - widths: 0 0 0 1; - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); - } - color-matrix { matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 1); offset: 0.654902 0.666667 0.666667 0; + } + } + transform: translate(40, 0) translate(6, 0); + } + transform { + child: container { + border { + colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); + outline: -6 0 35 32 / 0 5 5 0; + widths: 0 0 0 1; + } + color-matrix { child: texture { bounds: 4 8 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAKElEQVQ4jWNgGPbgPxTjBEyU2jDwBjCi8fH6F5s+il1ACIyEWBgGAADypgUMy1PhdwAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 1); + offset: 0.654902 0.666667 0.666667 0; } } + transform: translate(75, 0) translate(6, 0); } } } + transform: translate(104, 0) translate(1, 1); } transform { - transform: translate(236, 0) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 112 34 / 5; child: color { bounds: -1 -1 112 34; color: rgb(250,249,248); } + clip: -1 -1 112 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 112 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { transform { - transform: translate(6, 6); child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 677 9216 0 0 1; x: 0; y: 15; - color: rgb(212,207,202); - glyphs: 677 9216 0 0 1; } + transform: translate(6, 6); } transform { - transform: translate(40, 0) translate(6, 0); child: container { color { bounds: -5 0 34 32; color: rgb(250,249,248); } border { + colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); outline: -6 0 35 32; widths: 0 0 0 1; - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); } color-matrix { - matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 0.5); - offset: 0.654902 0.666667 0.666667 0; child: texture { bounds: 4 8 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAHElEQVQ4jWNgGAXDADCi8f+Tqo+Jem4ZBUMYAABDXwEEvj+CVwAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 0.5); + offset: 0.654902 0.666667 0.666667 0; } } + transform: translate(40, 0) translate(6, 0); } transform { - transform: translate(75, 0) translate(6, 0); child: container { rounded-clip { - clip: -6 0 35 32 / 0 5 5 0; child: color { bounds: -5 0 34 32; color: rgb(250,249,248); } + clip: -6 0 35 32 / 0 5 5 0; } border { + colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); outline: -6 0 35 32 / 0 5 5 0; widths: 0 0 0 1; - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); } color-matrix { - matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 0.5); - offset: 0.654902 0.666667 0.666667 0; child: texture { bounds: 4 8 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAKElEQVQ4jWNgGPbgPxTjBEyU2jDwBjCi8fH6F5s+il1ACIyEWBgGAADypgUMy1PhdwAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.454902, 0.152941, -0.188235, 0, 0.305882, -0.192157, -0.666667, 0, 0.145098, -0.666667, -0.666667, 0, 0, 0, 0, 0.5); + offset: 0.654902 0.666667 0.666667 0; } } + transform: translate(75, 0) translate(6, 0); } } } + transform: translate(236, 0) translate(1, 1); } } + transform: translate(0, 265); } transform { - transform: translate(0, 309); child: container { transform { + child: container { + transform { + child: container { + color { + bounds: 0 0 14 14; + color: rgb(246,245,244); + } + border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 3; + widths: 1 1 1 1; + } + color-matrix { + child: texture { + bounds: 0 0 14 14; + texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAeElEQVQokb3QXwpAQBDH8e9uzscRXEXyJFE8KFoXcxheVm1j0Cp+tQ87M5/2D/yc8g2qgC0GGKDzSIUpYBXUB+gEC19cAmyAQaAmRJloOiABJlGv5WnWD4dDq9i32tuOa41i+FiT719Gw/MT0rDj/Mu3sUAei77LDp72K7jAZx9tAAAAAElFTkSuQmCC"); + } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; + } + } + transform: translate(5, 2); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 0; + y: 15; + } + transform: translate(24, 0); + } + } transform: translate(0, 2); + } + transform { child: container { transform { - transform: translate(5, 2); child: container { color { bounds: 0 0 14 14; color: rgb(246,245,244); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 16 16 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; - child: texture { - bounds: 0 0 14 14; - texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAeElEQVQokb3QXwpAQBDH8e9uzscRXEXyJFE8KFoXcxheVm1j0Cp+tQ87M5/2D/yc8g2qgC0GGKDzSIUpYBXUB+gEC19cAmyAQaAmRJloOiABJlGv5WnWD4dDq9i32tuOa41i+FiT719Gw/MT0rDj/Mu3sUAei77LDp72K7jAZx9tAAAAAElFTkSuQmCC"); - } } } + transform: translate(5, 2); } transform { - transform: translate(24, 0); child: text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 0; y: 15; - color: rgb(146,149,149); - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } + transform: translate(24, 0); } } - } - transform { transform: translate(0, 29) translate(0, 2); - child: container { - transform { - transform: translate(5, 2); - child: container { - color { - bounds: 0 0 14 14; - color: rgb(246,245,244); - } - border { - outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - } - } - transform { - transform: translate(24, 0); - child: text { - font: "Cantarell 11"; - x: 0; - y: 15; - color: rgb(146,149,149); - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - } - } - } } transform { - transform: translate(0, 58) translate(0, 2); child: container { transform { - transform: translate(5, 2); child: container { color { bounds: 0 0 14 14; color: rgb(246,245,244); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 16 16 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 0 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAOUlEQVQokWNgGAVEAW8GBoYnDAwM/3HgxwwMDF7YND7GowmGH8EUM1HDqV4EbH3EwMDgSQ2Lhj0AABu4GmjkhFgCAAAAAElFTkSuQmCC"); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } } + transform: translate(5, 2); } transform { - transform: translate(24, 0); child: text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 0; y: 15; - color: rgb(146,149,149); - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } + transform: translate(24, 0); } } + transform: translate(0, 58) translate(0, 2); } transform { - transform: translate(0, 87) translate(0, 2); child: container { transform { - transform: translate(5, 2); child: container { color { bounds: 0 0 14 14; color: rgb(250,249,248); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 16 16 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); - offset: 0.831373 0.811765 0.792157 0; child: texture { bounds: 0 0 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAeElEQVQokb3QXwpAQBDH8e9uzscRXEXyJFE8KFoXcxheVm1j0Cp+tQ87M5/2D/yc8g2qgC0GGKDzSIUpYBXUB+gEC19cAmyAQaAmRJloOiABJlGv5WnWD4dDq9i32tuOa41i+FiT719Gw/MT0rDj/Mu3sUAei77LDp72K7jAZx9tAAAAAElFTkSuQmCC"); } - } - } - } - transform { - transform: translate(24, 0); - child: text { - font: "Cantarell 11"; - x: 0; - y: 15; - color: rgb(212,207,202); - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - } - } - } - } - transform { - transform: translate(0, 116) translate(0, 2); - child: container { - transform { - transform: translate(5, 2); - child: container { - color { - bounds: 0 0 14 14; - color: rgb(250,249,248); - } - border { - outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - } - } - transform { - transform: translate(24, 0); - child: text { - font: "Cantarell 11"; - x: 0; - y: 15; - color: rgb(212,207,202); - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - } - } - } - } - transform { - transform: translate(0, 145) translate(0, 2); - child: container { - transform { - transform: translate(5, 2); - child: container { - color { - bounds: 0 0 14 14; - color: rgb(250,249,248); - } - border { - outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - color-matrix { matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); offset: 0.831373 0.811765 0.792157 0; - child: texture { - bounds: 0 0 14 14; - texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAOUlEQVQokWNgGAVEAW8GBoYnDAwM/3HgxwwMDF7YND7GowmGH8EUM1HDqV4EbH3EwMDgSQ2Lhj0AABu4GmjkhFgCAAAAAElFTkSuQmCC"); - } } } + transform: translate(5, 2); } transform { - transform: translate(24, 0); child: text { - font: "Cantarell 11"; - x: 0; - y: 15; color: rgb(212,207,202); + font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - } - } - } - } - transform { - transform: translate(125, 0) translate(0, 2); - child: container { - transform { - transform: translate(5, 2); - child: container { - rounded-clip { - clip: -1 -1 16 16 / 8; - child: color { - bounds: 0 0 14 14; - color: rgb(246,245,244); - } - } - border { - outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - } - } - transform { - transform: translate(24, 0); - child: text { - font: "Cantarell 11"; x: 0; y: 15; - color: rgb(146,149,149); - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } + transform: translate(24, 0); } } + transform: translate(0, 87) translate(0, 2); } transform { - transform: translate(125, 29) translate(0, 2); child: container { transform { - transform: translate(5, 2); child: container { - rounded-clip { - clip: -1 -1 16 16 / 8; - child: color { - bounds: 0 0 14 14; - color: rgb(246,245,244); - } + color { + bounds: 0 0 14 14; + color: rgb(250,249,248); } border { - outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 3; + widths: 1 1 1 1; } } + transform: translate(5, 2); } transform { - transform: translate(24, 0); child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 0; y: 15; - color: rgb(146,149,149); - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } + transform: translate(24, 0); } } + transform: translate(0, 116) translate(0, 2); } transform { - transform: translate(125, 58) translate(0, 2); child: container { transform { - transform: translate(5, 2); child: container { - rounded-clip { - clip: -1 -1 16 16 / 8; - child: color { - bounds: 0 0 14 14; - color: rgb(246,245,244); - } + color { + bounds: 0 0 14 14; + color: rgb(250,249,248); } border { - outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 3; + widths: 1 1 1 1; } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 0 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAOUlEQVQokWNgGAVEAW8GBoYnDAwM/3HgxwwMDF7YND7GowmGH8EUM1HDqV4EbH3EwMDgSQ2Lhj0AABu4GmjkhFgCAAAAAElFTkSuQmCC"); } + matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); + offset: 0.831373 0.811765 0.792157 0; } } + transform: translate(5, 2); } transform { - transform: translate(24, 0); child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 0; y: 15; - color: rgb(146,149,149); - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } + transform: translate(24, 0); } } + transform: translate(0, 145) translate(0, 2); } transform { - transform: translate(125, 87) translate(0, 2); child: container { transform { - transform: translate(5, 2); child: container { rounded-clip { + child: color { + bounds: 0 0 14 14; + color: rgb(246,245,244); + } clip: -1 -1 16 16 / 8; + } + border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 8; + widths: 1 1 1 1; + } + } + transform: translate(5, 2); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell 11"; + glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 0; + y: 15; + } + transform: translate(24, 0); + } + } + transform: translate(125, 0) translate(0, 2); + } + transform { + child: container { + transform { + child: container { + rounded-clip { + child: color { + bounds: 0 0 14 14; + color: rgb(246,245,244); + } + clip: -1 -1 16 16 / 8; + } + border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 8; + widths: 1 1 1 1; + } + } + transform: translate(5, 2); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell 11"; + glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 0; + y: 15; + } + transform: translate(24, 0); + } + } + transform: translate(125, 29) translate(0, 2); + } + transform { + child: container { + transform { + child: container { + rounded-clip { + child: color { + bounds: 0 0 14 14; + color: rgb(246,245,244); + } + clip: -1 -1 16 16 / 8; + } + border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 8; + widths: 1 1 1 1; + } + color-matrix { + child: texture { + bounds: 0 0 14 14; + texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAOUlEQVQokWNgGAVEAW8GBoYnDAwM/3HgxwwMDF7YND7GowmGH8EUM1HDqV4EbH3EwMDgSQ2Lhj0AABu4GmjkhFgCAAAAAElFTkSuQmCC"); + } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; + } + } + transform: translate(5, 2); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell 11"; + glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 0; + y: 15; + } + transform: translate(24, 0); + } + } + transform: translate(125, 58) translate(0, 2); + } + transform { + child: container { + transform { + child: container { + rounded-clip { child: color { bounds: 0 0 14 14; color: rgb(250,249,248); } + clip: -1 -1 16 16 / 8; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 16 16 / 8; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); - offset: 0.831373 0.811765 0.792157 0; child: texture { bounds: 0 0 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAASklEQVQokWNgGJmAjYGBoZWBgeERFLcwMDCwEqOxlYGB4T8abiZG42MsGh+iK2LCovE/MWLYNC4iUgwDsDJA/PQQihsZiAyc4QYASeYTs7b/ALUAAAAASUVORK5CYII="); } - } - } - } - transform { - transform: translate(24, 0); - child: text { - font: "Cantarell 11"; - x: 0; - y: 15; - color: rgb(212,207,202); - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - } - } - } - } - transform { - transform: translate(125, 116) translate(0, 2); - child: container { - transform { - transform: translate(5, 2); - child: container { - rounded-clip { - clip: -1 -1 16 16 / 8; - child: color { - bounds: 0 0 14 14; - color: rgb(250,249,248); - } - } - border { - outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - } - } - transform { - transform: translate(24, 0); - child: text { - font: "Cantarell 11"; - x: 0; - y: 15; - color: rgb(212,207,202); - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - } - } - } - } - transform { - transform: translate(125, 145) translate(0, 2); - child: container { - transform { - transform: translate(5, 2); - child: container { - rounded-clip { - clip: -1 -1 16 16 / 8; - child: color { - bounds: 0 0 14 14; - color: rgb(250,249,248); - } - } - border { - outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); - } - color-matrix { matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); offset: 0.831373 0.811765 0.792157 0; + } + } + transform: translate(5, 2); + } + transform { + child: text { + color: rgb(212,207,202); + font: "Cantarell 11"; + glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 0; + y: 15; + } + transform: translate(24, 0); + } + } + transform: translate(125, 87) translate(0, 2); + } + transform { + child: container { + transform { + child: container { + rounded-clip { + child: color { + bounds: 0 0 14 14; + color: rgb(250,249,248); + } + clip: -1 -1 16 16 / 8; + } + border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 8; + widths: 1 1 1 1; + } + } + transform: translate(5, 2); + } + transform { + child: text { + color: rgb(212,207,202); + font: "Cantarell 11"; + glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 0; + y: 15; + } + transform: translate(24, 0); + } + } + transform: translate(125, 116) translate(0, 2); + } + transform { + child: container { + transform { + child: container { + rounded-clip { + child: color { + bounds: 0 0 14 14; + color: rgb(250,249,248); + } + clip: -1 -1 16 16 / 8; + } + border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + outline: -1 -1 16 16 / 8; + widths: 1 1 1 1; + } + color-matrix { child: texture { bounds: 0 0 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAOUlEQVQokWNgGAVEAW8GBoYnDAwM/3HgxwwMDF7YND7GowmGH8EUM1HDqV4EbH3EwMDgSQ2Lhj0AABu4GmjkhFgCAAAAAElFTkSuQmCC"); } + matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); + offset: 0.831373 0.811765 0.792157 0; } } + transform: translate(5, 2); } transform { - transform: translate(24, 0); child: text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 0; y: 15; - color: rgb(212,207,202); - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } + transform: translate(24, 0); } } + transform: translate(125, 145) translate(0, 2); } transform { - transform: translate(247, 0); child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: transform { - transform: translate(8, 11.5) rotate(323.944) translate(-8, -11.5); child: texture { bounds: 0 3.5 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABE0lEQVQ4jbXSPy9DURjH8U9bSqhEmog/A6PFJGGRCInRZrQZTN6B1XsysJgMRklJDRYGtVBtWkRr6HObG2muRuJJbnJynvP9nt9zc/iHKuEIZ3jEFeaHhbfwgO6P73AYeAftAfANFn+Dp1FLQffYx8yw0Y9T8B3mMs6OoYh8evMSnRDsZcCFkJf1fraRaCygFevzDEE3JBMYRSMR1CPaVwYsYk/Fup1swC2e0MBGhqAcgtlI0hecxjgNHKRuSVcRKyHJi5EL0axiNxodrEWiFsaxhE1MBvOOCjq51A3rOMFrSNp4RhMv+AhhHRfR6yeg9+4rWE0J8sjhLQTNgGsJlE6QVAnbWI65mzFOFdf4HMD8vb4BZVRHF0lPimAAAAAASUVORK5CYII="); } + transform: translate(8, 11.5) rotate(323.944) translate(-8, -11.5); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(247, 0); } transform { - transform: translate(247, 87); child: opacity { - opacity: 0.501961; child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 0.5); - offset: 0.572549 0.584314 0.584314 0; child: transform { - transform: translate(8, 11.5) rotate(323.944) translate(-8, -11.5); child: texture { bounds: 0 3.5 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABE0lEQVQ4jbXSPy9DURjH8U9bSqhEmog/A6PFJGGRCInRZrQZTN6B1XsysJgMRklJDRYGtVBtWkRr6HObG2muRuJJbnJynvP9nt9zc/iHKuEIZ3jEFeaHhbfwgO6P73AYeAftAfANFn+Dp1FLQffYx8yw0Y9T8B3mMs6OoYh8evMSnRDsZcCFkJf1fraRaCygFevzDEE3JBMYRSMR1CPaVwYsYk/Fup1swC2e0MBGhqAcgtlI0hecxjgNHKRuSVcRKyHJi5EL0axiNxodrEWiFsaxhE1MBvOOCjq51A3rOMFrSNp4RhMv+AhhHRfR6yeg9+4rWE0J8sjhLQTNgGsJlE6QVAnbWI65mzFOFdf4HMD8vb4BZVRHF0lPimAAAAAASUVORK5CYII="); } + transform: translate(8, 11.5) rotate(323.944) translate(-8, -11.5); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 0.5); + offset: 0.572549 0.584314 0.584314 0; } + opacity: 0.501961; } + transform: translate(247, 87); } } + transform: translate(0, 309); } } transform { - transform: translate(420, 0); child: color { bounds: 0 0 1 558; color: rgba(0,0,0,0.1); } + transform: translate(420, 0); } transform { - transform: translate(431, 0); child: container { transform { - transform: translate(17, 5); child: container { rounded-clip { - clip: -17 -5 122 34 / 5; child: color { bounds: -16 -4 120 32; color: rgb(246,245,244); } + clip: -17 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 2; y: 17; - color: rgb(146,149,149); - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } } + transform: translate(17, 5); } transform { - transform: translate(0, 44) translate(17, 5); child: container { rounded-clip { - clip: -17 -5 122 34 / 5; child: color { bounds: -16 -4 120 32; color: rgb(250,249,248); } + clip: -17 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 2; y: 17; - color: rgb(212,207,202); - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } } + transform: translate(0, 44) translate(17, 5); } transform { - transform: translate(0, 88) translate(17, 5); child: container { rounded-clip { - clip: -17 -5 122 34 / 5; child: color { bounds: -16 -4 120 32; color: rgb(228,228,224); } + clip: -17 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } text { - font: "Cantarell 11"; - x: 2; - y: 17; color: rgb(146,149,149); + font: "Cantarell 11"; glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + x: 2; + y: 17; } } + transform: translate(0, 88) translate(17, 5); } transform { - transform: translate(0, 132) translate(17, 5); child: container { rounded-clip { - clip: -17 -5 122 34 / 5; child: color { bounds: -16 -4 120 32; color: rgb(228,228,224); } + clip: -17 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -17 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 2; y: 17; - color: rgb(212,207,202); - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } } + transform: translate(0, 132) translate(17, 5); } transform { - transform: translate(0, 176); child: transform { - transform: translate(10, 5); child: container { rounded-clip { - clip: -10 -5 122 34 / 5; child: color { bounds: -9 -4 120 32; color: rgb(246,245,244); } + clip: -10 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; x: 2; y: 17; - color: rgb(146,149,149); - glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; } transform { - transform: translate(86, 0); child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(86, 0); } } } + transform: translate(10, 5); } + transform: translate(0, 176); } transform { - transform: translate(0, 220); child: transform { - transform: translate(10, 5); child: container { rounded-clip { - clip: -10 -5 122 34 / 5; child: color { bounds: -9 -4 120 32; color: rgb(250,249,248); } + clip: -10 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { text { + color: rgb(212,207,202); font: "Cantarell 11"; + glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; x: 2; y: 17; - color: rgb(212,207,202); - glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; } transform { - transform: translate(86, 0); child: color-matrix { - matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); - offset: 0.831373 0.811765 0.792157 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAOklEQVQ4jWNgGAWDD5QzMDD8J4DrKTGEoGZ8hhCtGZshODUz4zHgKAMDAyMDA8NBBgaGRlJtHwUkAACHZRnQomjWaAAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.631373, 0.00784314, -0.313726, 0, 0.129412, -0.337255, -0.792157, 0, -0.0313726, -0.811765, -0.792157, 0, 0, 0, 0, 0.5); + offset: 0.831373 0.811765 0.792157 0; } + transform: translate(86, 0); } } } + transform: translate(10, 5); } + transform: translate(0, 220); } transform { - transform: translate(0, 264); child: transform { - transform: translate(10, 5); child: container { rounded-clip { - clip: -10 -5 122 34 / 5; child: color { bounds: -9 -4 120 32; color: rgb(246,245,244); } + clip: -10 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 173 9216 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 862 3072 0 0 1, 165 9216 0 0 1, 287 8192 0 0 1, 312 8192 0 0 1, 438 8192 0 0 1, 349 4096 0 0 1, 244 8192 0 0 1, 409 6144 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 173 9216 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 862 3072 0 0 1, 165 9216 0 0 1, 287 8192 0 0 1, 312 8192 0 0 1, 438 8192 0 0 1, 349 4096 0 0 1, 244 8192 0 0 1, 409 6144 0 0 1; } transform { - transform: translate(86, 0); child: transform { - transform: translate(1, 0); child: text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 678 7168 0 0 1, 679 8192 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 678 7168 0 0 1, 679 8192 0 0 1; } + transform: translate(1, 0); } + transform: translate(86, 0); } } } + transform: translate(10, 5); } + transform: translate(0, 264); } transform { - transform: translate(0, 308); child: transform { - transform: translate(5, 5); child: container { rounded-clip { - clip: -5 -5 122 34 / 5; child: color { bounds: -4 -4 120 32; color: rgb(246,245,244); } + clip: -5 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -5 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { color { @@ -1436,872 +1431,873 @@ transform { color: rgb(49,104,160); } transform { - transform: translate(1, 1); child: border { + colors: rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3); outline: -1 -1 112 24; widths: 1 1 1 1; - colors: rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3); } + transform: translate(1, 1); } } } + transform: translate(5, 5); } + transform: translate(0, 308); } transform { - transform: translate(0, 352); child: transform { - transform: translate(10, 5); child: container { rounded-clip { - clip: -10 -5 122 34 / 5; child: color { bounds: -9 -4 120 32; color: rgb(246,245,244); } + clip: -10 -5 122 34 / 5; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -10 -5 122 34 / 5; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { transform { - transform: translate(16, 0); child: text { + color: rgb(146,149,149); font: "Cantarell 11"; + glyphs: 822 4096 0 0 1, 115 11264 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 287 8192 0 0 1, 823 4096 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 822 4096 0 0 1, 115 11264 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 287 8192 0 0 1, 823 4096 0 0 1; } + transform: translate(16, 0); } transform { - transform: translate(86, 0); child: color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 0 4 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAeUlEQVQ4jcWTQQqAIBBFn9HV6i4uOmaL7hF1hVbZRkF0tMmCPnwYdeahH4RcM+AEH4AV+jNJw8EnMGkBpf0MsiRDd4AAsdKBFhAywSTN8doIkBgGYLpKk0qvAVB+s0q9AHuk/zP4BLD7uiXIFWD0Re0TSd6Aof3uXhd1yT8mvMGiQgAAAABJRU5ErkJggg=="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } + transform: translate(86, 0); } } } + transform: translate(10, 5); } + transform: translate(0, 352); } transform { - transform: translate(0, 396) translate(17, 5); child: container { text { + color: rgb(53,132,228); font: "Cantarell 11"; + glyphs: 349 4096 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 10; y: 17; - color: rgb(53,132,228); - glyphs: 349 4096 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } color { bounds: 10 19 68 1; color: rgb(53,132,228); } } + transform: translate(0, 396) translate(17, 5); } transform { - transform: translate(0, 440) translate(37, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(234,232,230); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { rounded-clip { - clip: -1 -1 26 26 / 13; child: color { bounds: 0 0 24 24; color: rgb(246,245,244); } + clip: -1 -1 26 26 / 13; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } } + transform: translate(0, 440) translate(37, 1); } transform { - transform: translate(0, 476) translate(37, 1); child: container { rounded-clip { - clip: -1 -1 50 26 / 13; child: color { bounds: -1 -1 50 26; color: rgb(250,249,248); } + clip: -1 -1 50 26 / 13; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 50 26 / 13; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { rounded-clip { - clip: -1 -1 26 26 / 13; child: color { bounds: 0 0 24 24; color: rgb(250,249,248); } + clip: -1 -1 26 26 / 13; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 26 26 / 13; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } } + transform: translate(0, 476) translate(37, 1); } } + transform: translate(431, 0); } transform { - transform: translate(563, 0); child: color { bounds: 0 0 1 558; color: rgba(0,0,0,0.1); } + transform: translate(563, 0); } transform { - transform: translate(574, 0); child: container { container { transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 502 4 / 2; child: color { bounds: -1 -1 502 4; color: rgb(234,232,230); } + clip: -1 -1 502 4 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 502 4 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(0, -1) translate(0, 1); child: container { rounded-clip { - clip: -1 -1 252 4 / 2 1.5 1.5 2; child: color { bounds: -1 -1 252 4; color: rgb(53,132,228); } + clip: -1 -1 252 4 / 2 1.5 1.5 2; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 252 4 / 2 1.5 1.5 2; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } + transform: translate(0, -1) translate(0, 1); } } + transform: translate(1, 1); } transform { - transform: translate(0, 10); child: transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 502 4 / 2; child: color { bounds: -1 -1 502 4; color: rgb(234,232,230); } + clip: -1 -1 502 4 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 502 4 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(250, -1) translate(0, 1); child: container { rounded-clip { - clip: -1 -1 252 4 / 1.5 2 2 1.5; child: color { bounds: -1 -1 252 4; color: rgb(53,132,228); } + clip: -1 -1 252 4 / 1.5 2 2 1.5; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 252 4 / 1.5 2 2 1.5; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } + transform: translate(250, -1) translate(0, 1); } } + transform: translate(1, 1); } + transform: translate(0, 10); } transform { - transform: translate(0, 20); child: container { transform { - transform: translate(237, 0); child: text { + color: rgba(46,52,54,0.4); font: "Cantarell 9.1669921875"; + glyphs: 682 7168 0 0 1, 677 8192 0 0 1, 859 1024 0 0 1, 919 12288 0 0 1; x: 0; y: 13; - color: rgba(46,52,54,0.4); - glyphs: 682 7168 0 0 1, 677 8192 0 0 1, 859 1024 0 0 1, 919 12288 0 0 1; } + transform: translate(237, 0); } transform { - transform: translate(0, 16) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 502 4 / 2; child: color { bounds: -1 -1 502 4; color: rgb(234,232,230); } + clip: -1 -1 502 4 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 502 4 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(43, -1) translate(0, 1); child: container { rounded-clip { - clip: -1 -1 102 4 / 1.5; child: color { bounds: -1 -1 102 4; color: rgb(53,132,228); } + clip: -1 -1 102 4 / 1.5; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 102 4 / 1.5; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } + transform: translate(43, -1) translate(0, 1); } } + transform: translate(0, 16) translate(1, 1); } } + transform: translate(0, 20); } transform { - transform: translate(0, 46); child: transform { - transform: translate(3, 3); child: container { rounded-clip { - clip: -3 -3 502 9 / 3; child: color { bounds: -3 -3 502 9; color: rgb(252,252,252); } + clip: -3 -3 502 9 / 3; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -3 -3 502 9 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(1, 1); child: border { + colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); outline: -1 -1 496 3 / 1; widths: 1 1 1 1; - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); } + transform: translate(1, 1); } transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 297 3 / 1; child: color { bounds: -1 -1 297 3; color: rgb(53,132,228); } + clip: -1 -1 297 3 / 1; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 297 3 / 1; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } + transform: translate(1, 1); } } + transform: translate(3, 3); } + transform: translate(0, 46); } transform { - transform: translate(0, 61); child: transform { - transform: translate(3, 3); child: container { rounded-clip { - clip: -3 -3 502 9 / 3; child: color { bounds: -3 -3 502 9; color: rgb(252,252,252); } + clip: -3 -3 502 9 / 3; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -3 -3 502 9 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { + child: container { + rounded-clip { + child: color { + bounds: -1 -1 97 3; + color: rgb(53,132,228); + } + clip: -1 -1 97 3 / 1; + } + border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + outline: -1 -1 97 3 / 1; + widths: 1 1 1 1; + } + } transform: translate(2, 1); + } + transform { child: container { rounded-clip { - clip: -1 -1 97 3 / 1; child: color { bounds: -1 -1 97 3; color: rgb(53,132,228); } + clip: -1 -1 97 3 / 1; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 97 3 / 1; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } - } - transform { transform: translate(99, 0) translate(2, 1); - child: container { - rounded-clip { - clip: -1 -1 97 3 / 1; - child: color { - bounds: -1 -1 97 3; - color: rgb(53,132,228); - } - } - border { - outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); - } - } } transform { + child: border { + colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); + outline: -1 -1 97 3 / 1; + widths: 1 1 1 1; + } transform: translate(198, 0) translate(2, 1); - child: border { - outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); - } } transform { + child: border { + colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); + outline: -1 -1 97 3 / 1; + widths: 1 1 1 1; + } transform: translate(297, 0) translate(2, 1); - child: border { - outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); - } } transform { - transform: translate(396, 0) translate(2, 1); child: border { + colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; widths: 1 1 1 1; - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); } + transform: translate(396, 0) translate(2, 1); } } + transform: translate(3, 3); } + transform: translate(0, 61); } } transform { - transform: translate(0, 76); child: container { transform { - transform: translate(12, 12); child: transform { - transform: translate(0, 3) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 478 4 / 2; child: color { bounds: -1 -1 478 4; color: rgb(234,232,230); } + clip: -1 -1 478 4 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 478 4 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { rounded-clip { - clip: -1 -1 237 4 / 2; child: color { bounds: -1 -1 237 4; color: rgb(53,132,228); } + clip: -1 -1 237 4 / 2; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 237 4 / 2; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } transform { - transform: translate(234, 0) translate(-8, -8); child: container { rounded-clip { - clip: -1 -1 20 20 / 10; child: color { bounds: 0 0 18 18; color: rgb(246,245,244); } + clip: -1 -1 20 20 / 10; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 20 20 / 10; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } + transform: translate(234, 0) translate(-8, -8); } } + transform: translate(0, 3) translate(1, 1); } + transform: translate(12, 12); } transform { - transform: translate(0, 34) translate(12, 12); child: transform { - transform: translate(0, 3) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 478 4 / 2; child: color { bounds: -1 -1 478 4; color: rgb(250,249,248); } + clip: -1 -1 478 4 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 478 4 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(234, 0) translate(-8, -8); child: container { rounded-clip { - clip: -1 -1 20 20 / 10; child: color { bounds: 0 0 18 18; color: rgb(250,249,248); } + clip: -1 -1 20 20 / 10; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 20 20 / 10; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } + transform: translate(234, 0) translate(-8, -8); } } + transform: translate(0, 3) translate(1, 1); } + transform: translate(0, 34) translate(12, 12); } } + transform: translate(0, 76); } transform { - transform: translate(0, 150) translate(12, 12); child: container { transform { - transform: translate(0, 4) translate(0, 6); child: container { transform { + child: color { + bounds: 0 0 1 6; + color: rgba(146,149,149,0.55); + } transform: translate(2, 0); + } + transform { child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } - } - transform { transform: translate(120, 0); + } + transform { child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } - } - transform { transform: translate(239, 0); + } + transform { child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } - } - transform { transform: translate(357, 0); - child: color { - bounds: 0 0 1 6; - color: rgba(146,149,149,0.55); - } } transform { - transform: translate(476, 0); child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } + transform: translate(476, 0); } } + transform: translate(0, 4) translate(0, 6); } transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 478 4 / 2; child: color { bounds: -1 -1 478 4; color: rgb(234,232,230); } + clip: -1 -1 478 4 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 478 4 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(237, 0) translate(-10, -10); child: texture { bounds: 1 1 20 25; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAABmJLR0QA/wD/AP+gvaeTAAAC6ElEQVQ4jaXVy2sTQRwH8O/sI81mUrfd3ZYYUBGiZJu2eLCiiDQSUEFUTPWkR1MQjXgwei0UFGkRBf8EH4i09GTQdOOjqJv0oKKllcYoPTSXShrjbkqTGA+akEZTa/M9LfP48JuZ3R2Cv4f3+nx9Bw8cOOV2u3dRSlsB4LtppqenpmKR8fG7zzRtFEC+diKpbfB6vScuXLx4WxRF20ans5kKAjieBwDk83mYpolUKpVdzGSMm7dunZ94+nSkej5b9cwEg8EbZ/r7B1W3u9XpdDYJVitYlgUhBIQQcCwLwWpFW1tbkyzL9s7OzsOiKLZNxuMRAKUV4Llg8MZxvz+gqiptsljq7ETVnvA8FEWxtLe3dzVv2KBMxuOPK+C+/fv7AoHAoKqqlGWYf2KVJRECSZIskix3fUkmp+fm5mYIAH5kbGxuR3e3w2azrRmrjmGaePP27fxJv38L4/X5/KIo0vViAEBtNrS2tDT39vYeZwP9/Vd39fR0C1brukEA4DmuaWl5mWNUj2d3I9VVqqQUno6O3Yyd0hae4xoGOY4DtdslBqUSAfnj/V5XCCFgDMNIF/J/fEH/nUKhAMMwFpmPMzOTZi7XMGiaJqY/fNCZiKbdT6VS2UbB+VQqq2naA0Z78uRhJpPJNVJlzjTxLZtdikajoyyA4teFhfkOj+eQoigW5j8PqFgsYmZ21hgeHj775fPndywAJJPJ9w6HY6uiKG5Zlvm1kiUAs4mE+Sgcvnf/zp1rQNXf5tXLl2FVVfcIguCUZdnyL/Q3lovp+vPBgYHTAH6sAAH8GI9EHrhcrh5qt2+WJYkndZZfrkx//frFlVDoGIBCuY+tHRuNRh+6XK6d9dAyFtf1icuh0FHUXAO1YAXdtn17D6V0UzVaApBIJHJxXZ8IXbp0pBarB/5CNe0XardvkiWJB4DEp0+5mK6/qIetBpbREY/Hs1ew2Tam0+liLBZbFVtr+OtDQ+HrQ0NhAHwj0LryE/8bFCfO1plnAAAAAElFTkSuQmCC"); } + transform: translate(237, 0) translate(-10, -10); } } + transform: translate(1, 1); } } + transform: translate(0, 150) translate(12, 12); } transform { - transform: translate(0, 196); child: container { container { transform { - transform: translate(119, 0); child: transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 4 362 / 2; child: color { bounds: -1 -1 4 362; color: rgb(234,232,230); } + clip: -1 -1 4 362 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 4 362 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(-1, 0) translate(1, 0); child: container { rounded-clip { - clip: -1 -1 4 182 / 2 2 1.5 1.5; child: color { bounds: -1 -1 4 182; color: rgb(53,132,228); } + clip: -1 -1 4 182 / 2 2 1.5 1.5; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 4 182 / 2 2 1.5 1.5; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } + transform: translate(-1, 0) translate(1, 0); } } + transform: translate(1, 1); } + transform: translate(119, 0); } transform { - transform: translate(129, 0); child: transform { - transform: translate(1, 1); child: container { rounded-clip { - clip: -1 -1 4 362 / 2; child: color { bounds: -1 -1 4 362; color: rgb(234,232,230); } + clip: -1 -1 4 362 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 4 362 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(-1, 180) translate(1, 0); child: container { rounded-clip { - clip: -1 -1 4 182 / 1.5 1.5 2 2; child: color { bounds: -1 -1 4 182; color: rgb(53,132,228); } + clip: -1 -1 4 182 / 1.5 1.5 2 2; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 4 182 / 1.5 1.5 2 2; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } + transform: translate(-1, 180) translate(1, 0); } } + transform: translate(1, 1); } + transform: translate(129, 0); } } transform { - transform: translate(251, 0); child: container { transform { - transform: translate(28, 12); child: container { text { + color: rgba(146,149,149,0.55); font: "Cantarell 11"; + glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; x: 26; y: 15; - color: rgba(146,149,149,0.55); - glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; } transform { - transform: translate(39, 28) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 4 310 / 2; child: color { bounds: -1 -1 4 310; color: rgb(234,232,230); } + clip: -1 -1 4 310 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 4 310 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { rounded-clip { - clip: -1 -1 4 154 / 2; child: color { bounds: -1 -1 4 154; color: rgb(53,132,228); } + clip: -1 -1 4 154 / 2; } border { + colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); outline: -1 -1 4 154 / 2; widths: 1 1 1 1; - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); } } transform { - transform: translate(0, 151) translate(-8, -8); child: container { rounded-clip { - clip: -1 -1 20 20 / 10; child: color { bounds: 0 0 18 18; color: rgb(246,245,244); } + clip: -1 -1 20 20 / 10; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 20 20 / 10; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } + transform: translate(0, 151) translate(-8, -8); } } + transform: translate(39, 28) translate(1, 1); } } + transform: translate(28, 12); } transform { - transform: translate(129, 0) translate(12, 12); child: container { text { + color: rgba(146,149,149,0.55); font: "Cantarell 11"; + glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; x: 26; y: 15; - color: rgba(146,149,149,0.55); - glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; } transform { - transform: translate(39, 28) translate(1, 1); child: container { rounded-clip { - clip: -1 -1 4 310 / 2; child: color { bounds: -1 -1 4 310; color: rgb(250,249,248); } + clip: -1 -1 4 310 / 2; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 4 310 / 2; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(0, 151) translate(-8, -8); child: container { rounded-clip { - clip: -1 -1 20 20 / 10; child: color { bounds: 0 0 18 18; color: rgb(250,249,248); } + clip: -1 -1 20 20 / 10; } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 20 20 / 10; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } + transform: translate(0, 151) translate(-8, -8); } } + transform: translate(39, 28) translate(1, 1); } } + transform: translate(129, 0) translate(12, 12); } } + transform: translate(251, 0); } } + transform: translate(0, 196); } } + transform: translate(574, 0); } transform { + child: color { + bounds: 0 0 1 558; + color: rgba(0,0,0,0.1); + } transform: translate(1086, 0); - child: color { - bounds: 0 0 1 558; - color: rgba(0,0,0,0.1); - } } transform { - transform: translate(1097, 0); child: container { transform { - transform: translate(1, 1); child: container { border { - outline: -1 -1 114 135; - widths: 1 1 1 1; colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); - } - text { - font: "Cantarell Bold 11"; - x: 0; - y: 15; - color: rgb(146,149,149); - glyphs: 81 4096 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; - } - } - } - transform { - transform: translate(0, 141) translate(1, 1); - child: container { - border { outline: -1 -1 114 135; widths: 1 1 1 1; + } + text { + color: rgb(146,149,149); + font: "Cantarell Bold 11"; + glyphs: 81 4096 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; + x: 0; + y: 15; + } + } + transform: translate(1, 1); + } + transform { + child: container { + border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); + outline: -1 -1 114 135; + widths: 1 1 1 1; } text { - font: "Cantarell Bold 11"; - x: 0; - y: 15; color: rgb(146,149,149); + font: "Cantarell Bold 11"; glyphs: 126 11264 0 0 1, 438 8192 0 0 1, 430 6144 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; + x: 0; + y: 15; } } + transform: translate(0, 141) translate(1, 1); } transform { - transform: translate(0, 282) translate(2, 2); child: container { container { border { + colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -2 -2 114 135; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); } border { + colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -1 -1 112 133; widths: 1 1 1 1; - colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); } border { + colors: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0); outline: -2 -2 114 135; widths: 2 2 2 2; - colors: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0); } } text { - font: "Cantarell Bold 11"; - x: 0; - y: 15; color: rgb(146,149,149); + font: "Cantarell Bold 11"; glyphs: 69 11264 0 0 1, 409 6144 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 466 7168 0 0 1, 287 8192 0 0 1; + x: 0; + y: 15; } } + transform: translate(0, 282) translate(2, 2); } transform { - transform: translate(0, 423) translate(2, 2); child: container { container { border { + colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -2 -2 114 135; widths: 1 1 1 1; - colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); } border { + colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -1 -1 112 133; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); } border { + colors: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0); outline: -2 -2 114 135; widths: 2 2 2 2; - colors: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0); } } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 165 10240 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1; x: 0; y: 15; - color: rgb(146,149,149); - glyphs: 165 10240 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1; } } + transform: translate(0, 423) translate(2, 2); } } + transform: translate(1097, 0); } transform { - transform: translate(1221, 0); child: color { bounds: 0 0 1 558; color: rgba(0,0,0,0.1); } + transform: translate(1221, 0); } transform { - transform: translate(1232, 0); child: container { transform { - transform: translate(1, 1); child: container { border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 212 289; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color { bounds: 204 281 6 6; @@ -2314,7 +2310,6 @@ transform { } container { clip { - clip: 0 25 210 262; child: container { color { bounds: 0 117 210 195; @@ -2327,11 +2322,11 @@ transform { container { container { rounded-clip { - clip: 13 28 16 16 / 3; child: color { bounds: 13 28 16 16; color: rgb(252,252,252); } + clip: 13 28 16 16 / 3; } color { bounds: 14 29 14 14; @@ -2339,17 +2334,17 @@ transform { } } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: 13 28 16 16 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 14 29 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAeElEQVQokb3QXwpAQBDH8e9uzscRXEXyJFE8KFoXcxheVm1j0Cp+tQ87M5/2D/yc8g2qgC0GGKDzSIUpYBXUB+gEC19cAmyAQaAmRJloOiABJlGv5WnWD4dDq9i32tuOa41i+FiT719Gw/MT0rDj/Mu3sUAei77LDp72K7jAZx9tAAAAAElFTkSuQmCC"); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } } color { @@ -2357,34 +2352,34 @@ transform { color: rgb(252,252,252); } color-matrix { - matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); - offset: 0.196078 0.196078 0.196078 0; child: texture { bounds: 54 28 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA8klEQVQ4jbXSwSrEURTH8Y/YsZiUhfIGnkFJUrKSlIeQJ5AaUlPWdrKUJ9DMwhMQyZKVhSxEg7Lwz1i4f925c/9jSk7dbuee8/3dczqHf7BxbOEcL3jFFeqY/A1exBM6FecZq1XwPD76wOUpMJvCY3gYAO7gCCOpwMaA8CGGc+W3Msmnib+PoYjpErpNkhvhfTf4ewlcw0kscBPBx0l1S4k/hWvf4/2xZiRQYC3XJ6ZxF/Iu48B60kJOZEb3jmzHwVHc9xFZxnsUa2MiLW9O7yIVOAh3+faJlYoWLeBR70jjnyvh0mrYxFkA3nCBnVzZf7Yvt2xyJ4TFGjYAAAAASUVORK5CYII="); } + matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); + offset: 0.196078 0.196078 0.196078 0; } color { bounds: 82 25 71 23; color: rgb(252,252,252); } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; x: 86; y: 42; - color: rgb(50,50,50); - glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; } color { bounds: 153 25 60 23; color: rgb(252,252,252); } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 30 10240 0 0 1, 324 4096 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1; x: 157; y: 42; - color: rgb(50,50,50); - glyphs: 30 10240 0 0 1, 324 4096 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1; } color { bounds: 0 48 42 23; @@ -2393,11 +2388,11 @@ transform { container { container { rounded-clip { - clip: 13 51 16 16 / 3; child: color { bounds: 13 51 16 16; color: rgb(252,252,252); } + clip: 13 51 16 16 / 3; } color { bounds: 14 52 14 14; @@ -2405,9 +2400,9 @@ transform { } } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: 13 51 16 16 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } } color { @@ -2415,34 +2410,34 @@ transform { color: rgb(252,252,252); } color-matrix { - matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); - offset: 0.196078 0.196078 0.196078 0; child: texture { bounds: 54 51 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAz0lEQVQ4jbXSTU4CQRAF4A/iFlbKOVywMoRDGLyAe70D4o3kBqz9uQAXICxwcM2wmAY6Y3djjL6kku7qqtevfvgHDPCMd3wFe8MsvBVxhwp1xipMSsm7VsIYw5ZvlyIZZH4+oO3/xBV0Q8Ajeufqi9DHQ+z4SPxSUlBrGnvE9hcEVVxCHPxT1HARLktcJ4JG6GQIljHBPEOwKCh4iS+5Md4EFW3/BpecerDCve+96CZKqEPsOiVrolmS3CpvcFsoC82GPeFVM95tOE8Psv8Ue0ISW4s5Tmr/AAAAAElFTkSuQmCC"); } + matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); + offset: 0.196078 0.196078 0.196078 0; } color { bounds: 82 48 71 23; color: rgb(252,252,252); } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; x: 86; y: 65; - color: rgb(50,50,50); - glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; } color { bounds: 153 48 60 23; color: rgb(252,252,252); } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 370 8192 0 0 1, 430 5120 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1; x: 157; y: 65; - color: rgb(50,50,50); - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 370 8192 0 0 1, 430 5120 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1; } color { bounds: 0 71 42 23; @@ -2451,11 +2446,11 @@ transform { container { container { rounded-clip { - clip: 13 74 16 16 / 3; child: color { bounds: 13 74 16 16; color: rgb(252,252,252); } + clip: 13 74 16 16 / 3; } color { bounds: 14 75 14 14; @@ -2463,17 +2458,17 @@ transform { } } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: 13 74 16 16 / 3; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 14 75 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAAeElEQVQokb3QXwpAQBDH8e9uzscRXEXyJFE8KFoXcxheVm1j0Cp+tQ87M5/2D/yc8g2qgC0GGKDzSIUpYBXUB+gEC19cAmyAQaAmRJloOiABJlGv5WnWD4dDq9i32tuOa41i+FiT719Gw/MT0rDj/Mu3sUAei77LDp72K7jAZx9tAAAAAElFTkSuQmCC"); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } } color { @@ -2481,23 +2476,23 @@ transform { color: rgb(252,252,252); } color-matrix { - matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); - offset: 0.196078 0.196078 0.196078 0; child: texture { bounds: 54 74 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA/klEQVQ4jaXTzypFURTH8Q9CN2FyXYmRjqmpiZkykoF0n+J6Bxl4CQ/gASTlAZjwApIRMhDiSkd0Dc6W3bHPPcmv1mCv/Vvf/W9t/qmBRG4aHYzhNORecIML5LF5qFTcxjFWcYQnDKKBFjI8hyBMxsX7mAzju8TuhrGMuTJgBnsl4FsCQHHsJYzGgC1MJIxVGsFCDFhLmMrAsmZjQJYwzNcAxmPAZ8KwXgPoxYCrhCHDYh9ANwYcVJg6aFbMXfNz0y1cCucq6QG7uI1yOQ6Rf3fiq6JNN/1+vgZW8BFWfccJHlPb2lC0b68i7hVN1FdN7OBc8Ym6OMM2puqK/6wvIccweWvwsr0AAAAASUVORK5CYII="); } + matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); + offset: 0.196078 0.196078 0.196078 0; } color { bounds: 82 71 71 23; color: rgb(252,252,252); } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 126 11264 0 0 1, 409 6144 0 0 1, 466 7168 0 0 1, 324 4096 0 0 1, 349 4096 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; x: 86; y: 88; - color: rgb(50,50,50); - glyphs: 126 11264 0 0 1, 409 6144 0 0 1, 466 7168 0 0 1, 324 4096 0 0 1, 349 4096 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; } color { bounds: 153 71 60 23; @@ -2505,18 +2500,18 @@ transform { } container { text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 165 9216 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1; x: 157; y: 88; - color: rgb(50,50,50); - glyphs: 165 9216 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1; } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 809 10240 0 0 1; x: 198; y: 88; - color: rgb(50,50,50); - glyphs: 809 10240 0 0 1; } } color { @@ -2526,32 +2521,32 @@ transform { container { container { rounded-clip { - clip: 13 97 16 16 / 8; child: color { bounds: 13 97 16 16; color: rgb(252,252,252); } + clip: 13 97 16 16 / 8; } rounded-clip { - clip: 13 97 16 16 / 8; child: color { bounds: 14 98 14 14; color: rgb(246,245,244); } + clip: 13 97 16 16 / 8; } } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: 13 97 16 16 / 8; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } color-matrix { - matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); - offset: 0.572549 0.584314 0.584314 0; child: texture { bounds: 14 98 14 14; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABmJLR0QA/wD/AP+gvaeTAAAASklEQVQokWNgGJmAjYGBoZWBgeERFLcwMDCwEqOxlYGB4T8abiZG42MsGh+iK2LCovE/MWLYNC4iUgwDsDJA/PQQihsZiAyc4QYASeYTs7b/ALUAAAAASUVORK5CYII="); } + matrix: matrix3d(-0.372549, 0.235294, -0.105882, 0, 0.388235, -0.109804, -0.584314, 0, 0.227451, -0.584314, -0.584314, 0, 0, 0, 0, 1); + offset: 0.572549 0.584314 0.584314 0; } } color { @@ -2559,23 +2554,23 @@ transform { color: rgb(252,252,252); } color-matrix { - matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); - offset: 0.196078 0.196078 0.196078 0; child: texture { bounds: 54 97 16 16; texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABT0lEQVQ4jZXTv0vXcRDH8cdXzQQTEZFCUVAU1xZ/LCIYrrVkoTi6NLTpX+DoGrTnkoMgqOjk8hXBhqbAMALTSB1EpDQp/DF874Nvv4hfPTg4uHu+7n13n0+52+01/mAYu/hdov6atWIBS+i4D1iHSXzBRfgnvMWDUnAnfiZgsa+h+iawEhX4fAuc+TuUBwNe4BgHSdEpevG/KL7ACX4E8xw20Y+xRGAzxL8XxVn+FbqwAUeowkBS8Bft+FcUZ/mnMcZuDrPIxUzdmMMytvAL52hAE/owGq86REUOtZjAXixxCD1oxuMQ2MdOXOFj7KQRU9ki67F4hwtkPoMaia1EYv0O8CrOYnRlCl9Xfwh9xXgInSYNjpHHG3wLbjB9wXzSIY8RtMVodWhR+LHySd2HVOARpmNhpUY4w3s8pHC+1JrxEs+i65MQ3cO2qytsZcAlA5qEWoLbkBcAAAAASUVORK5CYII="); } + matrix: matrix3d(0.00392157, 0.623529, 0.282353, 0, 0.764706, 0.278431, -0.196078, 0, 0.603922, -0.196078, -0.196078, 0, 0, 0, 0, 1); + offset: 0.196078 0.196078 0.196078 0; } color { bounds: 82 94 71 23; color: rgb(252,252,252); } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 29 10240 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 341 4096 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1; x: 86; y: 111; - color: rgb(50,50,50); - glyphs: 29 10240 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 341 4096 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1; } color { bounds: 153 94 60 23; @@ -2583,122 +2578,123 @@ transform { } container { text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 30 10240 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 406 8192 0 0 1; x: 157; y: 111; - color: rgb(50,50,50); - glyphs: 30 10240 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 406 8192 0 0 1; } text { + color: rgb(50,50,50); font: "Cantarell 11"; + glyphs: 809 10240 0 0 1; x: 196; y: 111; - color: rgb(50,50,50); - glyphs: 809 10240 0 0 1; } } } + clip: 0 25 210 262; } clip { - clip: 0 0 210 25; child: container { transform { - transform: translate(6, 0); child: container { color { bounds: -6 0 42 25; color: rgb(252,252,252); } border { + colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); outline: -6 0 42 25; widths: 0 1 1 0; - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 30 9216 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 349 4096 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 30 9216 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 349 4096 0 0 1; } } + transform: translate(6, 0); } transform { - transform: translate(42, 0) translate(6, 0); child: container { color { bounds: -6 0 40 25; color: rgb(252,252,252); } border { + colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); outline: -6 0 40 25; widths: 0 1 1 0; - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 81 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 81 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; } } + transform: translate(42, 0) translate(6, 0); } transform { - transform: translate(82, 0) translate(6, 0); child: container { color { bounds: -6 0 71 25; color: rgb(252,252,252); } border { + colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); outline: -6 0 71 25; widths: 0 1 1 0; - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 115 11264 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 287 8192 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 115 11264 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 287 8192 0 0 1; } } + transform: translate(82, 0) translate(6, 0); } transform { - transform: translate(153, 0) translate(6, 0); child: container { color { bounds: -6 0 60 25; color: rgb(252,252,252); } border { + colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); outline: -6 0 60 25; widths: 0 0 1 0; - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 115 11264 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 8192 0 0 1; x: 0; y: 17; - color: rgb(146,149,149); - glyphs: 115 11264 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 8192 0 0 1; } } + transform: translate(153, 0) translate(6, 0); } } + clip: 0 0 210 25; } } } } + transform: translate(1, 1); } transform { - transform: translate(0, 295) translate(1, 1); child: container { border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 212 263; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { color { @@ -2706,115 +2702,115 @@ transform { color: rgb(252,252,252); } clip { - clip: 0 0 210 261; child: container { color { bounds: 0 0 210 893; color: rgb(252,252,252); } } + clip: 0 0 210 261; } } } + transform: translate(0, 295) translate(1, 1); } } + transform: translate(1232, 0); } } transform { - transform: translate(0, 568); child: color { bounds: 0 0 1444 1; color: rgba(0,0,0,0.1); } + transform: translate(0, 568); } transform { - transform: translate(0, 579); child: container { transform { - transform: translate(1, 1); child: container { border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 354 142; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { transform { - transform: translate(1, 1); child: container { color { bounds: -1 -1 352 37; color: rgb(234,232,230); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 352 37; widths: 0 0 1 0; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(3, -1); child: container { transform { - transform: translate(149, 0) translate(16, 3); child: text { - font: "Cantarell Bold 11"; - x: 0; - y: 20; color: rgb(146,149,149); + font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - } - } - transform { - transform: translate(74, 0) translate(16, 3); - child: text { - font: "Cantarell Bold 11"; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; } + transform: translate(149, 0) translate(16, 3); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + x: 0; + y: 20; + } + transform: translate(74, 0) translate(16, 3); } transform { - transform: translate(16, 3); child: container { inset-shadow { - outline: -12 -3 66 37; + blur: 0; color: rgb(53,132,228); dx: 0; dy: -3; + outline: -12 -3 66 37; spread: 0; - blur: 0; } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; } } + transform: translate(16, 3); } } + transform: translate(3, -1); } } + transform: translate(1, 1); } transform { - transform: translate(0, 37); child: color { bounds: 0 0 352 103; color: rgb(252,252,252); } + transform: translate(0, 37); } } } + transform: translate(1, 1); } transform { - transform: translate(364, 0) translate(1, 1); child: container { border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 354 142; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { color { @@ -2822,74 +2818,74 @@ transform { color: rgb(252,252,252); } transform { - transform: translate(285, 0) translate(2, 1); child: container { color { bounds: -2 -1 67 140; color: rgb(234,232,230); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -2 -1 67 140; widths: 0 0 0 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(-2, 3); child: container { transform { - transform: translate(0, 88) translate(12, 7); child: text { - font: "Cantarell Bold 11"; - x: 0; - y: 20; color: rgb(146,149,149); + font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - } - } - transform { - transform: translate(0, 44) translate(12, 7); - child: text { - font: "Cantarell Bold 11"; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; } + transform: translate(0, 88) translate(12, 7); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + x: 0; + y: 20; + } + transform: translate(0, 44) translate(12, 7); } transform { - transform: translate(12, 7); child: container { inset-shadow { - outline: -12 -3 67 36; + blur: 0; color: rgb(53,132,228); dx: 3; dy: 0; + outline: -12 -3 67 36; spread: 0; - blur: 0; } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; } } + transform: translate(12, 7); } } + transform: translate(-2, 3); } } + transform: translate(285, 0) translate(2, 1); } } } + transform: translate(364, 0) translate(1, 1); } transform { - transform: translate(728, 0) translate(1, 1); child: container { border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 353 142; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { color { @@ -2897,148 +2893,152 @@ transform { color: rgb(252,252,252); } transform { - transform: translate(0, 103) translate(1, 2); child: container { color { bounds: -1 -2 351 37; color: rgb(234,232,230); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -2 351 37; widths: 1 0 0 0; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(3, -2); child: container { transform { - transform: translate(149, 0) translate(16, 4); child: text { - font: "Cantarell Bold 11"; - x: 0; - y: 20; color: rgb(146,149,149); + font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - } - } - transform { - transform: translate(74, 0) translate(16, 4); - child: text { - font: "Cantarell Bold 11"; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; } + transform: translate(149, 0) translate(16, 4); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + x: 0; + y: 20; + } + transform: translate(74, 0) translate(16, 4); } transform { - transform: translate(16, 4); child: container { inset-shadow { - outline: -12 -4 66 37; + blur: 0; color: rgb(53,132,228); dx: 0; dy: 3; + outline: -12 -4 66 37; spread: 0; - blur: 0; } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; } } + transform: translate(16, 4); } } + transform: translate(3, -2); } } + transform: translate(0, 103) translate(1, 2); } } } + transform: translate(728, 0) translate(1, 1); } transform { - transform: translate(1091, 0) translate(1, 1); child: container { border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 353 142; widths: 1 1 1 1; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } container { transform { - transform: translate(1, 1); child: container { color { bounds: -1 -1 67 140; color: rgb(234,232,230); } border { + colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); outline: -1 -1 67 140; widths: 0 1 0 0; - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); } transform { - transform: translate(-1, 3); child: container { transform { - transform: translate(0, 88) translate(12, 7); child: text { - font: "Cantarell Bold 11"; - x: 0; - y: 20; color: rgb(146,149,149); + font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - } - } - transform { - transform: translate(0, 44) translate(12, 7); - child: text { - font: "Cantarell Bold 11"; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; } + transform: translate(0, 88) translate(12, 7); + } + transform { + child: text { + color: rgb(146,149,149); + font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + x: 0; + y: 20; + } + transform: translate(0, 44) translate(12, 7); } transform { - transform: translate(12, 7); child: container { inset-shadow { - outline: -12 -3 67 36; + blur: 0; color: rgb(53,132,228); dx: -3; dy: 0; + outline: -12 -3 67 36; spread: 0; - blur: 0; } text { + color: rgb(146,149,149); font: "Cantarell Bold 11"; + glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; x: 0; y: 20; - color: rgb(146,149,149); - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; } } + transform: translate(12, 7); } } + transform: translate(-1, 3); } } + transform: translate(1, 1); } transform { - transform: translate(67, 0); child: color { bounds: 0 0 284 140; color: rgb(252,252,252); } + transform: translate(67, 0); } } } + transform: translate(1091, 0) translate(1, 1); } } + transform: translate(0, 579); } } + transform: translate(26, 70) translate(10, 10); } } + transform: translate(0, 0); } From ed0ecf0ff0968a1b09448929656c086e5837a28c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 14 May 2019 00:41:49 +0200 Subject: [PATCH 03/14] rendernodeparser: Allow single values instead of 4 This allows writing: colors: red; instead of colors: red red red red; to draw a red border. --- gsk/gskrendernodeparser.c | 123 ++++-- .../gsk/serializedeserialize/testswitch.node | 44 +-- .../serializedeserialize/widgetfactory.node | 370 +++++++++--------- 3 files changed, 302 insertions(+), 235 deletions(-) diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index ec122e594d..caf601d401 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -8,8 +8,8 @@ #include "gdk/gdkrgbaprivate.h" #include "gdk/gdktextureprivate.h" #include -#include "gtk/css/gtkcssparserprivate.h" #include "gtk/css/gtkcssdataurlprivate.h" +#include "gtk/css/gtkcssparserprivate.h" typedef struct _Declaration Declaration; @@ -318,18 +318,60 @@ clear_stops (gpointer inout_stops) } } +static gboolean +parse_float4 (GtkCssParser *parser, + gpointer out_floats) +{ + float *floats = (float *) out_floats; + double d[4]; + int i; + + for (i = 0; i < 4 && !gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF); i ++) + { + if (!gtk_css_parser_consume_number (parser, &d[i])) + return FALSE; + } + if (i == 0) + { + gtk_css_parser_error_syntax (parser, "Expected a color"); + return FALSE; + } + for (; i < 4; i++) + { + d[i] = d[(i - 1) >> 1]; + } + + for (i = 0; i < 4; i++) + { + floats[i] = d[i]; + } + + return TRUE; +} + static gboolean parse_colors4 (GtkCssParser *parser, gpointer out_colors) { - GdkRGBA *colors = (GdkRGBA *)out_colors; + GdkRGBA colors[4]; int i; - for (i = 0; i < 4; i ++) + for (i = 0; i < 4 && !gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF); i ++) { if (!gdk_rgba_parser_parse (parser, &colors[i])) return FALSE; } + if (i == 0) + { + gtk_css_parser_error_syntax (parser, "Expected a color"); + return FALSE; + } + for (; i < 4; i++) + { + colors[i] = colors[(i - 1) >> 1]; + } + + memcpy (out_colors, colors, sizeof (GdkRGBA) * 4); return TRUE; } @@ -688,17 +730,17 @@ static GskRenderNode * parse_border_node (GtkCssParser *parser) { GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); - graphene_rect_t widths = GRAPHENE_RECT_INIT (0, 0, 0, 0); - GdkRGBA colors[4] = { { 0, 0, 0, 0 }, {0, 0, 0, 0}, {0, 0, 0, 0}, { 0, 0, 0, 0 } }; + float widths[4] = { 1, 1, 1, 1 }; + GdkRGBA colors[4] = { { 0, 0, 0, 1 }, {0, 0, 0, 1 }, {0, 0, 0, 1 }, { 0, 0, 0, 1 } }; const Declaration declarations[] = { { "outline", parse_rounded_rect, NULL, &outline }, - { "widths", parse_rect, NULL, &widths }, + { "widths", parse_float4, NULL, &widths }, { "colors", parse_colors4, NULL, &colors } }; parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); - return gsk_border_node_new (&outline, (float*)&widths, colors); + return gsk_border_node_new (&outline, widths, colors); } static GskRenderNode * @@ -970,7 +1012,7 @@ static GskRenderNode * parse_blur_node (GtkCssParser *parser) { GskRenderNode *child = NULL; - double blur_radius = 0.0; + double blur_radius = 1.0; const Declaration declarations[] = { { "blur", parse_double, NULL, &blur_radius }, { "child", parse_node, clear_node, &child }, @@ -1654,31 +1696,56 @@ render_node_print (Printer *p, case GSK_BORDER_NODE: { + const GdkRGBA *colors = gsk_border_node_peek_colors (node); + const float *widths = gsk_border_node_peek_widths (node); + guint i, n; start_node (p, "border"); - _indent (p); - g_string_append (p->str, "colors: "); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[0]); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[1]); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[2]); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &gsk_border_node_peek_colors (node)[3]); - g_string_append (p->str, ";\n"); + if (!gdk_rgba_equal (&colors[3], &colors[1])) + n = 4; + else if (!gdk_rgba_equal (&colors[2], &colors[0])) + n = 3; + else if (!gdk_rgba_equal (&colors[1], &colors[0])) + n = 2; + else + n = 1; + + if (n > 0) + { + _indent (p); + g_string_append (p->str, "colors: "); + for (i = 0; i < n; i++) + { + if (i > 0) + g_string_append_c (p->str, ' '); + append_rgba (p->str, &colors[i]); + } + g_string_append (p->str, ";\n"); + } append_rounded_rect_param (p, "outline", gsk_border_node_peek_outline (node)); - _indent (p); - g_string_append (p->str, "widths: "); - string_append_double (p->str, gsk_border_node_peek_widths (node)[0]); - g_string_append_c (p->str, ' '); - string_append_double (p->str, gsk_border_node_peek_widths (node)[1]); - g_string_append_c (p->str, ' '); - string_append_double (p->str, gsk_border_node_peek_widths (node)[2]); - g_string_append_c (p->str, ' '); - string_append_double (p->str, gsk_border_node_peek_widths (node)[3]); - g_string_append (p->str, ";\n"); + if (widths[3] != widths[1]) + n = 4; + else if (widths[2] != widths[0]) + n = 3; + else if (widths[1] != widths[0]) + n = 2; + else + n = 1; + + if (n > 0) + { + _indent (p); + g_string_append (p->str, "widths: "); + for (i = 0; i < n; i++) + { + if (i > 0) + g_string_append_c (p->str, ' '); + string_append_double (p->str, widths[i]); + } + g_string_append (p->str, ";\n"); + } end_node (p); } diff --git a/testsuite/gsk/serializedeserialize/testswitch.node b/testsuite/gsk/serializedeserialize/testswitch.node index 7c3c7f2728..aca66a507b 100644 --- a/testsuite/gsk/serializedeserialize/testswitch.node +++ b/testsuite/gsk/serializedeserialize/testswitch.node @@ -16,9 +16,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); + colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } container { container { @@ -57,9 +57,9 @@ transform { } } border { - colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); + colors: rgb(191,184,177); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } } @@ -88,9 +88,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(24,95,180) rgb(24,95,180) rgb(24,95,180) rgb(24,95,180); + colors: rgb(24,95,180); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -146,9 +146,9 @@ transform { } } border { - colors: rgb(24,95,180) rgb(24,95,180) rgb(24,95,180) rgb(24,95,180); + colors: rgb(24,95,180); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } transform: translate(24, 0); @@ -181,9 +181,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); + colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } container { rounded-clip { @@ -194,9 +194,9 @@ transform { clip: -1 -1 26 26 / 13; } border { - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); + colors: rgb(205,199,194); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } } @@ -227,9 +227,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); + colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -241,9 +241,9 @@ transform { clip: -1 -1 26 26 / 13; } border { - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); + colors: rgb(205,199,194); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } transform: translate(24, 0); @@ -276,9 +276,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(205,199,194) rgb(205,199,194) rgb(205,199,194) rgb(205,199,194); + colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } container { container { @@ -317,9 +317,9 @@ transform { } } border { - colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); + colors: rgb(191,184,177); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } } @@ -371,9 +371,9 @@ transform { } } border { - colors: rgb(191,184,177) rgb(191,184,177) rgb(191,184,177) rgb(191,184,177); + colors: rgb(191,184,177); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } } transform: translate(1, 6); diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node b/testsuite/gsk/serializedeserialize/widgetfactory.node index 95dd44a686..66dcfdf0cc 100644 --- a/testsuite/gsk/serializedeserialize/widgetfactory.node +++ b/testsuite/gsk/serializedeserialize/widgetfactory.node @@ -55,9 +55,9 @@ transform { } } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -6 0 1464 47 / 7 7 0 0; - widths: 0 0 1 0; + widths: 0 0 1; } transform { child: container { @@ -71,7 +71,7 @@ transform { clip: -17 -5 133 34 / 5 0 0 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 133 34 / 5 0 0 5; widths: 1 0 1 1; } @@ -95,7 +95,7 @@ transform { color: rgb(246,245,244); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 133 34; widths: 1 0 1 1; } @@ -122,9 +122,9 @@ transform { clip: -17 -5 134 34 / 0 5 5 0; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 134 34 / 0 5 5 0; - widths: 1 1 1 1; + widths: 1; } transform { child: text { @@ -152,9 +152,9 @@ transform { clip: -6 -5 36 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -6 -5 36 34 / 5; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -199,7 +199,7 @@ transform { clip: -9 -1 374 34 / 5 0 0 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -9 -1 374 34 / 5 0 0 5; widths: 1 0 1 1; } @@ -246,7 +246,7 @@ transform { border { colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(53,132,228); outline: -10 -5 36 34 / 0 5 5 0; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -272,7 +272,7 @@ transform { clip: -9 -1 374 34 / 5 0 0 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -9 -1 374 34 / 5 0 0 5; widths: 1 0 1 1; } @@ -299,9 +299,9 @@ transform { clip: -10 -5 36 34 / 0 5 5 0; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 36 34 / 0 5 5 0; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -327,9 +327,9 @@ transform { clip: -9 -1 410 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -9 -1 410 34 / 5; - widths: 1 1 1 1; + widths: 1; } clip { child: opacity { @@ -368,9 +368,9 @@ transform { clip: -9 -1 410 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -9 -1 410 34 / 5; - widths: 1 1 1 1; + widths: 1; } clip { child: text { @@ -397,7 +397,7 @@ transform { clip: -9 -1 374 35 / 5 0 0 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -9 -1 374 35 / 5 0 0 5; widths: 1 0 1 1; } @@ -424,9 +424,9 @@ transform { clip: -6 -5 36 35 / 0 5 5 0; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -6 -5 36 35 / 0 5 5 0; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -454,7 +454,7 @@ transform { clip: -10 -5 137 34 / 5 0 0 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 137 34 / 5 0 0 5; widths: 1 0 1 1; } @@ -489,7 +489,7 @@ transform { color: rgb(246,245,244); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 136 34; widths: 1 0 1 1; } @@ -529,9 +529,9 @@ transform { clip: -10 -5 137 34 / 0 5 5 0; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 137 34 / 0 5 5 0; - widths: 1 1 1 1; + widths: 1; } container { text { @@ -590,9 +590,9 @@ transform { clip: -1 -1 112 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 112 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { transform { @@ -608,7 +608,7 @@ transform { transform { child: container { border { - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); + colors: rgba(213,208,204,0.3); outline: -6 0 35 32; widths: 0 0 0 1; } @@ -626,7 +626,7 @@ transform { transform { child: container { border { - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); + colors: rgba(213,208,204,0.3); outline: -6 0 35 32 / 0 5 5 0; widths: 0 0 0 1; } @@ -655,9 +655,9 @@ transform { clip: -1 -1 112 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 112 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { transform { @@ -677,7 +677,7 @@ transform { color: rgb(250,249,248); } border { - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); + colors: rgba(213,208,204,0.3); outline: -6 0 35 32; widths: 0 0 0 1; } @@ -702,7 +702,7 @@ transform { clip: -6 0 35 32 / 0 5 5 0; } border { - colors: rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3) rgba(213,208,204,0.3); + colors: rgba(213,208,204,0.3); outline: -6 0 35 32 / 0 5 5 0; widths: 0 0 0 1; } @@ -735,9 +735,9 @@ transform { color: rgb(246,245,244); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -772,9 +772,9 @@ transform { color: rgb(246,245,244); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } } transform: translate(5, 2); @@ -801,9 +801,9 @@ transform { color: rgb(246,245,244); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -838,9 +838,9 @@ transform { color: rgb(250,249,248); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -875,9 +875,9 @@ transform { color: rgb(250,249,248); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } } transform: translate(5, 2); @@ -904,9 +904,9 @@ transform { color: rgb(250,249,248); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -944,9 +944,9 @@ transform { clip: -1 -1 16 16 / 8; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } } transform: translate(5, 2); @@ -976,9 +976,9 @@ transform { clip: -1 -1 16 16 / 8; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } } transform: translate(5, 2); @@ -1008,9 +1008,9 @@ transform { clip: -1 -1 16 16 / 8; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -1048,9 +1048,9 @@ transform { clip: -1 -1 16 16 / 8; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -1088,9 +1088,9 @@ transform { clip: -1 -1 16 16 / 8; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } } transform: translate(5, 2); @@ -1120,9 +1120,9 @@ transform { clip: -1 -1 16 16 / 8; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -1202,9 +1202,9 @@ transform { clip: -17 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } text { color: rgb(146,149,149); @@ -1226,9 +1226,9 @@ transform { clip: -17 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } text { color: rgb(212,207,202); @@ -1250,9 +1250,9 @@ transform { clip: -17 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } text { color: rgb(146,149,149); @@ -1274,9 +1274,9 @@ transform { clip: -17 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } text { color: rgb(212,207,202); @@ -1299,9 +1299,9 @@ transform { clip: -10 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { text { @@ -1339,9 +1339,9 @@ transform { clip: -10 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { text { @@ -1379,9 +1379,9 @@ transform { clip: -10 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { text { @@ -1421,9 +1421,9 @@ transform { clip: -5 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -5 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { color { @@ -1432,9 +1432,9 @@ transform { } transform { child: border { - colors: rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3); + colors: rgba(0,0,0,0.3); outline: -1 -1 112 24; - widths: 1 1 1 1; + widths: 1; } transform: translate(1, 1); } @@ -1455,9 +1455,9 @@ transform { clip: -10 -5 122 34 / 5; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1 1 1 1; + widths: 1; } container { transform { @@ -1513,9 +1513,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } container { rounded-clip { @@ -1526,9 +1526,9 @@ transform { clip: -1 -1 26 26 / 13; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } } @@ -1544,9 +1544,9 @@ transform { clip: -1 -1 50 26 / 13; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 50 26 / 13; - widths: 1 1 1 1; + widths: 1; } container { rounded-clip { @@ -1557,9 +1557,9 @@ transform { clip: -1 -1 26 26 / 13; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 26 26 / 13; - widths: 1 1 1 1; + widths: 1; } } } @@ -1588,9 +1588,9 @@ transform { clip: -1 -1 502 4 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 502 4 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -1602,9 +1602,9 @@ transform { clip: -1 -1 252 4 / 2 1.5 1.5 2; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 252 4 / 2 1.5 1.5 2; - widths: 1 1 1 1; + widths: 1; } } transform: translate(0, -1) translate(0, 1); @@ -1623,9 +1623,9 @@ transform { clip: -1 -1 502 4 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 502 4 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -1637,9 +1637,9 @@ transform { clip: -1 -1 252 4 / 1.5 2 2 1.5; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 252 4 / 1.5 2 2 1.5; - widths: 1 1 1 1; + widths: 1; } } transform: translate(250, -1) translate(0, 1); @@ -1671,9 +1671,9 @@ transform { clip: -1 -1 502 4 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 502 4 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -1685,9 +1685,9 @@ transform { clip: -1 -1 102 4 / 1.5; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 102 4 / 1.5; - widths: 1 1 1 1; + widths: 1; } } transform: translate(43, -1) translate(0, 1); @@ -1709,15 +1709,15 @@ transform { clip: -3 -3 502 9 / 3; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -3 -3 502 9 / 3; - widths: 1 1 1 1; + widths: 1; } transform { child: border { - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); + colors: rgba(146,149,149,0.15); outline: -1 -1 496 3 / 1; - widths: 1 1 1 1; + widths: 1; } transform: translate(1, 1); } @@ -1731,9 +1731,9 @@ transform { clip: -1 -1 297 3 / 1; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 297 3 / 1; - widths: 1 1 1 1; + widths: 1; } } transform: translate(1, 1); @@ -1754,9 +1754,9 @@ transform { clip: -3 -3 502 9 / 3; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -3 -3 502 9 / 3; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -1768,9 +1768,9 @@ transform { clip: -1 -1 97 3 / 1; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; + widths: 1; } } transform: translate(2, 1); @@ -1785,34 +1785,34 @@ transform { clip: -1 -1 97 3 / 1; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; + widths: 1; } } transform: translate(99, 0) translate(2, 1); } transform { child: border { - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); + colors: rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; + widths: 1; } transform: translate(198, 0) translate(2, 1); } transform { child: border { - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); + colors: rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; + widths: 1; } transform: translate(297, 0) translate(2, 1); } transform { child: border { - colors: rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15) rgba(146,149,149,0.15); + colors: rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; - widths: 1 1 1 1; + widths: 1; } transform: translate(396, 0) translate(2, 1); } @@ -1835,9 +1835,9 @@ transform { clip: -1 -1 478 4 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 478 4 / 2; - widths: 1 1 1 1; + widths: 1; } container { rounded-clip { @@ -1848,9 +1848,9 @@ transform { clip: -1 -1 237 4 / 2; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 237 4 / 2; - widths: 1 1 1 1; + widths: 1; } } transform { @@ -1863,9 +1863,9 @@ transform { clip: -1 -1 20 20 / 10; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1 1 1 1; + widths: 1; } } transform: translate(234, 0) translate(-8, -8); @@ -1886,9 +1886,9 @@ transform { clip: -1 -1 478 4 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 478 4 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -1900,9 +1900,9 @@ transform { clip: -1 -1 20 20 / 10; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1 1 1 1; + widths: 1; } } transform: translate(234, 0) translate(-8, -8); @@ -1967,9 +1967,9 @@ transform { clip: -1 -1 478 4 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 478 4 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: texture { @@ -1998,9 +1998,9 @@ transform { clip: -1 -1 4 362 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 4 362 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -2012,9 +2012,9 @@ transform { clip: -1 -1 4 182 / 2 2 1.5 1.5; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 4 182 / 2 2 1.5 1.5; - widths: 1 1 1 1; + widths: 1; } } transform: translate(-1, 0) translate(1, 0); @@ -2035,9 +2035,9 @@ transform { clip: -1 -1 4 362 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 4 362 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -2049,9 +2049,9 @@ transform { clip: -1 -1 4 182 / 1.5 1.5 2 2; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 4 182 / 1.5 1.5 2 2; - widths: 1 1 1 1; + widths: 1; } } transform: translate(-1, 180) translate(1, 0); @@ -2083,9 +2083,9 @@ transform { clip: -1 -1 4 310 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 4 310 / 2; - widths: 1 1 1 1; + widths: 1; } container { rounded-clip { @@ -2096,9 +2096,9 @@ transform { clip: -1 -1 4 154 / 2; } border { - colors: rgb(53,132,228) rgb(53,132,228) rgb(53,132,228) rgb(53,132,228); + colors: rgb(53,132,228); outline: -1 -1 4 154 / 2; - widths: 1 1 1 1; + widths: 1; } } transform { @@ -2111,9 +2111,9 @@ transform { clip: -1 -1 20 20 / 10; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1 1 1 1; + widths: 1; } } transform: translate(0, 151) translate(-8, -8); @@ -2143,9 +2143,9 @@ transform { clip: -1 -1 4 310 / 2; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 4 310 / 2; - widths: 1 1 1 1; + widths: 1; } transform { child: container { @@ -2157,9 +2157,9 @@ transform { clip: -1 -1 20 20 / 10; } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1 1 1 1; + widths: 1; } } transform: translate(0, 151) translate(-8, -8); @@ -2193,7 +2193,7 @@ transform { border { colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -1 -1 114 135; - widths: 1 1 1 1; + widths: 1; } text { color: rgb(146,149,149); @@ -2210,7 +2210,7 @@ transform { border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -1 -1 114 135; - widths: 1 1 1 1; + widths: 1; } text { color: rgb(146,149,149); @@ -2228,17 +2228,17 @@ transform { border { colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -2 -2 114 135; - widths: 1 1 1 1; + widths: 1; } border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -1 -1 112 133; - widths: 1 1 1 1; + widths: 1; } border { - colors: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0); + colors: rgba(0,0,0,0); outline: -2 -2 114 135; - widths: 2 2 2 2; + widths: 2; } } text { @@ -2257,17 +2257,17 @@ transform { border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -2 -2 114 135; - widths: 1 1 1 1; + widths: 1; } border { colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -1 -1 112 133; - widths: 1 1 1 1; + widths: 1; } border { - colors: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0); + colors: rgba(0,0,0,0); outline: -2 -2 114 135; - widths: 2 2 2 2; + widths: 2; } } text { @@ -2295,9 +2295,9 @@ transform { transform { child: container { border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 212 289; - widths: 1 1 1 1; + widths: 1; } color { bounds: 204 281 6 6; @@ -2334,9 +2334,9 @@ transform { } } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: 13 28 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -2400,9 +2400,9 @@ transform { } } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: 13 51 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } } color { @@ -2458,9 +2458,9 @@ transform { } } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: 13 74 16 16 / 3; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -2536,9 +2536,9 @@ transform { } } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: 13 97 16 16 / 8; - widths: 1 1 1 1; + widths: 1; } color-matrix { child: texture { @@ -2604,7 +2604,7 @@ transform { color: rgb(252,252,252); } border { - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); + colors: rgb(246,245,244); outline: -6 0 42 25; widths: 0 1 1 0; } @@ -2625,7 +2625,7 @@ transform { color: rgb(252,252,252); } border { - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); + colors: rgb(246,245,244); outline: -6 0 40 25; widths: 0 1 1 0; } @@ -2646,7 +2646,7 @@ transform { color: rgb(252,252,252); } border { - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); + colors: rgb(246,245,244); outline: -6 0 71 25; widths: 0 1 1 0; } @@ -2667,9 +2667,9 @@ transform { color: rgb(252,252,252); } border { - colors: rgb(246,245,244) rgb(246,245,244) rgb(246,245,244) rgb(246,245,244); + colors: rgb(246,245,244); outline: -6 0 60 25; - widths: 0 0 1 0; + widths: 0 0 1; } text { color: rgb(146,149,149); @@ -2692,9 +2692,9 @@ transform { transform { child: container { border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 212 263; - widths: 1 1 1 1; + widths: 1; } container { color { @@ -2730,9 +2730,9 @@ transform { transform { child: container { border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 354 142; - widths: 1 1 1 1; + widths: 1; } container { transform { @@ -2742,9 +2742,9 @@ transform { color: rgb(234,232,230); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 352 37; - widths: 0 0 1 0; + widths: 0 0 1; } transform { child: container { @@ -2808,9 +2808,9 @@ transform { transform { child: container { border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 354 142; - widths: 1 1 1 1; + widths: 1; } container { color { @@ -2824,7 +2824,7 @@ transform { color: rgb(234,232,230); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -2 -1 67 140; widths: 0 0 0 1; } @@ -2883,9 +2883,9 @@ transform { transform { child: container { border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 353 142; - widths: 1 1 1 1; + widths: 1; } container { color { @@ -2899,9 +2899,9 @@ transform { color: rgb(234,232,230); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -2 351 37; - widths: 1 0 0 0; + widths: 1 0 0; } transform { child: container { @@ -2958,9 +2958,9 @@ transform { transform { child: container { border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 353 142; - widths: 1 1 1 1; + widths: 1; } container { transform { @@ -2970,7 +2970,7 @@ transform { color: rgb(234,232,230); } border { - colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(213,208,204); + colors: rgb(213,208,204); outline: -1 -1 67 140; widths: 0 1 0 0; } From 20d1bc2cccabe2225ae3eaf2248a9a1464ac513a Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 14 May 2019 02:49:19 +0200 Subject: [PATCH 04/14] rendernodeparser: Skip root node when it's a container When printing, behave the same way as when parsing: Magically skip a container node if there is one - just like the parser magically creates a container node to hold all the nodes it parses. --- gsk/gskrendernode.c | 28 --------------- gsk/gskrendernodeparser.c | 61 +++++++++++++++++++++++++++++--- gsk/gskrendernodeparserprivate.h | 1 - 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index 1b1dd2d78f..2e4753a2e0 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -310,34 +310,6 @@ gsk_render_node_diff (GskRenderNode *node1, #define GSK_RENDER_NODE_SERIALIZATION_VERSION 0 #define GSK_RENDER_NODE_SERIALIZATION_ID "GskRenderNode" -/** - * gsk_render_node_serialize: - * @node: a #GskRenderNode - * - * Serializes the @node for later deserialization via - * gsk_render_node_deserialize(). No guarantees are made about the format - * used other than that the same version of GTK+ will be able to deserialize - * the result of a call to gsk_render_node_serialize() and - * gsk_render_node_deserialize() will correctly reject files it cannot open - * that were created with previous versions of GTK+. - * - * The intended use of this functions is testing, benchmarking and debugging. - * The format is not meant as a permanent storage format. - * - * Returns: a #GBytes representing the node. - **/ -GBytes * -gsk_render_node_serialize (GskRenderNode *node) -{ - GBytes *result; - char *str; - - str = gsk_render_node_serialize_to_string (node); - result = g_bytes_new_take (str, strlen (str)); - - return result; -} - /** * gsk_render_node_write_to_file: * @node: a #GskRenderNode diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index caf601d401..b9603b235e 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -1,3 +1,25 @@ +/* + * Copyright © 2019 Benjamin Otte + * Timm Bäder + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Benjamin Otte + * Timm Bäder + */ + +#include "config.h" #include "gskrendernodeparserprivate.h" @@ -1945,13 +1967,44 @@ render_node_print (Printer *p, } } -char * -gsk_render_node_serialize_to_string (GskRenderNode *root) +/** + * gsk_render_node_serialize: + * @node: a #GskRenderNode + * + * Serializes the @node for later deserialization via + * gsk_render_node_deserialize(). No guarantees are made about the format + * used other than that the same version of GTK+ will be able to deserialize + * the result of a call to gsk_render_node_serialize() and + * gsk_render_node_deserialize() will correctly reject files it cannot open + * that were created with previous versions of GTK+. + * + * The intended use of this functions is testing, benchmarking and debugging. + * The format is not meant as a permanent storage format. + * + * Returns: a #GBytes representing the node. + **/ +GBytes * +gsk_render_node_serialize (GskRenderNode *node) { Printer p; printer_init (&p); - render_node_print (&p, root); - return g_string_free (p.str, FALSE); + if (gsk_render_node_get_node_type (node) == GSK_CONTAINER_NODE) + { + guint i; + + for (i = 0; i < gsk_container_node_get_n_children (node); i ++) + { + GskRenderNode *child = gsk_container_node_get_child (node, i); + + render_node_print (&p, child); + } + } + else + { + render_node_print (&p, node); + } + + return g_string_free_to_bytes (p.str); } diff --git a/gsk/gskrendernodeparserprivate.h b/gsk/gskrendernodeparserprivate.h index a506244429..7994488772 100644 --- a/gsk/gskrendernodeparserprivate.h +++ b/gsk/gskrendernodeparserprivate.h @@ -7,6 +7,5 @@ GskRenderNode * gsk_render_node_deserialize_from_bytes (GBytes *bytes, GskParseErrorFunc error_func, gpointer user_data); -char * gsk_render_node_serialize_to_string (GskRenderNode *root); #endif From 0fd0be4f9a51af7c0ab0a0a007287e538d755c35 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 14 May 2019 03:20:09 +0200 Subject: [PATCH 05/14] testsuite: Redo node-parser Base the rewrite on testsuite/css/parser/test-css-parser - we now require the node file to match a reference node and track the errors it triggers. We also no longer use gtester. --- gsk/meson.build | 2 +- testsuite/gsk/meson.build | 40 ++- testsuite/gsk/node-parser.c | 345 +++++++++++++++++++++-- testsuite/gsk/nodeparser/crash1.errors | 4 + testsuite/gsk/nodeparser/crash1.ref.node | 0 testsuite/gsk/nodeparser/crash2.errors | 5 + testsuite/gsk/nodeparser/crash2.ref.node | 0 testsuite/gsk/nodeparser/crash3.ref.node | 17 ++ testsuite/gsk/nodeparser/crash4.errors | 1 + testsuite/gsk/nodeparser/crash4.ref.node | 7 + 10 files changed, 382 insertions(+), 39 deletions(-) create mode 100644 testsuite/gsk/nodeparser/crash1.errors create mode 100644 testsuite/gsk/nodeparser/crash1.ref.node create mode 100644 testsuite/gsk/nodeparser/crash2.errors create mode 100644 testsuite/gsk/nodeparser/crash2.ref.node create mode 100644 testsuite/gsk/nodeparser/crash3.ref.node create mode 100644 testsuite/gsk/nodeparser/crash4.errors create mode 100644 testsuite/gsk/nodeparser/crash4.ref.node diff --git a/gsk/meson.build b/gsk/meson.build index a3b3ba002b..5b3e4d7ee6 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -26,6 +26,7 @@ gsk_public_sources = files([ 'gskrenderer.c', 'gskrendernode.c', 'gskrendernodeimpl.c', + 'gskrendernodeparser.c', 'gskroundedrect.c', 'gsktransform.c', 'gl/gskglrenderer.c', @@ -36,7 +37,6 @@ gsk_private_sources = files([ 'gskdebug.c', 'gskprivate.c', 'gskprofiler.c', - 'gskrendernodeparser.c', 'gl/gskshaderbuilder.c', 'gl/gskglprofiler.c', 'gl/gskglglyphcache.c', diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 20851649b3..608ec49d27 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -69,24 +69,34 @@ foreach renderer : renderers endforeach node_parser_tests = [ - 'crash1', - 'crash2', - 'crash3', - 'crash4', + 'crash1.errors', + 'crash1.node', + 'crash1.ref.node', + 'crash2.errors', + 'crash2.node', + 'crash2.ref.node', + 'crash3.node', + 'crash3.ref.node', + 'crash4.errors', + 'crash4.node', + 'crash4.ref.node', ] foreach test : node_parser_tests - test('parser ' + test, node_parser, - args: [join_paths(meson.current_source_dir(), 'nodeparser', test + '.node')], - env: [ 'GIO_USE_VOLUME_MONITOR=unix', - 'GSETTINGS_BACKEND=memory', - 'GTK_CSD=1', - 'G_ENABLE_DIAGNOSTIC=0', - 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), - 'GSK_RENDERER=opengl' - ], - suite: 'gsk') + if test.endswith('.node') and not test.endswith('.ref.node') + test('parser ' + test, node_parser, + args: [ join_paths(meson.current_source_dir(), 'nodeparser', test) + ], + env: [ 'GIO_USE_VOLUME_MONITOR=unix', + 'GSETTINGS_BACKEND=memory', + 'GTK_CSD=1', + 'G_ENABLE_DIAGNOSTIC=0', + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + 'GSK_RENDERER=opengl' + ], + suite: 'gsk') + endif endforeach serialize_deserialize_tests = [ diff --git a/testsuite/gsk/node-parser.c b/testsuite/gsk/node-parser.c index 9db6df204b..f0e1e7d889 100644 --- a/testsuite/gsk/node-parser.c +++ b/testsuite/gsk/node-parser.c @@ -1,44 +1,343 @@ +/* + * Copyright (C) 2011 Red Hat Inc. + * + * Author: + * Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library. If not, see . + */ + +#include "config.h" + #include +static char * +test_get_reference_file (const char *node_file) +{ + GString *file = g_string_new (NULL); + + if (g_str_has_suffix (node_file, ".node")) + g_string_append_len (file, node_file, strlen (node_file) - 5); + else + g_string_append (file, node_file); + + g_string_append (file, ".ref.node"); + + if (!g_file_test (file->str, G_FILE_TEST_EXISTS)) + { + g_string_free (file, TRUE); + return g_strdup (node_file); + } + + return g_string_free (file, FALSE); +} + +static char * +test_get_errors_file (const char *node_file) +{ + GString *file = g_string_new (NULL); + + if (g_str_has_suffix (node_file, ".node")) + g_string_append_len (file, node_file, strlen (node_file) - 5); + else + g_string_append (file, node_file); + + g_string_append (file, ".errors"); + + if (!g_file_test (file->str, G_FILE_TEST_EXISTS)) + { + g_string_free (file, TRUE); + return NULL; + } + + return g_string_free (file, FALSE); +} + +static GBytes * +diff_with_file (const char *file1, + GBytes *input, + GError **error) +{ + GSubprocess *process; + GBytes *output; + + process = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE + | G_SUBPROCESS_FLAGS_STDOUT_PIPE, + error, + "diff", "-u", file1, "-", NULL); + if (process == NULL) + return NULL; + + if (!g_subprocess_communicate (process, + input, + NULL, + &output, + NULL, + error)) + { + g_object_unref (process); + return NULL; + } + + return output; +} + +static void +append_error_value (GString *string, + GType enum_type, + guint value) +{ + GEnumClass *enum_class; + GEnumValue *enum_value; + + enum_class = g_type_class_ref (enum_type); + enum_value = g_enum_get_value (enum_class, value); + + g_string_append (string, enum_value->value_name); + + g_type_class_unref (enum_class); +} + static void deserialize_error_func (const GtkCssSection *section, const GError *error, gpointer user_data) { - char *section_str = gtk_css_section_to_string (section); + GString *errors = user_data; + char *section_string; - /* We want to parse invalid node files in this test and simply assert that the - * parser doesn't crash. So, just g_message() here instead of a warning or error. */ - g_message ("Error at %s: %s", section_str, error->message); + section_string = gtk_css_section_to_string (section); - free (section_str); + g_string_append_printf (errors, + "%s: error: ", + section_string); + g_free (section_string); + + if (error->domain == GTK_CSS_PARSER_ERROR) + append_error_value (errors, GTK_TYPE_CSS_PARSER_ERROR, error->code); + else if (error->domain == GTK_CSS_PARSER_WARNING) + append_error_value (errors, GTK_TYPE_CSS_PARSER_WARNING, error->code); + else + g_string_append_printf (errors, + "%s %u\n", + g_quark_to_string (error->domain), + error->code); + + g_string_append_c (errors, '\n'); +} + +static gboolean +parse_node_file (GFile *file, gboolean generate) +{ + char *node_file, *reference_file, *errors_file; + GskRenderNode *node; + GString *errors; + GBytes *diff, *bytes; + GError *error = NULL; + gboolean result = TRUE; + + bytes = g_file_load_bytes (file, NULL, NULL, &error); + if (error) + { + g_print ("Error loading file: %s\n", error->message); + g_clear_error (&error); + return FALSE; + } + g_assert (bytes != NULL); + + errors = g_string_new (""); + + node = gsk_render_node_deserialize (bytes, deserialize_error_func, errors); + g_bytes_unref (bytes); + bytes = gsk_render_node_serialize (node); + gsk_render_node_unref (node); + + if (generate) + { + g_print ("%s", (char *) g_bytes_get_data (bytes, NULL)); + g_bytes_unref (bytes); + g_string_free (errors, TRUE); + return TRUE; + } + + node_file = g_file_get_path (file); + reference_file = test_get_reference_file (node_file); + + diff = diff_with_file (reference_file, bytes, &error); + g_assert_no_error (error); + + if (diff && g_bytes_get_size (diff) > 0) + { + g_print ("Resulting file doesn't match reference:\n%s\n", + (const char *) g_bytes_get_data (diff, NULL)); + result = FALSE; + } + g_free (reference_file); + g_clear_pointer (&diff, g_bytes_unref); + + errors_file = test_get_errors_file (node_file); + + if (errors_file) + { + GBytes *error_bytes = g_string_free_to_bytes (errors); + diff = diff_with_file (errors_file, error_bytes, &error); + g_assert_no_error (error); + + if (diff && g_bytes_get_size (diff) > 0) + { + g_print ("Errors don't match expected errors:\n%s\n", + (const char *) g_bytes_get_data (diff, NULL)); + result = FALSE; + } + g_clear_pointer (&diff, g_bytes_unref); + g_clear_pointer (&error_bytes, g_bytes_unref); + } + else if (errors->str[0]) + { + g_print ("Unexpected errors:\n%s\n", errors->str); + result = FALSE; + g_string_free (errors, TRUE); + } + else + { + g_string_free (errors, TRUE); + } + + g_free (errors_file); + g_free (node_file); + g_bytes_unref (bytes); + + return result; +} + +static gboolean +test_file (GFile *file) +{ + return parse_node_file (file, FALSE); +} + +static int +compare_files (gconstpointer a, gconstpointer b) +{ + GFile *file1 = G_FILE (a); + GFile *file2 = G_FILE (b); + char *path1, *path2; + int result; + + path1 = g_file_get_path (file1); + path2 = g_file_get_path (file2); + + result = strcmp (path1, path2); + + g_free (path1); + g_free (path2); + + return result; +} + +static gboolean +test_files_in_directory (GFile *dir) +{ + GFileEnumerator *enumerator; + GFileInfo *info; + GList *l, *files; + GError *error = NULL; + gboolean result = TRUE; + + enumerator = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &error); + g_assert_no_error (error); + files = NULL; + + while ((info = g_file_enumerator_next_file (enumerator, NULL, &error))) + { + const char *filename; + + filename = g_file_info_get_name (info); + + if (!g_str_has_suffix (filename, ".node") || + g_str_has_suffix (filename, ".out.node") || + g_str_has_suffix (filename, ".ref.node")) + { + g_object_unref (info); + continue; + } + + files = g_list_prepend (files, g_file_get_child (dir, filename)); + + g_object_unref (info); + } + + g_assert_no_error (error); + g_object_unref (enumerator); + + files = g_list_sort (files, compare_files); + for (l = files; l; l = l->next) + { + result &= test_file (l->data); + } + g_list_free_full (files, g_object_unref); + + return result; } int main (int argc, char **argv) { - GError *error = NULL; - GskRenderNode *node; - GBytes *bytes; - GFile *file; + gboolean success; - g_assert (argc == 2); + gtk_test_init (&argc, &argv); - gtk_init (); + if (argc < 2) + { + const char *basedir; + GFile *dir; - file = g_file_new_for_commandline_arg (argv[1]); - bytes = g_file_load_bytes (file, NULL, NULL, &error); - g_assert_no_error (error); - g_assert (bytes != NULL); + basedir = g_test_get_dir (G_TEST_DIST); + dir = g_file_new_for_path (basedir); + success = test_files_in_directory (dir); - node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); - if (error) - g_test_message ("Error: %s\n", error->message); + g_object_unref (dir); + } + else if (strcmp (argv[1], "--generate") == 0) + { + if (argc >= 3) + { + GFile *file = g_file_new_for_commandline_arg (argv[2]); - g_clear_error (&error); - g_clear_pointer (&node, gsk_render_node_unref); - g_bytes_unref (bytes); - g_object_unref (file); + success = parse_node_file (file, TRUE); - return 0; + g_object_unref (file); + } + else + success = FALSE; + } + else + { + guint i; + + success = TRUE; + + for (i = 1; i < argc; i++) + { + GFile *file = g_file_new_for_commandline_arg (argv[i]); + + success &= test_file (file); + + g_object_unref (file); + } + } + + return success ? 0 : 1; } + diff --git a/testsuite/gsk/nodeparser/crash1.errors b/testsuite/gsk/nodeparser/crash1.errors new file mode 100644 index 0000000000..9e36437262 --- /dev/null +++ b/testsuite/gsk/nodeparser/crash1.errors @@ -0,0 +1,4 @@ +:2:9-10: error: GTK_CSS_PARSER_ERROR_SYNTAX +:2:17-3:1: error: GTK_CSS_PARSER_WARNING_SYNTAX +:3:1: error: GTK_CSS_PARSER_ERROR_SYNTAX +:1:1-3:1: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/crash1.ref.node b/testsuite/gsk/nodeparser/crash1.ref.node new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/gsk/nodeparser/crash2.errors b/testsuite/gsk/nodeparser/crash2.errors new file mode 100644 index 0000000000..540ad3c099 --- /dev/null +++ b/testsuite/gsk/nodeparser/crash2.errors @@ -0,0 +1,5 @@ +:2:3-7: error: GTK_CSS_PARSER_ERROR_SYNTAX +:2:15-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX +:4:1: error: GTK_CSS_PARSER_ERROR_SYNTAX +:4:1: error: GTK_CSS_PARSER_ERROR_SYNTAX +:1:1-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/crash2.ref.node b/testsuite/gsk/nodeparser/crash2.ref.node new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/gsk/nodeparser/crash3.ref.node b/testsuite/gsk/nodeparser/crash3.ref.node new file mode 100644 index 0000000000..ccc74d2851 --- /dev/null +++ b/testsuite/gsk/nodeparser/crash3.ref.node @@ -0,0 +1,17 @@ +cross-fade { + end: color { + bounds: 5 5 10 10; + color: rgb(0,0,255); + } + progress: 0.2; + start: container { + color { + bounds: 0 0 10 10; + color: rgb(255,0,0); + } + color { + bounds: 10 10 10 10; + color: rgb(0,128,0); + } + } +} diff --git a/testsuite/gsk/nodeparser/crash4.errors b/testsuite/gsk/nodeparser/crash4.errors new file mode 100644 index 0000000000..90d2cc278c --- /dev/null +++ b/testsuite/gsk/nodeparser/crash4.errors @@ -0,0 +1 @@ +:6:3-7:1: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/crash4.ref.node b/testsuite/gsk/nodeparser/crash4.ref.node new file mode 100644 index 0000000000..e85e6e5eca --- /dev/null +++ b/testsuite/gsk/nodeparser/crash4.ref.node @@ -0,0 +1,7 @@ +blur { + blur: 40; + child: color { + bounds: 100 100 100 100; + color: rgb(0,0,0); + } +} From a1d08b4b52615bd1408976b5503c1bbe7e2c5bd9 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 19 May 2019 04:08:29 +0200 Subject: [PATCH 06/14] rendernode: Take a graphene_point_t for the offset ... instead of 2 floats. --- gsk/gl/gskglrenderer.c | 5 +- gsk/gskrendernode.h | 7 +- gsk/gskrendernodeimpl.c | 45 ++-- gsk/gskrendernodeparser.c | 14 +- gsk/vulkan/gskvulkancolortextpipeline.c | 7 +- .../gskvulkancolortextpipelineprivate.h | 3 +- gsk/vulkan/gskvulkanrenderpass.c | 6 +- gsk/vulkan/gskvulkantextpipeline.c | 7 +- gsk/vulkan/gskvulkantextpipelineprivate.h | 3 +- gtk/gtksnapshot.c | 3 +- gtk/inspector/recorder.c | 5 +- tests/rendernode-create-tests.c | 2 +- .../gsk/serializedeserialize/testswitch.node | 15 +- .../serializedeserialize/widgetfactory.node | 213 ++++++------------ 14 files changed, 116 insertions(+), 219 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 3a57fb1eef..99e1cacfbe 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -527,8 +527,9 @@ render_text_node (GskGLRenderer *self, guint num_glyphs = gsk_text_node_get_num_glyphs (node); int i; int x_position = 0; - float x = gsk_text_node_get_x (node) + builder->dx; - float y = gsk_text_node_get_y (node) + builder->dy; + const graphene_point_t *offset = gsk_text_node_get_offset (node); + float x = offset->x + builder->dx; + float y = offset->y + builder->dy; /* If the font has color glyphs, we don't need to recolor anything */ if (!force_color && font_has_color_glyphs (font)) diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index b1ae30785e..1c82f2cf13 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -292,8 +292,7 @@ GDK_AVAILABLE_IN_ALL GskRenderNode * gsk_text_node_new (PangoFont *font, PangoGlyphString *glyphs, const GdkRGBA *color, - float x, - float y); + const graphene_point_t *offset); GDK_AVAILABLE_IN_ALL const PangoFont * gsk_text_node_peek_font (GskRenderNode *node); GDK_AVAILABLE_IN_ALL @@ -303,9 +302,7 @@ const PangoGlyphInfo *gsk_text_node_peek_glyphs (GskRenderNode GDK_AVAILABLE_IN_ALL const GdkRGBA * gsk_text_node_peek_color (GskRenderNode *node); GDK_AVAILABLE_IN_ALL -float gsk_text_node_get_x (GskRenderNode *node); -GDK_AVAILABLE_IN_ALL -float gsk_text_node_get_y (GskRenderNode *node); +const graphene_point_t *gsk_text_node_get_offset (GskRenderNode *node); GDK_AVAILABLE_IN_ALL GskRenderNode * gsk_blur_node_new (GskRenderNode *child, diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index a5f0c03c73..a2082dc326 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -3429,8 +3429,7 @@ struct _GskTextNode PangoFont *font; GdkRGBA color; - double x; - double y; + graphene_point_t offset; guint num_glyphs; PangoGlyphInfo glyphs[]; @@ -3464,7 +3463,7 @@ gsk_text_node_draw (GskRenderNode *node, cairo_save (cr); gdk_cairo_set_source_rgba (cr, &self->color); - cairo_translate (cr, self->x, self->y); + cairo_translate (cr, self->offset.x, self->offset.y); pango_cairo_show_glyph_string (cr, self->font, &glyphs); cairo_restore (cr); @@ -3480,8 +3479,7 @@ gsk_text_node_diff (GskRenderNode *node1, if (self1->font == self2->font && gdk_rgba_equal (&self1->color, &self2->color) && - self1->x == self2->x && - self1->y == self2->y && + graphene_point_equal (&self1->offset, &self2->offset) && self1->num_glyphs == self2->num_glyphs) { guint i; @@ -3523,8 +3521,7 @@ static const GskRenderNodeClass GSK_TEXT_NODE_CLASS = { * @font: the #PangoFont containing the glyphs * @glyphs: the #PangoGlyphString to render * @color: the foreground color to render with - * @x: the x coordinate at which to put the baseline - * @y: the y coordinate at wihch to put the baseline + * @offset: offset of the baseline * * Creates a render node that renders the given glyphs, * Note that @color may not be used if the font contains @@ -3533,11 +3530,10 @@ static const GskRenderNodeClass GSK_TEXT_NODE_CLASS = { * Returns: (nullable): a new text node, or %NULL */ GskRenderNode * -gsk_text_node_new (PangoFont *font, - PangoGlyphString *glyphs, - const GdkRGBA *color, - float x, - float y) +gsk_text_node_new (PangoFont *font, + PangoGlyphString *glyphs, + const GdkRGBA *color, + const graphene_point_t *offset) { GskTextNode *self; PangoRectangle ink_rect; @@ -3553,14 +3549,13 @@ gsk_text_node_new (PangoFont *font, self->font = g_object_ref (font); self->color = *color; - self->x = x; - self->y = y; + self->offset = *offset; self->num_glyphs = glyphs->num_glyphs; memcpy (self->glyphs, glyphs->glyphs, sizeof (PangoGlyphInfo) * glyphs->num_glyphs); graphene_rect_init (&self->render_node.bounds, - x + ink_rect.x - 1, - y + ink_rect.y - 1, + offset->x + ink_rect.x - 1, + offset->y + ink_rect.y - 1, ink_rect.width + 2, ink_rect.height + 2); @@ -3607,24 +3602,14 @@ gsk_text_node_peek_glyphs (GskRenderNode *node) return self->glyphs; } -float -gsk_text_node_get_x (GskRenderNode *node) +const graphene_point_t * +gsk_text_node_get_offset (GskRenderNode *node) { GskTextNode *self = (GskTextNode *) node; - g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_TEXT_NODE), 0.0); + g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_TEXT_NODE), NULL); - return (float)self->x; -} - -float -gsk_text_node_get_y (GskRenderNode *node) -{ - GskTextNode *self = (GskTextNode *) node; - - g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_TEXT_NODE), 0.0); - - return (float)self->y; + return &self->offset; } /*** GSK_BLUR_NODE ***/ diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index b9603b235e..07e55fd7a2 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -1004,14 +1004,12 @@ static GskRenderNode * parse_text_node (GtkCssParser *parser) { PangoFont *font = NULL; - double x = 0; - double y = 0; + graphene_point_t offset = GRAPHENE_POINT_INIT (0, 0); GdkRGBA color = { 0, 0, 0, 1 }; PangoGlyphString *glyphs = NULL; const Declaration declarations[] = { { "font", parse_font, clear_font, &font }, - { "x", parse_double, NULL, &x }, - { "y", parse_double, NULL, &y }, + { "offset", parse_point, NULL, &offset }, { "color", parse_color, NULL, &color }, { "glyphs", parse_glyphs, clear_glyphs, &glyphs } }; @@ -1022,7 +1020,7 @@ parse_text_node (GtkCssParser *parser) if (!font || !glyphs) return NULL; - result = gsk_text_node_new (font, glyphs, &color, x, y); + result = gsk_text_node_new (font, glyphs, &color, &offset); g_object_unref (font); pango_glyph_string_free (glyphs); @@ -1855,6 +1853,7 @@ render_node_print (Printer *p, { const guint n_glyphs = gsk_text_node_get_num_glyphs (node); const PangoGlyphInfo *glyph; + const graphene_point_t *offset = gsk_text_node_get_offset (node); PangoFontDescription *desc; char *font_name; guint i; @@ -1887,9 +1886,8 @@ render_node_print (Printer *p, g_string_append_c (p->str, ';'); g_string_append_c (p->str, '\n'); - append_float_param (p, "x", gsk_text_node_get_x (node)); - append_float_param (p, "y", gsk_text_node_get_y (node)); - + if (!graphene_point_equal (offset, graphene_point_zero ())) + append_point_param (p, "offset", offset); end_node (p); } diff --git a/gsk/vulkan/gskvulkancolortextpipeline.c b/gsk/vulkan/gskvulkancolortextpipeline.c index 9770b27938..a7b0ad39a7 100644 --- a/gsk/vulkan/gskvulkancolortextpipeline.c +++ b/gsk/vulkan/gskvulkancolortextpipeline.c @@ -100,8 +100,7 @@ gsk_vulkan_color_text_pipeline_collect_vertex_data (GskVulkanColorTextPipeline * PangoFont *font, guint total_glyphs, const PangoGlyphInfo *glyphs, - float x, - float y, + const graphene_point_t *offset, guint start_glyph, guint num_glyphs, float scale) @@ -132,8 +131,8 @@ gsk_vulkan_color_text_pipeline_collect_vertex_data (GskVulkanColorTextPipeline * instance->tex_rect[2] = glyph->tw; instance->tex_rect[3] = glyph->th; - instance->rect[0] = x + cx + glyph->draw_x; - instance->rect[1] = y + cy + glyph->draw_y; + instance->rect[0] = offset->x + cx + glyph->draw_x; + instance->rect[1] = offset->y + cy + glyph->draw_y; instance->rect[2] = glyph->draw_width; instance->rect[3] = glyph->draw_height; diff --git a/gsk/vulkan/gskvulkancolortextpipelineprivate.h b/gsk/vulkan/gskvulkancolortextpipelineprivate.h index 2e46b1c6a8..a549c25fcd 100644 --- a/gsk/vulkan/gskvulkancolortextpipelineprivate.h +++ b/gsk/vulkan/gskvulkancolortextpipelineprivate.h @@ -28,8 +28,7 @@ void gsk_vulkan_color_text_pipeline_collect_vertex_data (Gs PangoFont *font, guint total_glyphs, const PangoGlyphInfo *glyphs, - float x, - float y, + const graphene_point_t *offset, guint start_glyph, guint num_glyphs, float scale); diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index fedd07a832..55f96456a8 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -1206,8 +1206,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, gsk_text_node_get_num_glyphs (op->text.node), gsk_text_node_peek_glyphs (op->text.node), gsk_text_node_peek_color (op->text.node), - gsk_text_node_get_x (op->text.node), - gsk_text_node_get_y (op->text.node), + gsk_text_node_get_offset (op->text.node), op->text.start_glyph, op->text.num_glyphs, op->text.scale); @@ -1225,8 +1224,7 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, (PangoFont *)gsk_text_node_peek_font (op->text.node), gsk_text_node_get_num_glyphs (op->text.node), gsk_text_node_peek_glyphs (op->text.node), - gsk_text_node_get_x (op->text.node), - gsk_text_node_get_y (op->text.node), + gsk_text_node_get_offset (op->text.node), op->text.start_glyph, op->text.num_glyphs, op->text.scale); diff --git a/gsk/vulkan/gskvulkantextpipeline.c b/gsk/vulkan/gskvulkantextpipeline.c index 361c53675d..7cd85c5d9a 100644 --- a/gsk/vulkan/gskvulkantextpipeline.c +++ b/gsk/vulkan/gskvulkantextpipeline.c @@ -108,8 +108,7 @@ gsk_vulkan_text_pipeline_collect_vertex_data (GskVulkanTextPipeline *pipeline, guint total_glyphs, const PangoGlyphInfo *glyphs, const GdkRGBA *color, - float x, - float y, + const graphene_point_t *offset, guint start_glyph, guint num_glyphs, float scale) @@ -140,8 +139,8 @@ gsk_vulkan_text_pipeline_collect_vertex_data (GskVulkanTextPipeline *pipeline, instance->tex_rect[2] = glyph->tw; instance->tex_rect[3] = glyph->th; - instance->rect[0] = x + cx + glyph->draw_x; - instance->rect[1] = y + cy + glyph->draw_y; + instance->rect[0] = offset->x + cx + glyph->draw_x; + instance->rect[1] = offset->y + cy + glyph->draw_y; instance->rect[2] = glyph->draw_width; instance->rect[3] = glyph->draw_height; diff --git a/gsk/vulkan/gskvulkantextpipelineprivate.h b/gsk/vulkan/gskvulkantextpipelineprivate.h index 47517de03c..c186c4d983 100644 --- a/gsk/vulkan/gskvulkantextpipelineprivate.h +++ b/gsk/vulkan/gskvulkantextpipelineprivate.h @@ -29,8 +29,7 @@ void gsk_vulkan_text_pipeline_collect_vertex_data (GskVulka guint total_glyphs, const PangoGlyphInfo *glyphs, const GdkRGBA *color, - float x, - float y, + const graphene_point_t *offset, guint start_glyph, guint num_glyphs, float scale); diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index 98d86619a3..592ba9bdda 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -1724,8 +1724,7 @@ gtk_snapshot_append_text (GtkSnapshot *snapshot, node = gsk_text_node_new (font, glyphs, color, - x + dx, - y + dy); + &GRAPHENE_POINT_INIT (x + dx, y + dy)); if (node == NULL) return; diff --git a/gtk/inspector/recorder.c b/gtk/inspector/recorder.c index 788d96d72a..0eda397f44 100644 --- a/gtk/inspector/recorder.c +++ b/gtk/inspector/recorder.c @@ -636,8 +636,7 @@ populate_render_node_properties (GtkListStore *store, const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node); const GdkRGBA *color = gsk_text_node_peek_color (node); guint num_glyphs = gsk_text_node_get_num_glyphs (node); - float x = gsk_text_node_get_x (node); - float y = gsk_text_node_get_y (node); + const graphene_point_t *offset = gsk_text_node_get_offset (node); PangoFontDescription *desc; GString *s; int i; @@ -654,7 +653,7 @@ populate_render_node_properties (GtkListStore *store, add_text_row (store, "Glyphs", s->str); g_string_free (s, TRUE); - tmp = g_strdup_printf ("%.2f %.2f", x, y); + tmp = g_strdup_printf ("%.2f %.2f", offset->x, offset->y); add_text_row (store, "Position", tmp); g_free (tmp); diff --git a/tests/rendernode-create-tests.c b/tests/rendernode-create-tests.c index be0c99d344..c81a457169 100644 --- a/tests/rendernode-create-tests.c +++ b/tests/rendernode-create-tests.c @@ -426,7 +426,7 @@ text (guint n) { GskRenderNode *node; - node = gsk_text_node_new (font, run->glyphs, &color, x, y); + node = gsk_text_node_new (font, run->glyphs, &color, &GRAPHENE_POINT_INIT (x, y)); if (node) g_ptr_array_add (nodes, node); } diff --git a/testsuite/gsk/serializedeserialize/testswitch.node b/testsuite/gsk/serializedeserialize/testswitch.node index aca66a507b..8f9d614786 100644 --- a/testsuite/gsk/serializedeserialize/testswitch.node +++ b/testsuite/gsk/serializedeserialize/testswitch.node @@ -70,8 +70,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; - x: 145; - y: 18; + offset: 145 18; } transform: translate(56, 0); } @@ -161,8 +160,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; - x: 147; - y: 18; + offset: 147 18; } transform: translate(56, 0); } @@ -207,8 +205,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; - x: 145; - y: 18; + offset: 145 18; } transform: translate(56, 0); } @@ -256,8 +253,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; - x: 147; - y: 18; + offset: 147 18; } transform: translate(56, 0); } @@ -330,8 +326,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; - x: 123; - y: 18; + offset: 123 18; } transform: translate(78, 0); } diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node b/testsuite/gsk/serializedeserialize/widgetfactory.node index 66dcfdf0cc..ff00fb1f89 100644 --- a/testsuite/gsk/serializedeserialize/widgetfactory.node +++ b/testsuite/gsk/serializedeserialize/widgetfactory.node @@ -80,8 +80,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; - x: 0; - y: 17; + offset: 0 17; } transform: translate(28, 0); } @@ -104,8 +103,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; - x: 0; - y: 17; + offset: 0 17; } transform: translate(28, 0); } @@ -131,8 +129,7 @@ transform { color: rgb(46,52,54); font: "Cantarell 11"; glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - x: 0; - y: 17; + offset: 0 17; } transform: translate(28, 0); } @@ -209,8 +206,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; - x: 0; - y: 21; + offset: 0 21; } clip { child: container { @@ -222,8 +218,7 @@ transform { color: rgb(252,252,252); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; - x: 0; - y: 21; + offset: 0 21; } } clip: 0 6 101 19; @@ -281,8 +276,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; - x: 0; - y: 21; + offset: 0 21; } clip: 0 0 357 32; } @@ -337,8 +331,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 30 10240 0 0 1, 349 4096 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 862 3072 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 862 3072 0 0 1, 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 358 13312 0 0 1, 370 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1; - x: 0; - y: 21; + offset: 0 21; } opacity: 0.54902; } @@ -377,8 +370,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; - x: 0; - y: 21; + offset: 0 21; } clip: 0 0 392 32; } @@ -406,8 +398,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; - x: 0; - y: 22; + offset: 0 22; } clip: 0 0 357 33; } @@ -463,8 +454,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 103 8192 0 0 1, 287 8192 0 0 1, 311 5120 0 0 1, 430 5120 0 0 1; - x: 2; - y: 17; + offset: 2 17; } transform { child: color-matrix { @@ -498,8 +488,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 113 13312 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 280 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } transform { child: color-matrix { @@ -538,8 +527,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 165 9216 0 0 1, 324 4096 0 0 1, 312 8192 0 0 1, 319 8192 0 0 1, 430 5120 0 0 1; - x: 2; - y: 17; + offset: 2 17; } transform { child: color-matrix { @@ -567,16 +555,14 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; - x: 0; - y: 22; + offset: 0 22; } transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; - x: 0; - y: 22; + offset: 0 22; } transform: translate(52, 0); } @@ -600,8 +586,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 682 8192 0 0 1, 677 9216 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(6, 6); } @@ -665,8 +650,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 677 9216 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(6, 6); } @@ -755,8 +739,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -784,8 +767,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -821,8 +803,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -858,8 +839,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -887,8 +867,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -924,8 +903,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -956,8 +934,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -988,8 +965,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -1028,8 +1004,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -1068,8 +1043,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -1100,8 +1074,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -1140,8 +1113,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } transform: translate(24, 0); } @@ -1210,8 +1182,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } } transform: translate(17, 5); @@ -1234,8 +1205,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } } transform: translate(0, 44) translate(17, 5); @@ -1258,8 +1228,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } } transform: translate(0, 88) translate(17, 5); @@ -1282,8 +1251,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } } transform: translate(0, 132) translate(17, 5); @@ -1308,8 +1276,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } transform { child: color-matrix { @@ -1348,8 +1315,7 @@ transform { color: rgb(212,207,202); font: "Cantarell 11"; glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; - x: 2; - y: 17; + offset: 2 17; } transform { child: color-matrix { @@ -1388,8 +1354,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 173 9216 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 862 3072 0 0 1, 165 9216 0 0 1, 287 8192 0 0 1, 312 8192 0 0 1, 438 8192 0 0 1, 349 4096 0 0 1, 244 8192 0 0 1, 409 6144 0 0 1; - x: 0; - y: 17; + offset: 0 17; } transform { child: transform { @@ -1397,8 +1362,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 678 7168 0 0 1, 679 8192 0 0 1; - x: 0; - y: 17; + offset: 0 17; } transform: translate(1, 0); } @@ -1465,8 +1429,7 @@ transform { color: rgb(146,149,149); font: "Cantarell 11"; glyphs: 822 4096 0 0 1, 115 11264 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 287 8192 0 0 1, 823 4096 0 0 1; - x: 0; - y: 17; + offset: 0 17; } transform: translate(16, 0); } @@ -1493,8 +1456,7 @@ transform { color: rgb(53,132,228); font: "Cantarell 11"; glyphs: 349 4096 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 10; - y: 17; + offset: 10 17; } color { bounds: 10 19 68 1; @@ -1656,8 +1618,7 @@ transform { color: rgba(46,52,54,0.4); font: "Cantarell 9.1669921875"; glyphs: 682 7168 0 0 1, 677 8192 0 0 1, 859 1024 0 0 1, 919 12288 0 0 1; - x: 0; - y: 13; + offset: 0 13; } transform: translate(237, 0); } @@ -2070,8 +2031,7 @@ transform { color: rgba(146,149,149,0.55); font: "Cantarell 11"; glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; - x: 26; - y: 15; + offset: 26 15; } transform { child: container { @@ -2130,8 +2090,7 @@ transform { color: rgba(146,149,149,0.55); font: "Cantarell 11"; glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; - x: 26; - y: 15; + offset: 26 15; } transform { child: container { @@ -2199,8 +2158,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 81 4096 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; - x: 0; - y: 15; + offset: 0 15; } } transform: translate(1, 1); @@ -2216,8 +2174,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 126 11264 0 0 1, 438 8192 0 0 1, 430 6144 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; - x: 0; - y: 15; + offset: 0 15; } } transform: translate(0, 141) translate(1, 1); @@ -2245,8 +2202,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 69 11264 0 0 1, 409 6144 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 466 7168 0 0 1, 287 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } } transform: translate(0, 282) translate(2, 2); @@ -2274,8 +2230,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 165 10240 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1; - x: 0; - y: 15; + offset: 0 15; } } transform: translate(0, 423) translate(2, 2); @@ -2367,8 +2322,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; - x: 86; - y: 42; + offset: 86 42; } color { bounds: 153 25 60 23; @@ -2378,8 +2332,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 30 10240 0 0 1, 324 4096 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1; - x: 157; - y: 42; + offset: 157 42; } color { bounds: 0 48 42 23; @@ -2425,8 +2378,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; - x: 86; - y: 65; + offset: 86 65; } color { bounds: 153 48 60 23; @@ -2436,8 +2388,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 370 8192 0 0 1, 430 5120 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1; - x: 157; - y: 65; + offset: 157 65; } color { bounds: 0 71 42 23; @@ -2491,8 +2442,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 126 11264 0 0 1, 409 6144 0 0 1, 466 7168 0 0 1, 324 4096 0 0 1, 349 4096 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; - x: 86; - y: 88; + offset: 86 88; } color { bounds: 153 71 60 23; @@ -2503,15 +2453,13 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 165 9216 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1; - x: 157; - y: 88; + offset: 157 88; } text { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 809 10240 0 0 1; - x: 198; - y: 88; + offset: 198 88; } } color { @@ -2569,8 +2517,7 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 29 10240 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 341 4096 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1; - x: 86; - y: 111; + offset: 86 111; } color { bounds: 153 94 60 23; @@ -2581,15 +2528,13 @@ transform { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 30 10240 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 406 8192 0 0 1; - x: 157; - y: 111; + offset: 157 111; } text { color: rgb(50,50,50); font: "Cantarell 11"; glyphs: 809 10240 0 0 1; - x: 196; - y: 111; + offset: 196 111; } } } @@ -2612,8 +2557,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 30 9216 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 349 4096 0 0 1; - x: 0; - y: 17; + offset: 0 17; } } transform: translate(6, 0); @@ -2633,8 +2577,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 81 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; - x: 0; - y: 17; + offset: 0 17; } } transform: translate(42, 0) translate(6, 0); @@ -2654,8 +2597,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 115 11264 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 287 8192 0 0 1; - x: 0; - y: 17; + offset: 0 17; } } transform: translate(82, 0) translate(6, 0); @@ -2675,8 +2617,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 115 11264 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 8192 0 0 1; - x: 0; - y: 17; + offset: 0 17; } } transform: translate(153, 0) translate(6, 0); @@ -2753,8 +2694,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(149, 0) translate(16, 3); } @@ -2763,8 +2703,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(74, 0) translate(16, 3); } @@ -2782,8 +2721,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; - x: 0; - y: 20; + offset: 0 20; } } transform: translate(16, 3); @@ -2835,8 +2773,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(0, 88) translate(12, 7); } @@ -2845,8 +2782,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(0, 44) translate(12, 7); } @@ -2864,8 +2800,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; - x: 0; - y: 20; + offset: 0 20; } } transform: translate(12, 7); @@ -2910,8 +2845,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(149, 0) translate(16, 4); } @@ -2920,8 +2854,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(74, 0) translate(16, 4); } @@ -2939,8 +2872,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; - x: 0; - y: 20; + offset: 0 20; } } transform: translate(16, 4); @@ -2981,8 +2913,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(0, 88) translate(12, 7); } @@ -2991,8 +2922,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; - x: 0; - y: 20; + offset: 0 20; } transform: translate(0, 44) translate(12, 7); } @@ -3010,8 +2940,7 @@ transform { color: rgb(146,149,149); font: "Cantarell Bold 11"; glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; - x: 0; - y: 20; + offset: 0 20; } } transform: translate(12, 7); From 678aa8088f6b7a860b874740f839d100991fdd8c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 14 May 2019 22:23:15 +0200 Subject: [PATCH 07/14] rgba: Add GDK_RGBA() macro So far it's private, but it's a pretty cute way to use hex colors, so we might conside making it public. --- gdk/gdkrgbaprivate.h | 11 +++++++++++ gsk/gskrendernodeparser.c | 10 +++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/gdk/gdkrgbaprivate.h b/gdk/gdkrgbaprivate.h index 58470e04c9..5126f57355 100644 --- a/gdk/gdkrgbaprivate.h +++ b/gdk/gdkrgbaprivate.h @@ -24,6 +24,17 @@ #include "gtk/css/gtkcssparserprivate.h" +#define _GDK_RGBA_DECODE(c) ((unsigned)(((c) >= 'A' && (c) <= 'F') ? ((c)-'A'+10) : \ + ((c) >= 'a' && (c) <= 'f') ? ((c)-'a'+10) : \ + ((c) >= '0' && (c) <= '9') ? ((c)-'0') : \ + -1)) +#define _GDK_RGBA_SELECT_COLOR(_str, index3, index6) _GDK_RGBA_DECODE (sizeof(_str) <= 4 ? (_str)[index3] : (_str)[index6]) +#define GDK_RGBA(str) ((GdkRGBA) {\ + ((_GDK_RGBA_SELECT_COLOR(str, 0, 0) << 4) | _GDK_RGBA_SELECT_COLOR(str, 0, 1)) / 255., \ + ((_GDK_RGBA_SELECT_COLOR(str, 1, 2) << 4) | _GDK_RGBA_SELECT_COLOR(str, 1, 3)) / 255., \ + ((_GDK_RGBA_SELECT_COLOR(str, 2, 4) << 4) | _GDK_RGBA_SELECT_COLOR(str, 2, 5)) / 255., \ + ((sizeof(str) % 4 == 1) ? ((_GDK_RGBA_SELECT_COLOR(str, 3, 6) << 4) | _GDK_RGBA_SELECT_COLOR(str, 3, 7)) : 0xFF) / 255 }) + gboolean gdk_rgba_parser_parse (GtkCssParser *parser, GdkRGBA *rgba); diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index 07e55fd7a2..b6832347c2 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -688,7 +688,7 @@ static GskRenderNode * parse_color_node (GtkCssParser *parser) { graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 0, 0); - GdkRGBA color = { 0, 0, 0, 1 }; + GdkRGBA color = GDK_RGBA("FF0000"); const Declaration declarations[] = { { "bounds", parse_rect, NULL, &bounds }, { "color", parse_color, NULL, &color }, @@ -732,7 +732,7 @@ static GskRenderNode * parse_inset_shadow_node (GtkCssParser *parser) { GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); - GdkRGBA color = { 0, 0, 0, 1 }; + GdkRGBA color = GDK_RGBA("000000"); double dx = 1, dy = 1, blur = 0, spread = 0; const Declaration declarations[] = { { "outline", parse_rounded_rect, NULL, &outline }, @@ -753,7 +753,7 @@ parse_border_node (GtkCssParser *parser) { GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); float widths[4] = { 1, 1, 1, 1 }; - GdkRGBA colors[4] = { { 0, 0, 0, 1 }, {0, 0, 0, 1 }, {0, 0, 0, 1 }, { 0, 0, 0, 1 } }; + GdkRGBA colors[4] = { GDK_RGBA("000"), GDK_RGBA("000"), GDK_RGBA("000"), GDK_RGBA("000") }; const Declaration declarations[] = { { "outline", parse_rounded_rect, NULL, &outline }, { "widths", parse_float4, NULL, &widths }, @@ -794,7 +794,7 @@ static GskRenderNode * parse_outset_shadow_node (GtkCssParser *parser) { GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); - GdkRGBA color = { 0, 0, 0, 1 }; + GdkRGBA color = GDK_RGBA("000000"); double dx = 1, dy = 1, blur = 0, spread = 0; const Declaration declarations[] = { { "outline", parse_rounded_rect, NULL, &outline }, @@ -1005,7 +1005,7 @@ parse_text_node (GtkCssParser *parser) { PangoFont *font = NULL; graphene_point_t offset = GRAPHENE_POINT_INIT (0, 0); - GdkRGBA color = { 0, 0, 0, 1 }; + GdkRGBA color = GDK_RGBA("000000"); PangoGlyphString *glyphs = NULL; const Declaration declarations[] = { { "font", parse_font, clear_font, &font }, From 1a65a6ce76587fcb0675b72a450316d4149540be Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 18 May 2019 23:06:34 +0200 Subject: [PATCH 08/14] rendernodeparser: Update to new rules Update to the docs outlined in #1887. In particular, the changes do: 1. Require no property, have a working default for everything 2. Be clear about what gets printed and how. Tests ahve been adapted to still pass. --- gsk/gskrendernodeparser.c | 461 ++++++++++-------- testsuite/gsk/nodeparser/crash1.errors | 1 - testsuite/gsk/nodeparser/crash1.ref.node | 6 + testsuite/gsk/nodeparser/crash2.errors | 2 - testsuite/gsk/nodeparser/crash2.ref.node | 10 + testsuite/gsk/nodeparser/crash4.ref.node | 2 +- .../gsk/serializedeserialize/testswitch.node | 63 +-- .../serializedeserialize/widgetfactory.node | 238 +++------ 8 files changed, 348 insertions(+), 435 deletions(-) diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index b6832347c2..8b4c74a601 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -404,9 +404,9 @@ parse_shadows (GtkCssParser *parser, { GArray *shadows = out_shadows; - for (;;) + do { - GskShadow shadow = { {0, 0, 0, 1}, 0, 0, 0 }; + GskShadow shadow = { GDK_RGBA("000000"), 0, 0, 0 }; double dx = 0, dy = 0, radius = 0; if (!gdk_rgba_parser_parse (parser, &shadow.color)) @@ -416,22 +416,21 @@ parse_shadows (GtkCssParser *parser, gtk_css_parser_error_value (parser, "Expected shadow x offset"); if (!gtk_css_parser_consume_number (parser, &dy)) - gtk_css_parser_error_value (parser, "Expected shadow x offset"); + gtk_css_parser_error_value (parser, "Expected shadow y offset"); - if (!gtk_css_parser_consume_number (parser, &radius)) - gtk_css_parser_error_value (parser, "Expected shadow blur radius"); + if (gtk_css_parser_has_number (parser)) + { + if (!gtk_css_parser_consume_number (parser, &radius)) + gtk_css_parser_error_value (parser, "Expected shadow blur radius"); + } shadow.dx = dx; shadow.dy = dy; shadow.radius = radius; g_array_append_val (shadows, shadow); - - if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_COMMA)) - gtk_css_parser_skip (parser); - else - break; } + while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA)); return TRUE; } @@ -483,21 +482,15 @@ parse_blend_mode (GtkCssParser *parser, return FALSE; } -static gboolean -parse_font (GtkCssParser *parser, - gpointer out_font) +static PangoFont * +font_from_string (const char *string) { - const GtkCssToken *token; PangoFontDescription *desc; PangoFontMap *font_map; PangoContext *context; PangoFont *font; - token = gtk_css_parser_get_token (parser); - if (!gtk_css_token_is (token, GTK_CSS_TOKEN_STRING)) - return FALSE; - - desc = pango_font_description_from_string (token->string.string); + desc = pango_font_description_from_string (string); font_map = pango_cairo_font_map_get_default (); context = pango_font_map_create_context (font_map); font = pango_font_map_load_font (font_map, context, desc); @@ -505,10 +498,30 @@ parse_font (GtkCssParser *parser, pango_font_description_free (desc); g_object_unref (context); + return font; +} + +static gboolean +parse_font (GtkCssParser *parser, + gpointer out_font) +{ + PangoFont *font; + char *s; + + s = gtk_css_parser_consume_string (parser); + if (s == NULL) + return FALSE; + + font = font_from_string (s); + if (font == NULL) + { + gtk_css_parser_error_syntax (parser, "This font does not exist."); + return FALSE; + } + *((PangoFont**)out_font) = font; - /* Skip font name token */ - gtk_css_parser_consume_token (parser); + g_free (s); return TRUE; } @@ -523,49 +536,46 @@ static gboolean parse_glyphs (GtkCssParser *parser, gpointer out_glyphs) { - GArray *glyphs; PangoGlyphString *glyph_string; - int i; - - glyphs = g_array_new (FALSE, TRUE, sizeof (double[5])); - - for (;;) - { - double values[5]; - - /* We have 5 numbers per glyph */ - for (i = 0; i < 5; i ++) - { - if (!gtk_css_parser_consume_number (parser, &values[i])) - return FALSE; - } - - g_array_append_val (glyphs, values); - - if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_COMMA)) - gtk_css_parser_skip (parser); - else - break; - } glyph_string = pango_glyph_string_new (); - pango_glyph_string_set_size (glyph_string, glyphs->len); - for (i = 0; i < glyphs->len; i ++) + do { - PangoGlyphInfo g; - double *v = (double *)(glyphs->data + (i * sizeof (double) * 5)); + PangoGlyphInfo gi = { 0, { 0, 0, 0}, { 1 } }; + double d, d2; + int i; - g.glyph = (guint)v[0]; - g.geometry.width = (int)v[1]; - g.geometry.x_offset = (int)v[2]; - g.geometry.y_offset = (int)v[3]; - g.attr.is_cluster_start = (int)v[4]; + if (!gtk_css_parser_consume_integer (parser, &i) || + !gtk_css_parser_consume_number (parser, &d)) + { + pango_glyph_string_free (glyph_string); + return FALSE; + } + gi.glyph = i; + gi.geometry.width = (int) (d * PANGO_SCALE); - glyph_string->glyphs[i] = g; + if (gtk_css_parser_has_number (parser)) + { + if (!gtk_css_parser_consume_number (parser, &d) || + !gtk_css_parser_consume_number (parser, &d2)) + { + pango_glyph_string_free (glyph_string); + return FALSE; + } + gi.geometry.x_offset = (int) (d * PANGO_SCALE); + gi.geometry.y_offset = (int) (d2 * PANGO_SCALE); + + if (gtk_css_parser_try_ident (parser, "same-cluster")) + gi.attr.is_cluster_start = 0; + else + gi.attr.is_cluster_start = 1; + } + + pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1); + glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi; } - - g_array_free (glyphs, TRUE); + while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA)); *((PangoGlyphString **)out_glyphs) = glyph_string; @@ -684,11 +694,17 @@ parse_declarations (GtkCssParser *parser, return parsed; } +static GskRenderNode * +create_default_render_node (void) +{ + return gsk_color_node_new (&GDK_RGBA("FF00CC"), &GRAPHENE_RECT_INIT (0, 0, 50, 50)); +} + static GskRenderNode * parse_color_node (GtkCssParser *parser) { - graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 0, 0); - GdkRGBA color = GDK_RGBA("FF0000"); + graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 50, 50); + GdkRGBA color = GDK_RGBA("FF00CC"); const Declaration declarations[] = { { "bounds", parse_rect, NULL, &bounds }, { "color", parse_color, NULL, &color }, @@ -702,9 +718,9 @@ parse_color_node (GtkCssParser *parser) static GskRenderNode * parse_linear_gradient_node (GtkCssParser *parser) { - graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 0, 0); + graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 50, 50); graphene_point_t start = GRAPHENE_POINT_INIT (0, 0); - graphene_point_t end = GRAPHENE_POINT_INIT (0, 0); + graphene_point_t end = GRAPHENE_POINT_INIT (0, 50); GArray *stops = NULL; const Declaration declarations[] = { { "bounds", parse_rect, NULL, &bounds }, @@ -717,8 +733,12 @@ parse_linear_gradient_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (stops == NULL) { - gtk_css_parser_error_syntax (parser, "No color stops given"); - return 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); } result = gsk_linear_gradient_node_new (&bounds, &start, &end, (GskColorStop *) stops->data, stops->len); @@ -731,7 +751,7 @@ parse_linear_gradient_node (GtkCssParser *parser) static GskRenderNode * parse_inset_shadow_node (GtkCssParser *parser) { - GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); + GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50); GdkRGBA color = GDK_RGBA("000000"); double dx = 1, dy = 1, blur = 0, spread = 0; const Declaration declarations[] = { @@ -751,7 +771,7 @@ parse_inset_shadow_node (GtkCssParser *parser) static GskRenderNode * parse_border_node (GtkCssParser *parser) { - GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); + GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50); float widths[4] = { 1, 1, 1, 1 }; GdkRGBA colors[4] = { GDK_RGBA("000"), GDK_RGBA("000"), GDK_RGBA("000"), GDK_RGBA("000") }; const Declaration declarations[] = { @@ -768,7 +788,7 @@ parse_border_node (GtkCssParser *parser) static GskRenderNode * parse_texture_node (GtkCssParser *parser) { - graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 0, 0); + graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 50, 50); GdkTexture *texture = NULL; const Declaration declarations[] = { { "bounds", parse_rect, NULL, &bounds }, @@ -780,8 +800,21 @@ parse_texture_node (GtkCssParser *parser) if (texture == NULL) { - gtk_css_parser_error_syntax (parser, "Missing \"texture\" property definition"); - return NULL; + static const guint32 pixels[100] = { + 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0, 0, 0, 0, 0, + 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0, 0, 0, 0, 0, + 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0, 0, 0, 0, 0, + 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0, 0, 0, 0, 0, + 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, + 0, 0, 0, 0, 0, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, + 0, 0, 0, 0, 0, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, + 0, 0, 0, 0, 0, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, + 0, 0, 0, 0, 0, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC, 0xFFFF00CC }; + GBytes *bytes = g_bytes_new_static ((guchar *) pixels, 400); + + texture = gdk_memory_texture_new (10, 10, GDK_MEMORY_DEFAULT, bytes, 40); + g_bytes_unref (bytes); } node = gsk_texture_node_new (texture, &bounds); @@ -793,7 +826,7 @@ parse_texture_node (GtkCssParser *parser) static GskRenderNode * parse_outset_shadow_node (GtkCssParser *parser) { - GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); + GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50); GdkRGBA color = GDK_RGBA("000000"); double dx = 1, dy = 1, blur = 0, spread = 0; const Declaration declarations[] = { @@ -823,11 +856,8 @@ parse_transform_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - gsk_transform_unref (transform); - return NULL; - } + child = create_default_render_node (); + /* This is very much cheating, isn't it? */ if (transform == NULL) transform = gsk_transform_new (); @@ -844,7 +874,7 @@ static GskRenderNode * parse_opacity_node (GtkCssParser *parser) { GskRenderNode *child = NULL; - double opacity = 1.0; + double opacity = 0.5; const Declaration declarations[] = { { "opacity", parse_double, NULL, &opacity }, { "child", parse_node, clear_node, &child }, @@ -853,10 +883,7 @@ parse_opacity_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); result = gsk_opacity_node_new (child, opacity); @@ -882,10 +909,7 @@ parse_color_matrix_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); graphene_vec4_init (&offset, offset_rect.origin.x, offset_rect.origin.y, @@ -915,16 +939,10 @@ parse_cross_fade_node (GtkCssParser *parser) GskRenderNode *result; parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); - if (start == NULL || end == NULL) - { - if (start == NULL) - gtk_css_parser_error_syntax (parser, "Missing \"start\" property definition"); - if (end == NULL) - gtk_css_parser_error_syntax (parser, "Missing \"end\" property definition"); - g_clear_pointer (&start, gsk_render_node_unref); - g_clear_pointer (&end, gsk_render_node_unref); - return NULL; - } + if (start == NULL) + start = gsk_color_node_new (&GDK_RGBA("AAFF00"), &GRAPHENE_RECT_INIT (0, 0, 50, 50)); + if (end == NULL) + end = create_default_render_node (); result = gsk_cross_fade_node_new (start, end, progress); @@ -948,16 +966,10 @@ parse_blend_node (GtkCssParser *parser) GskRenderNode *result; parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); - if (bottom == NULL || top == NULL) - { - if (bottom == NULL) - gtk_css_parser_error_syntax (parser, "Missing \"bottom\" property definition"); - if (top == NULL) - gtk_css_parser_error_syntax (parser, "Missing \"top\" property definition"); - g_clear_pointer (&bottom, gsk_render_node_unref); - g_clear_pointer (&top, gsk_render_node_unref); - return NULL; - } + if (bottom == NULL) + bottom = gsk_color_node_new (&GDK_RGBA("AAFF00"), &GRAPHENE_RECT_INIT (0, 0, 50, 50)); + if (top == NULL) + top = create_default_render_node (); result = gsk_blend_node_new (bottom, top, mode); @@ -983,10 +995,7 @@ parse_repeat_node (GtkCssParser *parser) parse_result = parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); if (!(parse_result & (1 << 1))) gsk_render_node_get_bounds (child, &bounds); @@ -1017,7 +1026,13 @@ parse_text_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); - if (!font || !glyphs) + if (font == NULL) + { + font = font_from_string ("Cantarell 11"); + g_assert (font); + } + + if (!glyphs) return NULL; result = gsk_text_node_new (font, glyphs, &color, &offset); @@ -1041,10 +1056,7 @@ parse_blur_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); result = gsk_blur_node_new (child, blur_radius); @@ -1056,32 +1068,7 @@ parse_blur_node (GtkCssParser *parser) static GskRenderNode * parse_clip_node (GtkCssParser *parser) { - graphene_rect_t clip = GRAPHENE_RECT_INIT (0, 0, 0, 0); - GskRenderNode *child = NULL; - const Declaration declarations[] = { - { "clip", parse_rect, NULL, &clip }, - { "child", parse_node, clear_node, &child }, - }; - GskRenderNode *result; - - parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); - if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } - - result = gsk_clip_node_new (child, &clip); - - gsk_render_node_unref (child); - - return result; -} - -static GskRenderNode * -parse_rounded_clip_node (GtkCssParser *parser) -{ - GskRoundedRect clip = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); + GskRoundedRect clip = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50); GskRenderNode *child = NULL; const Declaration declarations[] = { { "clip", parse_rounded_rect, NULL, &clip }, @@ -1091,10 +1078,32 @@ parse_rounded_clip_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); + + if (gsk_rounded_rect_is_rectilinear (&clip)) + result = gsk_clip_node_new (child, &clip.bounds); + else + result = gsk_rounded_clip_node_new (child, &clip); + + gsk_render_node_unref (child); + + return result; +} + +static GskRenderNode * +parse_rounded_clip_node (GtkCssParser *parser) +{ + GskRoundedRect clip = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50); + GskRenderNode *child = NULL; + const Declaration declarations[] = { + { "clip", parse_rounded_rect, NULL, &clip }, + { "child", parse_node, clear_node, &child }, + }; + GskRenderNode *result; + + parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); + if (child == NULL) + child = create_default_render_node (); result = gsk_rounded_clip_node_new (child, &clip); @@ -1116,15 +1125,12 @@ parse_shadow_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); if (shadows->len == 0) { - gtk_css_parser_error_syntax (parser, "Need at least one shadow"); - return child; + GskShadow default_shadow = { GDK_RGBA("000000"), 1, 1, 0 }; + g_array_append_val (shadows, default_shadow); } result = gsk_shadow_node_new (child, (GskShadow *)shadows->data, shadows->len); @@ -1148,10 +1154,7 @@ parse_debug_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); if (child == NULL) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); result = gsk_debug_node_new (child, message); @@ -1441,8 +1444,13 @@ append_vec4 (GString *str, static void append_float_param (Printer *p, const char *param_name, - float value) + float value, + float default_value) { + /* Don't approximate-compare here, better be topo verbose */ + if (value == default_value) + return; + _indent (p); g_string_append_printf (p->str, "%s: ", param_name); string_append_double (p->str, value); @@ -1599,7 +1607,7 @@ render_node_print (Printer *p, start_node (p, "cross-fade"); append_node_param (p, "end", gsk_cross_fade_node_get_end_child (node)); - append_float_param (p, "progress", gsk_cross_fade_node_get_progress (node)); + append_float_param (p, "progress", gsk_cross_fade_node_get_progress (node), 0.5f); append_node_param (p, "start", gsk_cross_fade_node_get_start_child (node)); end_node (p); @@ -1609,7 +1617,7 @@ render_node_print (Printer *p, case GSK_LINEAR_GRADIENT_NODE: { const guint n_stops = gsk_linear_gradient_node_get_n_color_stops (node); - const GskColorStop *stop; + const GskColorStop *stops = gsk_linear_gradient_node_peek_color_stops (node); int i; start_node (p, "linear-gradient"); @@ -1619,23 +1627,16 @@ render_node_print (Printer *p, append_point_param (p, "start", gsk_linear_gradient_node_peek_start (node)); _indent (p); - g_string_append (p->str, "stops:"); - for (i = 0; i < n_stops - 1; i ++) + g_string_append (p->str, "stops: "); + for (i = 0; i < n_stops; i ++) { - stop = gsk_linear_gradient_node_peek_color_stops (node) + i; + if (i > 0) + g_string_append (p->str, ", "); + string_append_double (p->str, stops[i].offset); g_string_append_c (p->str, ' '); - string_append_double (p->str, stop->offset); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &stop->color); - g_string_append_c (p->str, ','); + append_rgba (p->str, &stops[i].color); } - - /* Last one, no comma */ - stop = gsk_linear_gradient_node_peek_color_stops (node) + n_stops - 1; - string_append_double (p->str, stop->offset); - g_string_append_c (p->str, ' '); - append_rgba (p->str, &stop->color); g_string_append (p->str, ";\n"); end_node (p); @@ -1647,7 +1648,7 @@ render_node_print (Printer *p, start_node (p, "opacity"); append_node_param (p, "child", gsk_opacity_node_get_child (node)); - append_float_param (p, "opacity", gsk_opacity_node_get_opacity (node)); + append_float_param (p, "opacity", gsk_opacity_node_get_opacity (node), 0.5f); end_node (p); } @@ -1655,14 +1656,17 @@ render_node_print (Printer *p, case GSK_OUTSET_SHADOW_NODE: { + const GdkRGBA *color = gsk_outset_shadow_node_peek_color (node); + start_node (p, "outset-shadow"); - append_float_param (p, "blur", gsk_outset_shadow_node_get_blur_radius (node)); - append_rgba_param (p, "color", gsk_outset_shadow_node_peek_color (node)); - append_float_param (p, "dx", gsk_outset_shadow_node_get_dx (node)); - append_float_param (p, "dy", gsk_outset_shadow_node_get_dy (node)); + append_float_param (p, "blur", gsk_outset_shadow_node_get_blur_radius (node), 0.0f); + if (!gdk_rgba_equal (color, &GDK_RGBA("000"))) + append_rgba_param (p, "color", color); + append_float_param (p, "dx", gsk_outset_shadow_node_get_dx (node), 1.0f); + append_float_param (p, "dy", gsk_outset_shadow_node_get_dy (node), 1.0f); append_rounded_rect_param (p, "outline", gsk_outset_shadow_node_peek_outline (node)); - append_float_param (p, "spread", gsk_outset_shadow_node_get_spread (node)); + append_float_param (p, "spread", gsk_outset_shadow_node_get_spread (node), 0.0f); end_node (p); } @@ -1693,10 +1697,12 @@ render_node_print (Printer *p, case GSK_TRANSFORM_NODE: { + GskTransform *transform = gsk_transform_node_get_transform (node); start_node (p, "transform"); append_node_param (p, "child", gsk_transform_node_get_child (node)); - append_transform_param (p, "transform", gsk_transform_node_get_transform (node)); + if (gsk_transform_get_category (transform) != GSK_TRANSFORM_CATEGORY_IDENTITY) + append_transform_param (p, "transform", transform); end_node (p); } @@ -1707,8 +1713,10 @@ render_node_print (Printer *p, start_node (p, "color-matrix"); append_node_param (p, "child", gsk_color_matrix_node_get_child (node)); - append_matrix_param (p, "matrix", gsk_color_matrix_node_peek_color_matrix (node)); - append_vec4_param (p, "offset", gsk_color_matrix_node_peek_color_offset (node)); + if (!graphene_matrix_is_identity (gsk_color_matrix_node_peek_color_matrix (node))) + append_matrix_param (p, "matrix", gsk_color_matrix_node_peek_color_matrix (node)); + if (!graphene_vec4_equal (gsk_color_matrix_node_peek_color_offset (node), graphene_vec4_zero ())) + append_vec4_param (p, "offset", gsk_color_matrix_node_peek_color_offset (node)); end_node (p); } @@ -1727,8 +1735,10 @@ render_node_print (Printer *p, n = 3; else if (!gdk_rgba_equal (&colors[1], &colors[0])) n = 2; - else + else if (!gdk_rgba_equal (&colors[0], &GDK_RGBA("000000"))) n = 1; + else + n = 0; if (n > 0) { @@ -1751,8 +1761,10 @@ render_node_print (Printer *p, n = 3; else if (widths[1] != widths[0]) n = 2; - else + else if (widths[0] != 1.0) n = 1; + else + n = 0; if (n > 0) { @@ -1778,26 +1790,29 @@ render_node_print (Printer *p, start_node (p, "shadow"); - _indent (p); append_node_param (p, "child", gsk_shadow_node_get_child (node)); + _indent (p); g_string_append (p->str, "shadows: "); for (i = 0; i < n_shadows; i ++) { const GskShadow *s = gsk_shadow_node_peek_shadow (node, i); char *color; + if (i > 0) + g_string_append (p->str, ", "); + color = gdk_rgba_to_string (&s->color); g_string_append (p->str, color); g_string_append_c (p->str, ' '); string_append_double (p->str, s->dx); g_string_append_c (p->str, ' '); string_append_double (p->str, s->dy); - g_string_append_c (p->str, ' '); - string_append_double (p->str, s->radius); - - if (i < n_shadows - 1) - g_string_append (p->str, ", "); + if (s->radius > 0) + { + g_string_append_c (p->str, ' '); + string_append_double (p->str, s->radius); + } g_free (color); } @@ -1811,14 +1826,16 @@ render_node_print (Printer *p, case GSK_INSET_SHADOW_NODE: { + const GdkRGBA *color = gsk_inset_shadow_node_peek_color (node); start_node (p, "inset-shadow"); - append_float_param (p, "blur", gsk_inset_shadow_node_get_blur_radius (node)); - append_rgba_param (p, "color", gsk_inset_shadow_node_peek_color (node)); - append_float_param (p, "dx", gsk_inset_shadow_node_get_dx (node)); - append_float_param (p, "dy", gsk_inset_shadow_node_get_dy (node)); + append_float_param (p, "blur", gsk_inset_shadow_node_get_blur_radius (node), 0.0f); + if (!gdk_rgba_equal (color, &GDK_RGBA("000"))) + append_rgba_param (p, "color", color); + append_float_param (p, "dx", gsk_inset_shadow_node_get_dx (node), 1.0f); + append_float_param (p, "dy", gsk_inset_shadow_node_get_dy (node), 1.0f); append_rounded_rect_param (p, "outline", gsk_inset_shadow_node_peek_outline (node)); - append_float_param (p, "spread", gsk_inset_shadow_node_get_spread (node)); + append_float_param (p, "spread", gsk_inset_shadow_node_get_spread (node), 0.0f); end_node (p); } @@ -1852,14 +1869,16 @@ render_node_print (Printer *p, case GSK_TEXT_NODE: { const guint n_glyphs = gsk_text_node_get_num_glyphs (node); - const PangoGlyphInfo *glyph; + const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node); const graphene_point_t *offset = gsk_text_node_get_offset (node); + const GdkRGBA *color = gsk_text_node_peek_color (node); PangoFontDescription *desc; char *font_name; guint i; start_node (p, "text"); - append_rgba_param (p, "color", gsk_text_node_peek_color (node)); + if (!gdk_rgba_equal (color, &GDK_RGBA("000000"))) + append_rgba_param (p, "color", color); _indent (p); desc = pango_font_describe ((PangoFont *)gsk_text_node_peek_font (node));; @@ -1870,18 +1889,23 @@ render_node_print (Printer *p, _indent (p); g_string_append (p->str, "glyphs: "); - glyph = gsk_text_node_peek_glyphs (node); - g_string_append_printf (p->str, "%u %i %i %i %i", - glyph->glyph, glyph->geometry.width, - glyph->geometry.x_offset, glyph->geometry.y_offset, - glyph->attr.is_cluster_start); - for (i = 1; i < n_glyphs; i ++) + for (i = 0; i < n_glyphs; i++) { - glyph = gsk_text_node_peek_glyphs (node) + i; - g_string_append_printf (p->str, ", %u %i %i %i %i", - glyph->glyph, glyph->geometry.width, - glyph->geometry.x_offset, glyph->geometry.y_offset, - glyph->attr.is_cluster_start); + if (i > 0) + g_string_append (p->str, ", "); + g_string_append_printf (p->str, "%u %g", + glyphs[i].glyph, + (double) glyphs[i].geometry.width / PANGO_SCALE); + if (!glyphs[i].attr.is_cluster_start || + glyphs[i].geometry.x_offset != 0 || + glyphs[i].geometry.y_offset != 0) + { + g_string_append_printf (p->str, "%g %g", + (double) glyphs[i].geometry.x_offset / PANGO_SCALE, + (double) glyphs[i].geometry.y_offset / PANGO_SCALE); + if (!glyphs[i].attr.is_cluster_start) + g_string_append (p->str, " same-cluster"); + } } g_string_append_c (p->str, ';'); g_string_append_c (p->str, '\n'); @@ -1895,12 +1919,17 @@ render_node_print (Printer *p, case GSK_DEBUG_NODE: { + const char *message = gsk_debug_node_get_message (node); + start_node (p, "debug"); - _indent (p); append_node_param (p, "child", gsk_debug_node_get_child (node)); /* TODO: We potentially need to escape certain characters in the message */ - g_string_append_printf (p->str, "message: \"%s\";\n", gsk_debug_node_get_message (node)); + if (message) + { + _indent (p); + g_string_append_printf (p->str, "message: \"%s\";\n", message); + } end_node (p); } @@ -1910,7 +1939,7 @@ render_node_print (Printer *p, { start_node (p, "blur"); - append_float_param (p, "blur", gsk_blur_node_get_radius (node)); + append_float_param (p, "blur", gsk_blur_node_get_radius (node), 1.0f); append_node_param (p, "child", gsk_blur_node_get_child (node)); end_node (p); @@ -1919,11 +1948,16 @@ render_node_print (Printer *p, case GSK_REPEAT_NODE: { + GskRenderNode *child = gsk_repeat_node_get_child (node); + const graphene_rect_t *child_bounds = gsk_repeat_node_peek_child_bounds (node); + start_node (p, "repeat"); - append_rect_param (p, "bounds", &node->bounds); + if (!graphene_rect_equal (&node->bounds, &child->bounds)) + append_rect_param (p, "bounds", &node->bounds); append_node_param (p, "child", gsk_repeat_node_get_child (node)); - append_rect_param (p, "child-bounds", gsk_repeat_node_peek_child_bounds (node)); + if (!graphene_rect_equal (child_bounds, &child->bounds)) + append_rect_param (p, "child-bounds", child_bounds); end_node (p); } @@ -1938,13 +1972,16 @@ render_node_print (Printer *p, append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node)); - _indent (p); - for (i = 0; i < G_N_ELEMENTS (blend_modes); i++) + if (mode != GSK_BLEND_MODE_DEFAULT) { - if (blend_modes[i].mode == mode) + _indent (p); + for (i = 0; i < G_N_ELEMENTS (blend_modes); i++) { - g_string_append_printf (p->str, "mode: %s;\n", blend_modes[i].name); - break; + if (blend_modes[i].mode == mode) + { + g_string_append_printf (p->str, "mode: %s;\n", blend_modes[i].name); + break; + } } } append_node_param (p, "top", gsk_blend_node_get_top_child (node)); diff --git a/testsuite/gsk/nodeparser/crash1.errors b/testsuite/gsk/nodeparser/crash1.errors index 9e36437262..b47b8c75f0 100644 --- a/testsuite/gsk/nodeparser/crash1.errors +++ b/testsuite/gsk/nodeparser/crash1.errors @@ -1,4 +1,3 @@ :2:9-10: error: GTK_CSS_PARSER_ERROR_SYNTAX :2:17-3:1: error: GTK_CSS_PARSER_WARNING_SYNTAX -:3:1: error: GTK_CSS_PARSER_ERROR_SYNTAX :1:1-3:1: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/crash1.ref.node b/testsuite/gsk/nodeparser/crash1.ref.node index e69de29bb2..a02df0f9e8 100644 --- a/testsuite/gsk/nodeparser/crash1.ref.node +++ b/testsuite/gsk/nodeparser/crash1.ref.node @@ -0,0 +1,6 @@ +opacity { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/crash2.errors b/testsuite/gsk/nodeparser/crash2.errors index 540ad3c099..91bb427e87 100644 --- a/testsuite/gsk/nodeparser/crash2.errors +++ b/testsuite/gsk/nodeparser/crash2.errors @@ -1,5 +1,3 @@ :2:3-7: error: GTK_CSS_PARSER_ERROR_SYNTAX :2:15-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX -:4:1: error: GTK_CSS_PARSER_ERROR_SYNTAX -:4:1: error: GTK_CSS_PARSER_ERROR_SYNTAX :1:1-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/crash2.ref.node b/testsuite/gsk/nodeparser/crash2.ref.node index e69de29bb2..76ab4d6943 100644 --- a/testsuite/gsk/nodeparser/crash2.ref.node +++ b/testsuite/gsk/nodeparser/crash2.ref.node @@ -0,0 +1,10 @@ +cross-fade { + end: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } + start: color { + bounds: 0 0 50 50; + color: rgb(170,255,0); + } +} diff --git a/testsuite/gsk/nodeparser/crash4.ref.node b/testsuite/gsk/nodeparser/crash4.ref.node index e85e6e5eca..e9b8985745 100644 --- a/testsuite/gsk/nodeparser/crash4.ref.node +++ b/testsuite/gsk/nodeparser/crash4.ref.node @@ -2,6 +2,6 @@ blur { blur: 40; child: color { bounds: 100 100 100 100; - color: rgb(0,0,0); + color: rgb(255,0,204); } } diff --git a/testsuite/gsk/serializedeserialize/testswitch.node b/testsuite/gsk/serializedeserialize/testswitch.node index 8f9d614786..eb529b703b 100644 --- a/testsuite/gsk/serializedeserialize/testswitch.node +++ b/testsuite/gsk/serializedeserialize/testswitch.node @@ -18,48 +18,38 @@ transform { border { colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1; } container { container { outset-shadow { - blur: 0; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; outline: -1 -1 26 26 / 13; - spread: 0; } outset-shadow { blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; outline: -1 -1 26 26 / 13; - spread: 0; } rounded-clip { child: linear-gradient { bounds: 0 0 24 24; end: 12 24; start: 12 0; - stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); + stops: 0.2 rgb(255,255,255), 0.9 rgb(246,245,244); } clip: -1 -1 26 26 / 13; } inset-shadow { - blur: 0; color: rgb(255,255,255); dx: 0; - dy: 1; outline: 0 0 24 24 / 12; - spread: 0; } } border { colors: rgb(191,184,177); outline: -1 -1 26 26 / 13; - widths: 1; } } } @@ -69,7 +59,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; + glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8; offset: 145 18; } transform: translate(56, 0); @@ -89,26 +79,20 @@ transform { border { colors: rgb(24,95,180); outline: -1 -1 50 26 / 13; - widths: 1; } transform { child: container { container { outset-shadow { - blur: 0; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; outline: -1 -1 26 26 / 13; - spread: 0; } outset-shadow { blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; outline: -1 -1 26 26 / 13; - spread: 0; } rounded-clip { child: cross-fade { @@ -116,7 +100,7 @@ transform { bounds: 0 0 24 24; end: 12 24; start: 12 0; - stops: 0.1 rgb(255,255,255),0.9 rgb(255,255,255); + stops: 0.1 rgb(255,255,255), 0.9 rgb(255,255,255); } progress: 0.756154; start: cross-fade { @@ -124,7 +108,7 @@ transform { bounds: 0 0 24 24; end: 12 24; start: 12 0; - stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); + stops: 0.2 rgb(255,255,255), 0.9 rgb(246,245,244); } progress: 0.788575; start: color { @@ -136,18 +120,14 @@ transform { clip: -1 -1 26 26 / 13; } inset-shadow { - blur: 0; color: rgb(255,255,255); dx: 0; - dy: 1; outline: 0 0 24 24 / 12; - spread: 0; } } border { colors: rgb(24,95,180); outline: -1 -1 26 26 / 13; - widths: 1; } } transform: translate(24, 0); @@ -159,7 +139,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; + glyphs: 45 9, 360 8, 244 8, 272 8, 349 4, 287 8, 280 8; offset: 147 18; } transform: translate(56, 0); @@ -181,7 +161,6 @@ transform { border { colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1; } container { rounded-clip { @@ -194,7 +173,6 @@ transform { border { colors: rgb(205,199,194); outline: -1 -1 26 26 / 13; - widths: 1; } } } @@ -204,7 +182,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; + glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8; offset: 145 18; } transform: translate(56, 0); @@ -226,7 +204,6 @@ transform { border { colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1; } transform { child: container { @@ -240,7 +217,6 @@ transform { border { colors: rgb(205,199,194); outline: -1 -1 26 26 / 13; - widths: 1; } } transform: translate(24, 0); @@ -252,7 +228,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 45 9216 0 0 1, 360 8192 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; + glyphs: 45 9, 360 8, 244 8, 272 8, 349 4, 287 8, 280 8; offset: 147 18; } transform: translate(56, 0); @@ -274,48 +250,38 @@ transform { border { colors: rgb(205,199,194); outline: -1 -1 50 26 / 13; - widths: 1; } container { container { outset-shadow { - blur: 0; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; outline: -1 -1 26 26 / 13; - spread: 0; } outset-shadow { blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; outline: -1 -1 26 26 / 13; - spread: 0; } rounded-clip { child: linear-gradient { bounds: 0 0 24 24; end: 12 24; start: 12 0; - stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); + stops: 0.2 rgb(255,255,255), 0.9 rgb(246,245,244); } clip: -1 -1 26 26 / 13; } inset-shadow { - blur: 0; color: rgb(255,255,255); dx: 0; - dy: 1; outline: 0 0 24 24 / 12; - spread: 0; } } border { colors: rgb(191,184,177); outline: -1 -1 26 26 / 13; - widths: 1; } } } @@ -325,7 +291,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 37 11264 0 0 1, 324 4096 0 0 1, 417 7168 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1; + glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8; offset: 123 18; } transform: translate(78, 0); @@ -335,40 +301,31 @@ transform { child: container { container { outset-shadow { - blur: 0; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; outline: -1 -1 16 16 / 3; - spread: 0; } outset-shadow { blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; outline: -1 -1 16 16 / 3; - spread: 0; } linear-gradient { bounds: 0 0 14 14; end: 7 14; start: 7 0; - stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); + stops: 0.2 rgb(255,255,255), 0.9 rgb(246,245,244); } inset-shadow { - blur: 0; color: rgb(255,255,255); dx: 0; - dy: 1; outline: 0 0 14 14 / 2; - spread: 0; } } border { colors: rgb(191,184,177); outline: -1 -1 16 16 / 3; - widths: 1; } } transform: translate(1, 6); diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node b/testsuite/gsk/serializedeserialize/widgetfactory.node index ff00fb1f89..a8b36b42e2 100644 --- a/testsuite/gsk/serializedeserialize/widgetfactory.node +++ b/testsuite/gsk/serializedeserialize/widgetfactory.node @@ -10,7 +10,6 @@ transform { spread: 2; } outset-shadow { - blur: 0; color: rgba(0,0,0,0.18); dx: 0; dy: 0; @@ -30,7 +29,7 @@ transform { bounds: -6 0 1464 46; end: -6 23; start: 1458 23; - stops: 0.08 rgb(227,234,242),0.25 rgb(246,245,244); + stops: 0.08 rgb(227,234,242), 0.25 rgb(246,245,244); } clip: -6 0 1464 47 / 7 7 0 0; } @@ -46,12 +45,9 @@ transform { clip: -6 0 1464 47 / 7 7 0 0; } inset-shadow { - blur: 0; color: rgba(255,255,255,0.8); dx: 0; - dy: 1; outline: -6 0 1464 46 / 7 7 0 0; - spread: 0; } } border { @@ -79,7 +75,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; + glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 678 7; offset: 0 17; } transform: translate(28, 0); @@ -102,7 +98,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 679 8; offset: 0 17; } transform: translate(28, 0); @@ -122,13 +118,12 @@ transform { border { colors: rgb(213,208,204); outline: -17 -5 134 34 / 0 5 5 0; - widths: 1; } transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 162 9216 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; + glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 680 8; offset: 0 17; } transform: translate(28, 0); @@ -151,7 +146,6 @@ transform { border { colors: rgb(213,208,204); outline: -6 -5 36 34 / 5; - widths: 1; } color-matrix { child: texture { @@ -205,7 +199,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; + glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 5, 409 6, 473 7; offset: 0 21; } clip { @@ -217,7 +211,7 @@ transform { text { color: rgb(252,252,252); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; + glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 5, 409 6, 473 7; offset: 0 21; } } @@ -241,7 +235,6 @@ transform { border { colors: rgb(213,208,204) rgb(213,208,204) rgb(213,208,204) rgb(53,132,228); outline: -10 -5 36 34 / 0 5 5 0; - widths: 1; } color-matrix { child: texture { @@ -275,7 +268,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 370 8192 0 0 1, 472 7168 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; + glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 5, 409 6, 473 7; offset: 0 21; } clip: 0 0 357 32; @@ -295,7 +288,6 @@ transform { border { colors: rgb(213,208,204); outline: -10 -5 36 34 / 0 5 5 0; - widths: 1; } color-matrix { child: texture { @@ -323,14 +315,13 @@ transform { border { colors: rgb(213,208,204); outline: -9 -1 410 34 / 5; - widths: 1; } clip { child: opacity { child: text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 30 10240 0 0 1, 349 4096 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 862 3072 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 862 3072 0 0 1, 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 358 13312 0 0 1, 370 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1; + glyphs: 30 10, 349 4, 324 4, 273 7, 345 7, 862 3, 324 4, 273 7, 370 8, 360 8, 862 3, 430 5, 370 8, 862 3, 273 7, 319 8, 244 8, 360 8, 312 8, 287 8, 862 3, 358 13, 370 8, 280 8, 287 8; offset: 0 21; } opacity: 0.54902; @@ -363,13 +354,12 @@ transform { border { colors: rgb(213,208,204); outline: -9 -1 410 34 / 5; - widths: 1; } clip { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; + glyphs: 287 8, 360 8, 430 5, 409 6, 473 7; offset: 0 21; } clip: 0 0 392 32; @@ -397,7 +387,7 @@ transform { child: text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 287 8192 0 0 1, 360 8192 0 0 1, 430 5120 0 0 1, 409 6144 0 0 1, 473 7168 0 0 1; + glyphs: 287 8, 360 8, 430 5, 409 6, 473 7; offset: 0 22; } clip: 0 0 357 33; @@ -417,7 +407,6 @@ transform { border { colors: rgb(213,208,204); outline: -6 -5 36 35 / 0 5 5 0; - widths: 1; } color-matrix { child: texture { @@ -453,7 +442,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 103 8192 0 0 1, 287 8192 0 0 1, 311 5120 0 0 1, 430 5120 0 0 1; + glyphs: 103 8, 287 8, 311 5, 430 5; offset: 2 17; } transform { @@ -487,7 +476,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 113 13312 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 280 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; + glyphs: 113 13, 324 4, 280 8, 280 8, 349 4, 287 8; offset: 2 17; } transform { @@ -520,13 +509,12 @@ transform { border { colors: rgb(213,208,204); outline: -10 -5 137 34 / 0 5 5 0; - widths: 1; } container { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 165 9216 0 0 1, 324 4096 0 0 1, 312 8192 0 0 1, 319 8192 0 0 1, 430 5120 0 0 1; + glyphs: 165 9, 324 4, 312 8, 319 8, 430 5; offset: 2 17; } transform { @@ -554,14 +542,14 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; + glyphs: 349 4, 244 8, 272 8, 287 8, 349 4; offset: 0 22; } transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 349 4096 0 0 1, 244 8192 0 0 1, 272 8192 0 0 1, 287 8192 0 0 1, 349 4096 0 0 1; + glyphs: 349 4, 244 8, 272 8, 287 8, 349 4; offset: 0 22; } transform: translate(52, 0); @@ -578,14 +566,13 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 112 34 / 5; - widths: 1; } container { transform { child: text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 682 8192 0 0 1, 677 9216 0 0 1; + glyphs: 682 8, 677 9; offset: 0 15; } transform: translate(6, 6); @@ -642,14 +629,13 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 112 34 / 5; - widths: 1; } container { transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 677 9216 0 0 1; + glyphs: 677 9; offset: 0 15; } transform: translate(6, 6); @@ -721,7 +707,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1; } color-matrix { child: texture { @@ -738,7 +723,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -757,7 +742,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1; } } transform: translate(5, 2); @@ -766,7 +750,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -785,7 +769,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1; } color-matrix { child: texture { @@ -802,7 +785,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -821,7 +804,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1; } color-matrix { child: texture { @@ -838,7 +820,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -857,7 +839,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1; } } transform: translate(5, 2); @@ -866,7 +847,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -885,7 +866,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 3; - widths: 1; } color-matrix { child: texture { @@ -902,7 +882,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 287 8192 0 0 1, 273 7168 0 0 1, 345 7168 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -924,7 +904,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1; } } transform: translate(5, 2); @@ -933,7 +912,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -955,7 +934,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1; } } transform: translate(5, 2); @@ -964,7 +942,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -986,7 +964,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1; } color-matrix { child: texture { @@ -1003,7 +980,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -1025,7 +1002,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1; } color-matrix { child: texture { @@ -1042,7 +1018,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -1064,7 +1040,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1; } } transform: translate(5, 2); @@ -1073,7 +1048,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -1095,7 +1070,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 16 16 / 8; - widths: 1; } color-matrix { child: texture { @@ -1112,7 +1086,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 409 6144 0 0 1, 244 8192 0 0 1, 280 8192 0 0 1, 324 4096 0 0 1, 370 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 0 15; } transform: translate(24, 0); @@ -1176,12 +1150,11 @@ transform { border { colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1; } text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 2 17; } } @@ -1199,12 +1172,11 @@ transform { border { colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1; } text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 2 17; } } @@ -1222,12 +1194,11 @@ transform { border { colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1; } text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 2 17; } } @@ -1245,12 +1216,11 @@ transform { border { colors: rgb(213,208,204); outline: -17 -5 122 34 / 5; - widths: 1; } text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 430 5120 0 0 1, 370 8192 0 0 1, 312 8192 0 0 1, 312 8192 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 2 17; } } @@ -1269,13 +1239,12 @@ transform { border { colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1; } container { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; + glyphs: 1 10, 360 8, 280 8, 409 6, 287 8, 244 8; offset: 2 17; } transform { @@ -1308,13 +1277,12 @@ transform { border { colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1; } container { text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; + glyphs: 126 11, 430 5, 430 5, 370 8; offset: 2 17; } transform { @@ -1347,13 +1315,12 @@ transform { border { colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1; } container { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 173 9216 0 0 1, 244 8192 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 862 3072 0 0 1, 165 9216 0 0 1, 287 8192 0 0 1, 312 8192 0 0 1, 438 8192 0 0 1, 349 4096 0 0 1, 244 8192 0 0 1, 409 6144 0 0 1; + glyphs: 173 9, 244 8, 360 8, 417 7, 862 3, 165 9, 287 8, 312 8, 438 8, 349 4, 244 8, 409 6; offset: 0 17; } transform { @@ -1361,7 +1328,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 678 7168 0 0 1, 679 8192 0 0 1; + glyphs: 678 7, 679 8; offset: 0 17; } transform: translate(1, 0); @@ -1387,7 +1354,6 @@ transform { border { colors: rgb(213,208,204); outline: -5 -5 122 34 / 5; - widths: 1; } container { color { @@ -1398,7 +1364,6 @@ transform { child: border { colors: rgba(0,0,0,0.3); outline: -1 -1 112 24; - widths: 1; } transform: translate(1, 1); } @@ -1421,14 +1386,13 @@ transform { border { colors: rgb(213,208,204); outline: -10 -5 122 34 / 5; - widths: 1; } container { transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 822 4096 0 0 1, 115 11264 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1, 287 8192 0 0 1, 823 4096 0 0 1; + glyphs: 822 4, 115 11, 370 8, 360 8, 287 8, 823 4; offset: 0 17; } transform: translate(16, 0); @@ -1455,7 +1419,7 @@ transform { text { color: rgb(53,132,228); font: "Cantarell 11"; - glyphs: 349 4096 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1, 345 7168 0 0 1, 862 3072 0 0 1, 272 8192 0 0 1, 438 8192 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 349 4, 324 4, 360 8, 345 7, 862 3, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; offset: 10 17; } color { @@ -1477,7 +1441,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 50 26 / 13; - widths: 1; } container { rounded-clip { @@ -1490,7 +1453,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 26 26 / 13; - widths: 1; } } } @@ -1508,7 +1470,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 50 26 / 13; - widths: 1; } container { rounded-clip { @@ -1521,7 +1482,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 26 26 / 13; - widths: 1; } } } @@ -1552,7 +1512,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 502 4 / 2; - widths: 1; } transform { child: container { @@ -1566,7 +1525,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 252 4 / 2 1.5 1.5 2; - widths: 1; } } transform: translate(0, -1) translate(0, 1); @@ -1587,7 +1545,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 502 4 / 2; - widths: 1; } transform { child: container { @@ -1601,7 +1558,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 252 4 / 1.5 2 2 1.5; - widths: 1; } } transform: translate(250, -1) translate(0, 1); @@ -1617,7 +1573,7 @@ transform { child: text { color: rgba(46,52,54,0.4); font: "Cantarell 9.1669921875"; - glyphs: 682 7168 0 0 1, 677 8192 0 0 1, 859 1024 0 0 1, 919 12288 0 0 1; + glyphs: 682 7, 677 8, 859 1, 919 12; offset: 0 13; } transform: translate(237, 0); @@ -1634,7 +1590,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 502 4 / 2; - widths: 1; } transform { child: container { @@ -1648,7 +1603,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 102 4 / 1.5; - widths: 1; } } transform: translate(43, -1) translate(0, 1); @@ -1672,13 +1626,11 @@ transform { border { colors: rgb(213,208,204); outline: -3 -3 502 9 / 3; - widths: 1; } transform { child: border { colors: rgba(146,149,149,0.15); outline: -1 -1 496 3 / 1; - widths: 1; } transform: translate(1, 1); } @@ -1694,7 +1646,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 297 3 / 1; - widths: 1; } } transform: translate(1, 1); @@ -1717,7 +1668,6 @@ transform { border { colors: rgb(213,208,204); outline: -3 -3 502 9 / 3; - widths: 1; } transform { child: container { @@ -1731,7 +1681,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 97 3 / 1; - widths: 1; } } transform: translate(2, 1); @@ -1748,7 +1697,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 97 3 / 1; - widths: 1; } } transform: translate(99, 0) translate(2, 1); @@ -1757,7 +1705,6 @@ transform { child: border { colors: rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; - widths: 1; } transform: translate(198, 0) translate(2, 1); } @@ -1765,7 +1712,6 @@ transform { child: border { colors: rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; - widths: 1; } transform: translate(297, 0) translate(2, 1); } @@ -1773,7 +1719,6 @@ transform { child: border { colors: rgba(146,149,149,0.15); outline: -1 -1 97 3 / 1; - widths: 1; } transform: translate(396, 0) translate(2, 1); } @@ -1798,7 +1743,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 478 4 / 2; - widths: 1; } container { rounded-clip { @@ -1811,7 +1755,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 237 4 / 2; - widths: 1; } } transform { @@ -1826,7 +1769,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1; } } transform: translate(234, 0) translate(-8, -8); @@ -1849,7 +1791,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 478 4 / 2; - widths: 1; } transform { child: container { @@ -1863,7 +1804,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1; } } transform: translate(234, 0) translate(-8, -8); @@ -1930,7 +1870,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 478 4 / 2; - widths: 1; } transform { child: texture { @@ -1961,7 +1900,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 4 362 / 2; - widths: 1; } transform { child: container { @@ -1975,7 +1913,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 4 182 / 2 2 1.5 1.5; - widths: 1; } } transform: translate(-1, 0) translate(1, 0); @@ -1998,7 +1935,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 4 362 / 2; - widths: 1; } transform { child: container { @@ -2012,7 +1948,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 4 182 / 1.5 1.5 2 2; - widths: 1; } } transform: translate(-1, 180) translate(1, 0); @@ -2030,7 +1965,7 @@ transform { text { color: rgba(146,149,149,0.55); font: "Cantarell 11"; - glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; + glyphs: 682 8, 677 9, 805 4, 677 9; offset: 26 15; } transform { @@ -2045,7 +1980,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 4 310 / 2; - widths: 1; } container { rounded-clip { @@ -2058,7 +1992,6 @@ transform { border { colors: rgb(53,132,228); outline: -1 -1 4 154 / 2; - widths: 1; } } transform { @@ -2073,7 +2006,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1; } } transform: translate(0, 151) translate(-8, -8); @@ -2089,7 +2021,7 @@ transform { text { color: rgba(146,149,149,0.55); font: "Cantarell 11"; - glyphs: 682 8192 0 0 1, 677 9216 0 0 1, 805 4096 0 0 1, 677 9216 0 0 1; + glyphs: 682 8, 677 9, 805 4, 677 9; offset: 26 15; } transform { @@ -2104,7 +2036,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 4 310 / 2; - widths: 1; } transform { child: container { @@ -2118,7 +2049,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 20 20 / 10; - widths: 1; } } transform: translate(0, 151) translate(-8, -8); @@ -2152,12 +2082,11 @@ transform { border { colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -1 -1 114 135; - widths: 1; } text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 81 4096 0 0 1, 360 8192 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; + glyphs: 81 4, 360 8, 417 7, 287 8, 430 6; offset: 0 15; } } @@ -2168,12 +2097,11 @@ transform { border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -1 -1 114 135; - widths: 1; } text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 126 11264 0 0 1, 438 8192 0 0 1, 430 6144 0 0 1, 417 7168 0 0 1, 287 8192 0 0 1, 430 6144 0 0 1; + glyphs: 126 11, 438 8, 430 6, 417 7, 287 8, 430 6; offset: 0 15; } } @@ -2185,12 +2113,10 @@ transform { border { colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -2 -2 114 135; - widths: 1; } border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -1 -1 112 133; - widths: 1; } border { colors: rgba(0,0,0,0); @@ -2201,7 +2127,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 69 11264 0 0 1, 409 6144 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 466 7168 0 0 1, 287 8192 0 0 1; + glyphs: 69 11, 409 6, 370 8, 370 8, 466 7, 287 8; offset: 0 15; } } @@ -2213,12 +2139,10 @@ transform { border { colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); outline: -2 -2 114 135; - widths: 1; } border { colors: rgb(213,208,204) rgb(255,255,255) rgb(255,255,255) rgb(213,208,204); outline: -1 -1 112 133; - widths: 1; } border { colors: rgba(0,0,0,0); @@ -2229,7 +2153,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 165 10240 0 0 1, 324 4096 0 0 1, 280 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1; + glyphs: 165 10, 324 4, 280 8, 312 8, 287 8; offset: 0 15; } } @@ -2252,7 +2176,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 212 289; - widths: 1; } color { bounds: 204 281 6 6; @@ -2291,7 +2214,6 @@ transform { border { colors: rgb(213,208,204); outline: 13 28 16 16 / 3; - widths: 1; } color-matrix { child: texture { @@ -2321,7 +2243,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 1 10240 0 0 1, 360 8192 0 0 1, 280 8192 0 0 1, 409 6144 0 0 1, 287 8192 0 0 1, 244 8192 0 0 1; + glyphs: 1 10, 360 8, 280 8, 409 6, 287 8, 244 8; offset: 86 42; } color { @@ -2331,7 +2253,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 30 10240 0 0 1, 324 4096 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1; + glyphs: 30 10, 324 4, 358 13, 324 4; offset: 157 42; } color { @@ -2355,7 +2277,6 @@ transform { border { colors: rgb(213,208,204); outline: 13 51 16 16 / 3; - widths: 1; } } color { @@ -2377,7 +2298,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 126 11264 0 0 1, 430 5120 0 0 1, 430 5120 0 0 1, 370 8192 0 0 1; + glyphs: 126 11, 430 5, 430 5, 370 8; offset: 86 65; } color { @@ -2387,7 +2308,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 273 7168 0 0 1, 319 8192 0 0 1, 244 8192 0 0 1, 370 8192 0 0 1, 430 5120 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1; + glyphs: 273 7, 319 8, 244 8, 370 8, 430 5, 324 4, 273 7; offset: 157 65; } color { @@ -2411,7 +2332,6 @@ transform { border { colors: rgb(213,208,204); outline: 13 74 16 16 / 3; - widths: 1; } color-matrix { child: texture { @@ -2441,7 +2361,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 126 11264 0 0 1, 409 6144 0 0 1, 466 7168 0 0 1, 324 4096 0 0 1, 349 4096 0 0 1, 349 4096 0 0 1, 287 8192 0 0 1; + glyphs: 126 11, 409 6, 466 7, 324 4, 349 4, 349 4, 287 8; offset: 86 88; } color { @@ -2452,13 +2372,13 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 165 9216 0 0 1, 287 8192 0 0 1, 280 8192 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1; + glyphs: 165 9, 287 8, 280 8, 287 8, 360 8; offset: 157 88; } text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 809 10240 0 0 1; + glyphs: 809 10; offset: 198 88; } } @@ -2486,7 +2406,6 @@ transform { border { colors: rgb(213,208,204); outline: 13 97 16 16 / 8; - widths: 1; } color-matrix { child: texture { @@ -2516,7 +2435,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 29 10240 0 0 1, 287 8192 0 0 1, 360 8192 0 0 1, 341 4096 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 324 4096 0 0 1, 360 8192 0 0 1; + glyphs: 29 10, 287 8, 360 8, 341 4, 244 8, 358 13, 324 4, 360 8; offset: 86 111; } color { @@ -2527,13 +2446,13 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 30 10240 0 0 1, 370 8192 0 0 1, 358 13312 0 0 1, 406 8192 0 0 1; + glyphs: 30 10, 370 8, 358 13, 406 8; offset: 157 111; } text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 809 10240 0 0 1; + glyphs: 809 10; offset: 196 111; } } @@ -2556,7 +2475,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 30 9216 0 0 1, 370 8192 0 0 1, 370 8192 0 0 1, 349 4096 0 0 1; + glyphs: 30 9, 370 8, 370 8, 349 4; offset: 0 17; } } @@ -2576,7 +2495,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 81 4096 0 0 1, 273 7168 0 0 1, 370 8192 0 0 1, 360 8192 0 0 1; + glyphs: 81 4, 273 7, 370 8, 360 8; offset: 0 17; } } @@ -2596,7 +2515,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 115 11264 0 0 1, 244 8192 0 0 1, 358 13312 0 0 1, 287 8192 0 0 1; + glyphs: 115 11, 244 8, 358 13, 287 8; offset: 0 17; } } @@ -2616,7 +2535,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 115 11264 0 0 1, 324 4096 0 0 1, 273 7168 0 0 1, 345 8192 0 0 1; + glyphs: 115 11, 324 4, 273 7, 345 8; offset: 0 17; } } @@ -2635,7 +2554,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 212 263; - widths: 1; } container { color { @@ -2673,7 +2591,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 354 142; - widths: 1; } container { transform { @@ -2693,7 +2610,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; offset: 0 20; } transform: translate(149, 0) translate(16, 3); @@ -2702,7 +2619,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; offset: 0 20; } transform: translate(74, 0) translate(16, 3); @@ -2710,17 +2627,15 @@ transform { transform { child: container { inset-shadow { - blur: 0; color: rgb(53,132,228); dx: 0; dy: -3; outline: -12 -3 66 37; - spread: 0; } text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; offset: 0 20; } } @@ -2748,7 +2663,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 354 142; - widths: 1; } container { color { @@ -2772,7 +2686,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; offset: 0 20; } transform: translate(0, 88) translate(12, 7); @@ -2781,7 +2695,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; offset: 0 20; } transform: translate(0, 44) translate(12, 7); @@ -2789,17 +2703,15 @@ transform { transform { child: container { inset-shadow { - blur: 0; color: rgb(53,132,228); dx: 3; dy: 0; outline: -12 -3 67 36; - spread: 0; } text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; offset: 0 20; } } @@ -2820,7 +2732,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 353 142; - widths: 1; } container { color { @@ -2844,7 +2755,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; offset: 0 20; } transform: translate(149, 0) translate(16, 4); @@ -2853,7 +2764,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; offset: 0 20; } transform: translate(74, 0) translate(16, 4); @@ -2861,17 +2772,15 @@ transform { transform { child: container { inset-shadow { - blur: 0; color: rgb(53,132,228); dx: 0; dy: 3; outline: -12 -4 66 37; - spread: 0; } text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; offset: 0 20; } } @@ -2892,7 +2801,6 @@ transform { border { colors: rgb(213,208,204); outline: -1 -1 353 142; - widths: 1; } container { transform { @@ -2912,7 +2820,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 680 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; offset: 0 20; } transform: translate(0, 88) translate(12, 7); @@ -2921,7 +2829,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 679 8192 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; offset: 0 20; } transform: translate(0, 44) translate(12, 7); @@ -2929,17 +2837,15 @@ transform { transform { child: container { inset-shadow { - blur: 0; color: rgb(53,132,228); dx: -3; dy: 0; outline: -12 -3 67 36; - spread: 0; } text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8192 0 0 1, 244 8192 0 0 1, 312 8192 0 0 1, 287 8192 0 0 1, 862 3072 0 0 1, 678 7168 0 0 1; + glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; offset: 0 20; } } From b90a66cab5baf284aea9aef58a9b0b6fd536650d Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 19 May 2019 20:20:09 +0200 Subject: [PATCH 09/14] rendernodeparser: Allow parsing strings Instead of only allowing for glyph indexes, allow ASCII characters as replacements. So this glyph sequence glyphs: 65 8, 66 8, 67 8 Can be replaced by glyphs: "ABC" provided that the glyph for "A", "B" and "C" are 65, 66 and 67 respectively and their advance is exactly 8. x offset and y offset must always be 0 and every glyph must start a cluster. --- gsk/gskrendernode.h | 2 +- gsk/gskrendernodeimpl.c | 2 +- gsk/gskrendernodeparser.c | 225 ++++++++++++++++-- .../gsk/serializedeserialize/testswitch.node | 10 +- .../serializedeserialize/widgetfactory.node | 138 +++++------ 5 files changed, 276 insertions(+), 101 deletions(-) diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index 1c82f2cf13..cdb59a46f4 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -294,7 +294,7 @@ GskRenderNode * gsk_text_node_new (PangoFont const GdkRGBA *color, const graphene_point_t *offset); GDK_AVAILABLE_IN_ALL -const PangoFont * gsk_text_node_peek_font (GskRenderNode *node); +PangoFont * gsk_text_node_peek_font (GskRenderNode *node); GDK_AVAILABLE_IN_ALL guint gsk_text_node_get_num_glyphs (GskRenderNode *node); GDK_AVAILABLE_IN_ALL diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index a2082dc326..596e6da006 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -3572,7 +3572,7 @@ gsk_text_node_peek_color (GskRenderNode *node) return &self->color; } -const PangoFont * +PangoFont * gsk_text_node_peek_font (GskRenderNode *node) { GskTextNode *self = (GskTextNode *) node; diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index 8b4c74a601..ab7b3bd2a8 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -501,6 +501,62 @@ font_from_string (const char *string) return font; } +#define MIN_ASCII_GLYPH 32 +#define MAX_ASCII_GLYPH 127 /* exclusive */ +#define N_ASCII_GLYPHS (MAX_ASCII_GLYPH - MIN_ASCII_GLYPH) + +static PangoGlyphString * +create_ascii_glyphs (PangoFont *font) +{ + PangoLanguage *language = pango_language_from_string ("en_US"); /* just pick one */ + PangoCoverage *coverage; + PangoAnalysis not_a_hack = { + .shape_engine = pango_font_find_shaper (font, language, MIN_ASCII_GLYPH), /* never changes */ + .lang_engine = NULL, /* unused by pango_shape() */ + .font = font, + .level = 0, + .gravity = PANGO_GRAVITY_SOUTH, + .flags = 0, + .script = PANGO_SCRIPT_COMMON, + .language = language, + .extra_attrs = NULL + }; + PangoGlyphString *result, *glyph_string; + guint i; + + coverage = pango_font_get_coverage (font, language); + for (i = MIN_ASCII_GLYPH; i < MAX_ASCII_GLYPH; i++) + { + if (!pango_coverage_get (coverage, i)) + break; + } + pango_coverage_unref (coverage); + if (i < MAX_ASCII_GLYPH) + return NULL; + + result = pango_glyph_string_new (); + pango_glyph_string_set_size (result, N_ASCII_GLYPHS); + glyph_string = pango_glyph_string_new (); + for (i = MIN_ASCII_GLYPH; i < MAX_ASCII_GLYPH; i++) + { + pango_shape ((char[2]) { i, 0 }, + 1, + ¬_a_hack, + glyph_string); + if (glyph_string->num_glyphs != 1) + { + pango_glyph_string_free (glyph_string); + pango_glyph_string_free (result); + return NULL; + } + result->glyphs[i - MIN_ASCII_GLYPH] = glyph_string->glyphs[0]; + } + + pango_glyph_string_free (glyph_string); + + return result; +} + static gboolean parse_font (GtkCssParser *parser, gpointer out_font) @@ -546,34 +602,52 @@ parse_glyphs (GtkCssParser *parser, double d, d2; int i; - if (!gtk_css_parser_consume_integer (parser, &i) || - !gtk_css_parser_consume_number (parser, &d)) + if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_STRING)) { - pango_glyph_string_free (glyph_string); - return FALSE; - } - gi.glyph = i; - gi.geometry.width = (int) (d * PANGO_SCALE); + char *s = gtk_css_parser_consume_string (parser); - if (gtk_css_parser_has_number (parser)) + for (i = 0; s[i] != 0; i++) + { + if (s[i] < MIN_ASCII_GLYPH || s[i] >= MAX_ASCII_GLYPH) + { + gtk_css_parser_error_value (parser, "Unsupported character %d in string", i); + } + gi.glyph = PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH + s[i]; + pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1); + glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi; + } + } + else { - if (!gtk_css_parser_consume_number (parser, &d) || - !gtk_css_parser_consume_number (parser, &d2)) + if (!gtk_css_parser_consume_integer (parser, &i) || + !gtk_css_parser_consume_number (parser, &d)) { pango_glyph_string_free (glyph_string); return FALSE; } - gi.geometry.x_offset = (int) (d * PANGO_SCALE); - gi.geometry.y_offset = (int) (d2 * PANGO_SCALE); + gi.glyph = i; + gi.geometry.width = (int) (d * PANGO_SCALE); - if (gtk_css_parser_try_ident (parser, "same-cluster")) - gi.attr.is_cluster_start = 0; - else - gi.attr.is_cluster_start = 1; + if (gtk_css_parser_has_number (parser)) + { + if (!gtk_css_parser_consume_number (parser, &d) || + !gtk_css_parser_consume_number (parser, &d2)) + { + pango_glyph_string_free (glyph_string); + return FALSE; + } + gi.geometry.x_offset = (int) (d * PANGO_SCALE); + gi.geometry.y_offset = (int) (d2 * PANGO_SCALE); + + if (gtk_css_parser_try_ident (parser, "same-cluster")) + gi.attr.is_cluster_start = 0; + else + gi.attr.is_cluster_start = 1; + } + + pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1); + glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi; } - - pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1); - glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi; } while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA)); @@ -1009,6 +1083,39 @@ parse_repeat_node (GtkCssParser *parser) return result; } +static gboolean +unpack_glyphs (PangoFont *font, + PangoGlyphString *glyphs) +{ + PangoGlyphString *ascii = NULL; + guint i; + + for (i = 0; i < glyphs->num_glyphs; i++) + { + PangoGlyph glyph = glyphs->glyphs[i].glyph; + + if (glyph < PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH || + glyph >= PANGO_GLYPH_INVALID_INPUT) + continue; + + glyph = glyph - (PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH) - MIN_ASCII_GLYPH; + + if (ascii == NULL) + { + ascii = create_ascii_glyphs (font); + if (ascii == NULL) + return FALSE; + } + + glyphs->glyphs[i].glyph = ascii->glyphs[glyph].glyph; + glyphs->glyphs[i].geometry.width = ascii->glyphs[glyph].geometry.width; + } + + g_clear_pointer (&ascii, pango_glyph_string_free); + + return TRUE; +} + static GskRenderNode * parse_text_node (GtkCssParser *parser) { @@ -1033,13 +1140,41 @@ parse_text_node (GtkCssParser *parser) } if (!glyphs) - return NULL; + { + const char *text = "Hello"; + PangoGlyphInfo gi = { 0, { 0, 0, 0}, { 1 } }; + guint i; - result = gsk_text_node_new (font, glyphs, &color, &offset); + glyphs = pango_glyph_string_new (); + pango_glyph_string_set_size (glyphs, strlen (text)); + for (i = 0; i < strlen (text); i++) + { + gi.glyph = PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH + text[i]; + glyphs->glyphs[i] = gi; + } + } + + if (!unpack_glyphs (font, glyphs)) + { + gtk_css_parser_error_value (parser, "Given font cannot decode the glyph text"); + result = NULL; + } + else + { + result = gsk_text_node_new (font, glyphs, &color, &offset); + if (result == NULL) + { + gtk_css_parser_error_value (parser, "Glyphs result in empty text"); + } + } g_object_unref (font); pango_glyph_string_free (glyphs); + /* return anything, whatever, just not NULL */ + if (result == NULL) + result = create_default_render_node (); + return result; } @@ -1872,27 +2007,56 @@ render_node_print (Printer *p, const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node); const graphene_point_t *offset = gsk_text_node_get_offset (node); const GdkRGBA *color = gsk_text_node_peek_color (node); + PangoFont *font = gsk_text_node_peek_font (node); PangoFontDescription *desc; char *font_name; - guint i; + GString *str; + guint i, j; + PangoGlyphString *ascii = create_ascii_glyphs (font); + start_node (p, "text"); if (!gdk_rgba_equal (color, &GDK_RGBA("000000"))) append_rgba_param (p, "color", color); _indent (p); - desc = pango_font_describe ((PangoFont *)gsk_text_node_peek_font (node));; + desc = pango_font_describe (font); font_name = pango_font_description_to_string (desc); + if (ascii == NULL) + g_print ("\"%s\" has no ascii table\n", font_name); g_string_append_printf (p->str, "font: \"%s\";\n", font_name); g_free (font_name); pango_font_description_free (desc); _indent (p); + str = g_string_new (NULL); g_string_append (p->str, "glyphs: "); for (i = 0; i < n_glyphs; i++) { - if (i > 0) - g_string_append (p->str, ", "); + if (ascii) + { + for (j = 0; j < ascii->num_glyphs; j++) + { + if (glyphs[i].glyph == ascii->glyphs[j].glyph && + glyphs[i].geometry.width == ascii->glyphs[j].geometry.width && + glyphs[i].geometry.x_offset == 0 && + glyphs[i].geometry.x_offset == 0 && + glyphs[i].attr.is_cluster_start) + { + g_string_append_c (str, j + MIN_ASCII_GLYPH); + break; + } + } + if (j != ascii->num_glyphs) + continue; + } + + if (str->len) + { + g_string_append_printf (p->str, "\"%s\", ", str->str); + g_string_set_size (str, 0); + } + g_string_append_printf (p->str, "%u %g", glyphs[i].glyph, (double) glyphs[i].geometry.width / PANGO_SCALE); @@ -1906,7 +2070,14 @@ render_node_print (Printer *p, if (!glyphs[i].attr.is_cluster_start) g_string_append (p->str, " same-cluster"); } + + if (i + 1 < n_glyphs) + g_string_append (p->str, ", "); } + + if (str->len) + g_string_append_printf (p->str, "\"%s\"", str->str); + g_string_append_c (p->str, ';'); g_string_append_c (p->str, '\n'); @@ -1914,6 +2085,10 @@ render_node_print (Printer *p, append_point_param (p, "offset", offset); end_node (p); + + g_string_free (str, TRUE); + if (ascii) + pango_glyph_string_free (ascii); } break; diff --git a/testsuite/gsk/serializedeserialize/testswitch.node b/testsuite/gsk/serializedeserialize/testswitch.node index eb529b703b..89d884bcda 100644 --- a/testsuite/gsk/serializedeserialize/testswitch.node +++ b/testsuite/gsk/serializedeserialize/testswitch.node @@ -59,7 +59,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8; + glyphs: "Disabled"; offset: 145 18; } transform: translate(56, 0); @@ -139,7 +139,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 45 9, 360 8, 244 8, 272 8, 349 4, 287 8, 280 8; + glyphs: "Enabled"; offset: 147 18; } transform: translate(56, 0); @@ -182,7 +182,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8; + glyphs: "Disabled"; offset: 145 18; } transform: translate(56, 0); @@ -228,7 +228,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 45 9, 360 8, 244 8, 272 8, 349 4, 287 8, 280 8; + glyphs: "Enabled"; offset: 147 18; } transform: translate(56, 0); @@ -291,7 +291,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8; + glyphs: "Disabled"; offset: 123 18; } transform: translate(78, 0); diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node b/testsuite/gsk/serializedeserialize/widgetfactory.node index a8b36b42e2..36b5f1b328 100644 --- a/testsuite/gsk/serializedeserialize/widgetfactory.node +++ b/testsuite/gsk/serializedeserialize/widgetfactory.node @@ -75,7 +75,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 678 7; + glyphs: "Page 1"; offset: 0 17; } transform: translate(28, 0); @@ -98,7 +98,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 679 8; + glyphs: "Page 2"; offset: 0 17; } transform: translate(28, 0); @@ -123,7 +123,7 @@ transform { child: text { color: rgb(46,52,54); font: "Cantarell 11"; - glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 680 8; + glyphs: "Page 3"; offset: 0 17; } transform: translate(28, 0); @@ -199,7 +199,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 5, 409 6, 473 7; + glyphs: "comboboxentry"; offset: 0 21; } clip { @@ -211,7 +211,7 @@ transform { text { color: rgb(252,252,252); font: "Cantarell 11"; - glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 5, 409 6, 473 7; + glyphs: "comboboxentry"; offset: 0 21; } } @@ -268,7 +268,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 5, 409 6, 473 7; + glyphs: "comboboxentry"; offset: 0 21; } clip: 0 0 357 32; @@ -321,7 +321,7 @@ transform { child: text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 30 10, 349 4, 324 4, 273 7, 345 7, 862 3, 324 4, 273 7, 370 8, 360 8, 862 3, 430 5, 370 8, 862 3, 273 7, 319 8, 244 8, 360 8, 312 8, 287 8, 862 3, 358 13, 370 8, 280 8, 287 8; + glyphs: "Click icon to change mode"; offset: 0 21; } opacity: 0.54902; @@ -359,7 +359,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 287 8, 360 8, 430 5, 409 6, 473 7; + glyphs: "entry"; offset: 0 21; } clip: 0 0 392 32; @@ -387,7 +387,7 @@ transform { child: text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 287 8, 360 8, 430 5, 409 6, 473 7; + glyphs: "entry"; offset: 0 22; } clip: 0 0 357 33; @@ -442,7 +442,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 103 8, 287 8, 311 5, 430 5; + glyphs: "Left"; offset: 2 17; } transform { @@ -476,7 +476,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 113 13, 324 4, 280 8, 280 8, 349 4, 287 8; + glyphs: "Middle"; offset: 2 17; } transform { @@ -514,7 +514,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 165 9, 324 4, 312 8, 319 8, 430 5; + glyphs: "Right"; offset: 2 17; } transform { @@ -542,14 +542,14 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 349 4, 244 8, 272 8, 287 8, 349 4; + glyphs: "label"; offset: 0 22; } transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 349 4, 244 8, 272 8, 287 8, 349 4; + glyphs: "label"; offset: 0 22; } transform: translate(52, 0); @@ -572,7 +572,7 @@ transform { child: text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 682 8, 677 9; + glyphs: "50"; offset: 0 15; } transform: translate(6, 6); @@ -635,7 +635,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 677 9; + glyphs: "0"; offset: 0 15; } transform: translate(6, 6); @@ -723,7 +723,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "checkbutton"; offset: 0 15; } transform: translate(24, 0); @@ -750,7 +750,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "checkbutton"; offset: 0 15; } transform: translate(24, 0); @@ -785,7 +785,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "checkbutton"; offset: 0 15; } transform: translate(24, 0); @@ -820,7 +820,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "checkbutton"; offset: 0 15; } transform: translate(24, 0); @@ -847,7 +847,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "checkbutton"; offset: 0 15; } transform: translate(24, 0); @@ -882,7 +882,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "checkbutton"; offset: 0 15; } transform: translate(24, 0); @@ -912,7 +912,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "radiobutton"; offset: 0 15; } transform: translate(24, 0); @@ -942,7 +942,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "radiobutton"; offset: 0 15; } transform: translate(24, 0); @@ -980,7 +980,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "radiobutton"; offset: 0 15; } transform: translate(24, 0); @@ -1018,7 +1018,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "radiobutton"; offset: 0 15; } transform: translate(24, 0); @@ -1048,7 +1048,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "radiobutton"; offset: 0 15; } transform: translate(24, 0); @@ -1086,7 +1086,7 @@ transform { child: text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "radiobutton"; offset: 0 15; } transform: translate(24, 0); @@ -1154,7 +1154,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "togglebutton"; offset: 2 17; } } @@ -1176,7 +1176,7 @@ transform { text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "togglebutton"; offset: 2 17; } } @@ -1198,7 +1198,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "togglebutton"; offset: 2 17; } } @@ -1220,7 +1220,7 @@ transform { text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "togglebutton"; offset: 2 17; } } @@ -1244,7 +1244,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 1 10, 360 8, 280 8, 409 6, 287 8, 244 8; + glyphs: "Andrea"; offset: 2 17; } transform { @@ -1282,7 +1282,7 @@ transform { text { color: rgb(212,207,202); font: "Cantarell 11"; - glyphs: 126 11, 430 5, 430 5, 370 8; + glyphs: "Otto"; offset: 2 17; } transform { @@ -1320,7 +1320,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 173 9, 244 8, 360 8, 417 7, 862 3, 165 9, 287 8, 312 8, 438 8, 349 4, 244 8, 409 6; + glyphs: "Sans Regular"; offset: 0 17; } transform { @@ -1328,7 +1328,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 678 7, 679 8; + glyphs: "12"; offset: 0 17; } transform: translate(1, 0); @@ -1392,7 +1392,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell 11"; - glyphs: 822 4, 115 11, 370 8, 360 8, 287 8, 823 4; + glyphs: "(None)"; offset: 0 17; } transform: translate(16, 0); @@ -1419,7 +1419,7 @@ transform { text { color: rgb(53,132,228); font: "Cantarell 11"; - glyphs: 349 4, 324 4, 360 8, 345 7, 862 3, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8; + glyphs: "link button"; offset: 10 17; } color { @@ -1573,7 +1573,7 @@ transform { child: text { color: rgba(46,52,54,0.4); font: "Cantarell 9.1669921875"; - glyphs: 682 7, 677 8, 859 1, 919 12; + glyphs: "50", 859 1, "%"; offset: 0 13; } transform: translate(237, 0); @@ -1965,7 +1965,7 @@ transform { text { color: rgba(146,149,149,0.55); font: "Cantarell 11"; - glyphs: 682 8, 677 9, 805 4, 677 9; + glyphs: "50.0"; offset: 26 15; } transform { @@ -2021,7 +2021,7 @@ transform { text { color: rgba(146,149,149,0.55); font: "Cantarell 11"; - glyphs: 682 8, 677 9, 805 4, 677 9; + glyphs: "50.0"; offset: 26 15; } transform { @@ -2086,7 +2086,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 81 4, 360 8, 417 7, 287 8, 430 6; + glyphs: "Inset"; offset: 0 15; } } @@ -2101,7 +2101,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 126 11, 438 8, 430 6, 417 7, 287 8, 430 6; + glyphs: "Outset"; offset: 0 15; } } @@ -2127,7 +2127,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 69 11, 409 6, 370 8, 370 8, 466 7, 287 8; + glyphs: "Groove"; offset: 0 15; } } @@ -2153,7 +2153,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 165 10, 324 4, 280 8, 312 8, 287 8; + glyphs: "Ridge"; offset: 0 15; } } @@ -2243,7 +2243,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 1 10, 360 8, 280 8, 409 6, 287 8, 244 8; + glyphs: "Andrea"; offset: 86 42; } color { @@ -2253,7 +2253,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 30 10, 324 4, 358 13, 324 4; + glyphs: "Cimi"; offset: 157 42; } color { @@ -2298,7 +2298,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 126 11, 430 5, 430 5, 370 8; + glyphs: "Otto"; offset: 86 65; } color { @@ -2308,7 +2308,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 273 7, 319 8, 244 8, 370 8, 430 5, 324 4, 273 7; + glyphs: "chaotic"; offset: 157 65; } color { @@ -2361,7 +2361,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 126 11, 409 6, 466 7, 324 4, 349 4, 349 4, 287 8; + glyphs: "Orville"; offset: 86 88; } color { @@ -2372,7 +2372,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 165 9, 287 8, 280 8, 287 8, 360 8; + glyphs: "Reden"; offset: 157 88; } text { @@ -2435,7 +2435,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 29 10, 287 8, 360 8, 341 4, 244 8, 358 13, 324 4, 360 8; + glyphs: "Benjamin"; offset: 86 111; } color { @@ -2446,7 +2446,7 @@ transform { text { color: rgb(50,50,50); font: "Cantarell 11"; - glyphs: 30 10, 370 8, 358 13, 406 8; + glyphs: "Comp"; offset: 157 111; } text { @@ -2475,7 +2475,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 30 9, 370 8, 370 8, 349 4; + glyphs: "Cool"; offset: 0 17; } } @@ -2495,7 +2495,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 81 4, 273 7, 370 8, 360 8; + glyphs: "Icon"; offset: 0 17; } } @@ -2515,7 +2515,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 115 11, 244 8, 358 13, 287 8; + glyphs: "Name"; offset: 0 17; } } @@ -2535,7 +2535,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 115 11, 324 4, 273 7, 345 8; + glyphs: "Nick"; offset: 0 17; } } @@ -2610,7 +2610,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; + glyphs: "page 3"; offset: 0 20; } transform: translate(149, 0) translate(16, 3); @@ -2619,7 +2619,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; + glyphs: "page 2"; offset: 0 20; } transform: translate(74, 0) translate(16, 3); @@ -2635,7 +2635,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; + glyphs: "page 1"; offset: 0 20; } } @@ -2686,7 +2686,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; + glyphs: "page 3"; offset: 0 20; } transform: translate(0, 88) translate(12, 7); @@ -2695,7 +2695,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; + glyphs: "page 2"; offset: 0 20; } transform: translate(0, 44) translate(12, 7); @@ -2711,7 +2711,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; + glyphs: "page 1"; offset: 0 20; } } @@ -2755,7 +2755,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; + glyphs: "page 3"; offset: 0 20; } transform: translate(149, 0) translate(16, 4); @@ -2764,7 +2764,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; + glyphs: "page 2"; offset: 0 20; } transform: translate(74, 0) translate(16, 4); @@ -2780,7 +2780,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; + glyphs: "page 1"; offset: 0 20; } } @@ -2820,7 +2820,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8; + glyphs: "page 3"; offset: 0 20; } transform: translate(0, 88) translate(12, 7); @@ -2829,7 +2829,7 @@ transform { child: text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8; + glyphs: "page 2"; offset: 0 20; } transform: translate(0, 44) translate(12, 7); @@ -2845,7 +2845,7 @@ transform { text { color: rgb(146,149,149); font: "Cantarell Bold 11"; - glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7; + glyphs: "page 1"; offset: 0 20; } } From b37c2216fc19319087d4ef543dcc71ce34bf4432 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 19 May 2019 21:34:13 +0200 Subject: [PATCH 10/14] testsuite: Add empty node tests For every node type, add a test that creates it empty and ensure that it prints the reference output. --- testsuite/gsk/meson.build | 38 +++++++++++++++++++ testsuite/gsk/nodeparser/empty-blend.node | 1 + testsuite/gsk/nodeparser/empty-blend.ref.node | 10 +++++ testsuite/gsk/nodeparser/empty-blur.node | 1 + testsuite/gsk/nodeparser/empty-blur.ref.node | 6 +++ testsuite/gsk/nodeparser/empty-border.node | 1 + .../gsk/nodeparser/empty-border.ref.node | 3 ++ testsuite/gsk/nodeparser/empty-clip.node | 1 + testsuite/gsk/nodeparser/empty-clip.ref.node | 7 ++++ .../gsk/nodeparser/empty-color-matrix.node | 1 + .../nodeparser/empty-color-matrix.ref.node | 6 +++ testsuite/gsk/nodeparser/empty-color.node | 1 + testsuite/gsk/nodeparser/empty-color.ref.node | 4 ++ testsuite/gsk/nodeparser/empty-container.node | 1 + .../gsk/nodeparser/empty-container.ref.node | 0 .../gsk/nodeparser/empty-cross-fade.node | 1 + .../gsk/nodeparser/empty-cross-fade.ref.node | 10 +++++ testsuite/gsk/nodeparser/empty-debug.node | 1 + testsuite/gsk/nodeparser/empty-debug.ref.node | 6 +++ .../gsk/nodeparser/empty-inset-shadow.node | 1 + .../nodeparser/empty-inset-shadow.ref.node | 3 ++ .../gsk/nodeparser/empty-linear-gradient.node | 1 + .../nodeparser/empty-linear-gradient.ref.node | 6 +++ testsuite/gsk/nodeparser/empty-opacity.node | 1 + .../gsk/nodeparser/empty-opacity.ref.node | 6 +++ .../gsk/nodeparser/empty-outset-shadow.node | 1 + .../nodeparser/empty-outset-shadow.ref.node | 3 ++ testsuite/gsk/nodeparser/empty-repeat.node | 1 + .../gsk/nodeparser/empty-repeat.ref.node | 6 +++ .../gsk/nodeparser/empty-rounded-clip.node | 1 + .../nodeparser/empty-rounded-clip.ref.node | 7 ++++ testsuite/gsk/nodeparser/empty-shadow.node | 1 + .../gsk/nodeparser/empty-shadow.ref.node | 7 ++++ testsuite/gsk/nodeparser/empty-text.node | 1 + testsuite/gsk/nodeparser/empty-text.ref.node | 4 ++ testsuite/gsk/nodeparser/empty-texture.node | 1 + .../gsk/nodeparser/empty-texture.ref.node | 4 ++ testsuite/gsk/nodeparser/empty-transform.node | 1 + .../gsk/nodeparser/empty-transform.ref.node | 6 +++ 39 files changed, 161 insertions(+) create mode 100644 testsuite/gsk/nodeparser/empty-blend.node create mode 100644 testsuite/gsk/nodeparser/empty-blend.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-blur.node create mode 100644 testsuite/gsk/nodeparser/empty-blur.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-border.node create mode 100644 testsuite/gsk/nodeparser/empty-border.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-clip.node create mode 100644 testsuite/gsk/nodeparser/empty-clip.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-color-matrix.node create mode 100644 testsuite/gsk/nodeparser/empty-color-matrix.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-color.node create mode 100644 testsuite/gsk/nodeparser/empty-color.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-container.node create mode 100644 testsuite/gsk/nodeparser/empty-container.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-cross-fade.node create mode 100644 testsuite/gsk/nodeparser/empty-cross-fade.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-debug.node create mode 100644 testsuite/gsk/nodeparser/empty-debug.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-inset-shadow.node create mode 100644 testsuite/gsk/nodeparser/empty-inset-shadow.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-linear-gradient.node create mode 100644 testsuite/gsk/nodeparser/empty-linear-gradient.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-opacity.node create mode 100644 testsuite/gsk/nodeparser/empty-opacity.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-outset-shadow.node create mode 100644 testsuite/gsk/nodeparser/empty-outset-shadow.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-repeat.node create mode 100644 testsuite/gsk/nodeparser/empty-repeat.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-rounded-clip.node create mode 100644 testsuite/gsk/nodeparser/empty-rounded-clip.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-shadow.node create mode 100644 testsuite/gsk/nodeparser/empty-shadow.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-text.node create mode 100644 testsuite/gsk/nodeparser/empty-text.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-texture.node create mode 100644 testsuite/gsk/nodeparser/empty-texture.ref.node create mode 100644 testsuite/gsk/nodeparser/empty-transform.node create mode 100644 testsuite/gsk/nodeparser/empty-transform.ref.node diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 608ec49d27..e2e0328284 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -80,6 +80,44 @@ node_parser_tests = [ 'crash4.errors', 'crash4.node', 'crash4.ref.node', + 'empty-blend.node', + 'empty-blend.ref.node', + 'empty-blur.node', + 'empty-blur.ref.node', + 'empty-border.node', + 'empty-border.ref.node', + 'empty-clip.node', + 'empty-clip.ref.node', + 'empty-color.node', + 'empty-color.ref.node', + 'empty-color-matrix.node', + 'empty-color-matrix.ref.node', + 'empty-container.node', + 'empty-container.ref.node', + 'empty-cross-fade.node', + 'empty-cross-fade.ref.node', + 'empty-debug.node', + 'empty-debug.ref.node', + 'empty-inset-shadow.node', + 'empty-inset-shadow.ref.node', + 'empty-linear-gradient.node', + 'empty-linear-gradient.ref.node', + 'empty-opacity.node', + 'empty-opacity.ref.node', + 'empty-outset-shadow.node', + 'empty-outset-shadow.ref.node', + 'empty-repeat.node', + 'empty-repeat.ref.node', + 'empty-rounded-clip.node', + 'empty-rounded-clip.ref.node', + 'empty-shadow.node', + 'empty-shadow.ref.node', + 'empty-text.node', + 'empty-text.ref.node', + 'empty-texture.node', + 'empty-texture.ref.node', + 'empty-transform.node', + 'empty-transform.ref.node', ] foreach test : node_parser_tests diff --git a/testsuite/gsk/nodeparser/empty-blend.node b/testsuite/gsk/nodeparser/empty-blend.node new file mode 100644 index 0000000000..291d805ff7 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-blend.node @@ -0,0 +1 @@ +blend { } diff --git a/testsuite/gsk/nodeparser/empty-blend.ref.node b/testsuite/gsk/nodeparser/empty-blend.ref.node new file mode 100644 index 0000000000..c494d26ba8 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-blend.ref.node @@ -0,0 +1,10 @@ +blend { + bottom: color { + bounds: 0 0 50 50; + color: rgb(170,255,0); + } + top: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/empty-blur.node b/testsuite/gsk/nodeparser/empty-blur.node new file mode 100644 index 0000000000..6f41a3e203 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-blur.node @@ -0,0 +1 @@ +blur { } diff --git a/testsuite/gsk/nodeparser/empty-blur.ref.node b/testsuite/gsk/nodeparser/empty-blur.ref.node new file mode 100644 index 0000000000..c9fd1299b4 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-blur.ref.node @@ -0,0 +1,6 @@ +blur { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/empty-border.node b/testsuite/gsk/nodeparser/empty-border.node new file mode 100644 index 0000000000..0a58c89c65 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-border.node @@ -0,0 +1 @@ +border { } diff --git a/testsuite/gsk/nodeparser/empty-border.ref.node b/testsuite/gsk/nodeparser/empty-border.ref.node new file mode 100644 index 0000000000..b1e47a59ee --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-border.ref.node @@ -0,0 +1,3 @@ +border { + outline: 0 0 50 50; +} diff --git a/testsuite/gsk/nodeparser/empty-clip.node b/testsuite/gsk/nodeparser/empty-clip.node new file mode 100644 index 0000000000..c513eb6597 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-clip.node @@ -0,0 +1 @@ +clip { } diff --git a/testsuite/gsk/nodeparser/empty-clip.ref.node b/testsuite/gsk/nodeparser/empty-clip.ref.node new file mode 100644 index 0000000000..904bd3926f --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-clip.ref.node @@ -0,0 +1,7 @@ +clip { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } + clip: 0 0 50 50; +} diff --git a/testsuite/gsk/nodeparser/empty-color-matrix.node b/testsuite/gsk/nodeparser/empty-color-matrix.node new file mode 100644 index 0000000000..c0fcc1cbd5 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-color-matrix.node @@ -0,0 +1 @@ +color-matrix { } diff --git a/testsuite/gsk/nodeparser/empty-color-matrix.ref.node b/testsuite/gsk/nodeparser/empty-color-matrix.ref.node new file mode 100644 index 0000000000..773a4832a8 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-color-matrix.ref.node @@ -0,0 +1,6 @@ +color-matrix { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/empty-color.node b/testsuite/gsk/nodeparser/empty-color.node new file mode 100644 index 0000000000..adaf509095 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-color.node @@ -0,0 +1 @@ +color { } diff --git a/testsuite/gsk/nodeparser/empty-color.ref.node b/testsuite/gsk/nodeparser/empty-color.ref.node new file mode 100644 index 0000000000..404fb1b892 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-color.ref.node @@ -0,0 +1,4 @@ +color { + bounds: 0 0 50 50; + color: rgb(255,0,204); +} diff --git a/testsuite/gsk/nodeparser/empty-container.node b/testsuite/gsk/nodeparser/empty-container.node new file mode 100644 index 0000000000..d0c267ce88 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-container.node @@ -0,0 +1 @@ +container { } diff --git a/testsuite/gsk/nodeparser/empty-container.ref.node b/testsuite/gsk/nodeparser/empty-container.ref.node new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/gsk/nodeparser/empty-cross-fade.node b/testsuite/gsk/nodeparser/empty-cross-fade.node new file mode 100644 index 0000000000..a9892afb96 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-cross-fade.node @@ -0,0 +1 @@ +cross-fade { } diff --git a/testsuite/gsk/nodeparser/empty-cross-fade.ref.node b/testsuite/gsk/nodeparser/empty-cross-fade.ref.node new file mode 100644 index 0000000000..76ab4d6943 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-cross-fade.ref.node @@ -0,0 +1,10 @@ +cross-fade { + end: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } + start: color { + bounds: 0 0 50 50; + color: rgb(170,255,0); + } +} diff --git a/testsuite/gsk/nodeparser/empty-debug.node b/testsuite/gsk/nodeparser/empty-debug.node new file mode 100644 index 0000000000..088a305cf9 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-debug.node @@ -0,0 +1 @@ +debug { } diff --git a/testsuite/gsk/nodeparser/empty-debug.ref.node b/testsuite/gsk/nodeparser/empty-debug.ref.node new file mode 100644 index 0000000000..fc7e73a4c7 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-debug.ref.node @@ -0,0 +1,6 @@ +debug { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/empty-inset-shadow.node b/testsuite/gsk/nodeparser/empty-inset-shadow.node new file mode 100644 index 0000000000..5b84e7c8a5 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-inset-shadow.node @@ -0,0 +1 @@ +inset-shadow { } diff --git a/testsuite/gsk/nodeparser/empty-inset-shadow.ref.node b/testsuite/gsk/nodeparser/empty-inset-shadow.ref.node new file mode 100644 index 0000000000..d3f8b412d2 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-inset-shadow.ref.node @@ -0,0 +1,3 @@ +inset-shadow { + outline: 0 0 50 50; +} diff --git a/testsuite/gsk/nodeparser/empty-linear-gradient.node b/testsuite/gsk/nodeparser/empty-linear-gradient.node new file mode 100644 index 0000000000..ef6234b661 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-linear-gradient.node @@ -0,0 +1 @@ +linear-gradient { } diff --git a/testsuite/gsk/nodeparser/empty-linear-gradient.ref.node b/testsuite/gsk/nodeparser/empty-linear-gradient.ref.node new file mode 100644 index 0000000000..c648c7b909 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-linear-gradient.ref.node @@ -0,0 +1,6 @@ +linear-gradient { + bounds: 0 0 50 50; + end: 0 50; + start: 0 0; + stops: 0 rgb(170,255,0), 1 rgb(255,0,204); +} diff --git a/testsuite/gsk/nodeparser/empty-opacity.node b/testsuite/gsk/nodeparser/empty-opacity.node new file mode 100644 index 0000000000..8fb3590077 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-opacity.node @@ -0,0 +1 @@ +opacity { } diff --git a/testsuite/gsk/nodeparser/empty-opacity.ref.node b/testsuite/gsk/nodeparser/empty-opacity.ref.node new file mode 100644 index 0000000000..a02df0f9e8 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-opacity.ref.node @@ -0,0 +1,6 @@ +opacity { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/empty-outset-shadow.node b/testsuite/gsk/nodeparser/empty-outset-shadow.node new file mode 100644 index 0000000000..87858be472 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-outset-shadow.node @@ -0,0 +1 @@ +outset-shadow { } diff --git a/testsuite/gsk/nodeparser/empty-outset-shadow.ref.node b/testsuite/gsk/nodeparser/empty-outset-shadow.ref.node new file mode 100644 index 0000000000..94c00b67d2 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-outset-shadow.ref.node @@ -0,0 +1,3 @@ +outset-shadow { + outline: 0 0 50 50; +} diff --git a/testsuite/gsk/nodeparser/empty-repeat.node b/testsuite/gsk/nodeparser/empty-repeat.node new file mode 100644 index 0000000000..9f82f0e3ac --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-repeat.node @@ -0,0 +1 @@ +repeat { } diff --git a/testsuite/gsk/nodeparser/empty-repeat.ref.node b/testsuite/gsk/nodeparser/empty-repeat.ref.node new file mode 100644 index 0000000000..c56ad7bc86 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-repeat.ref.node @@ -0,0 +1,6 @@ +repeat { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/nodeparser/empty-rounded-clip.node b/testsuite/gsk/nodeparser/empty-rounded-clip.node new file mode 100644 index 0000000000..28373aa45f --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-rounded-clip.node @@ -0,0 +1 @@ +rounded-clip { } diff --git a/testsuite/gsk/nodeparser/empty-rounded-clip.ref.node b/testsuite/gsk/nodeparser/empty-rounded-clip.ref.node new file mode 100644 index 0000000000..c316247b54 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-rounded-clip.ref.node @@ -0,0 +1,7 @@ +rounded-clip { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } + clip: 0 0 50 50; +} diff --git a/testsuite/gsk/nodeparser/empty-shadow.node b/testsuite/gsk/nodeparser/empty-shadow.node new file mode 100644 index 0000000000..3f4879359d --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-shadow.node @@ -0,0 +1 @@ +shadow { } diff --git a/testsuite/gsk/nodeparser/empty-shadow.ref.node b/testsuite/gsk/nodeparser/empty-shadow.ref.node new file mode 100644 index 0000000000..c69c067a83 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-shadow.ref.node @@ -0,0 +1,7 @@ +shadow { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } + shadows: rgb(0,0,0) 1 1; +} diff --git a/testsuite/gsk/nodeparser/empty-text.node b/testsuite/gsk/nodeparser/empty-text.node new file mode 100644 index 0000000000..5964c4e7d1 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-text.node @@ -0,0 +1 @@ +text { } diff --git a/testsuite/gsk/nodeparser/empty-text.ref.node b/testsuite/gsk/nodeparser/empty-text.ref.node new file mode 100644 index 0000000000..75ffdc0a01 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-text.ref.node @@ -0,0 +1,4 @@ +text { + font: "Cantarell 11"; + glyphs: "Hello"; +} diff --git a/testsuite/gsk/nodeparser/empty-texture.node b/testsuite/gsk/nodeparser/empty-texture.node new file mode 100644 index 0000000000..e3b669cc42 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-texture.node @@ -0,0 +1 @@ +texture { } diff --git a/testsuite/gsk/nodeparser/empty-texture.ref.node b/testsuite/gsk/nodeparser/empty-texture.ref.node new file mode 100644 index 0000000000..eda875a114 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-texture.ref.node @@ -0,0 +1,4 @@ +texture { + bounds: 0 0 50 50; + texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABmJLR0QA/wD/AP+gvaeTAAAAKUlEQVQYlWP8z3DmPwMaYGQwYUQXY0IXwAUGUCGGoxkYGBiweXAoeAYAz44F3e3U1xUAAAAASUVORK5CYII="); +} diff --git a/testsuite/gsk/nodeparser/empty-transform.node b/testsuite/gsk/nodeparser/empty-transform.node new file mode 100644 index 0000000000..4833ddb193 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-transform.node @@ -0,0 +1 @@ +transform { } diff --git a/testsuite/gsk/nodeparser/empty-transform.ref.node b/testsuite/gsk/nodeparser/empty-transform.ref.node new file mode 100644 index 0000000000..8a63720daa --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-transform.ref.node @@ -0,0 +1,6 @@ +transform { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} From 29cb9230bf0776e55262e712405e8c8c17fed6a7 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 20 May 2019 03:24:24 +0200 Subject: [PATCH 11/14] rendernode: Blur alpha channel for cairo blur node The blur node still doesn't properly blur with a transform, but at least it now doesn't turn semi-transparent stuff black. --- gsk/gskrendernodeimpl.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 596e6da006..d0a24ed463 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -3666,6 +3666,7 @@ blur_once (cairo_surface_t *src, r += c1[0]; g += c1[1]; b += c1[2]; + a += c1[3]; } p_dest_row = p_dest; for (x = 0; x < width; x++) @@ -3674,6 +3675,7 @@ blur_once (cairo_surface_t *src, p_dest_row[0] = div_kernel_size[r]; p_dest_row[1] = div_kernel_size[g]; p_dest_row[2] = div_kernel_size[b]; + p_dest_row[3] = div_kernel_size[a]; p_dest_row += n_channels; /* the pixel to add to the kernel */ @@ -3692,6 +3694,7 @@ blur_once (cairo_surface_t *src, r += c1[0] - c2[0]; g += c1[1] - c2[1]; b += c1[2] - c2[2]; + a += c1[3] - c2[3]; } p_src += src_rowstride; @@ -3715,6 +3718,7 @@ blur_once (cairo_surface_t *src, r += c1[0]; g += c1[1]; b += c1[2]; + a += c1[3]; } p_dest_col = p_dest; @@ -3725,6 +3729,7 @@ blur_once (cairo_surface_t *src, p_dest_col[0] = div_kernel_size[r]; p_dest_col[1] = div_kernel_size[g]; p_dest_col[2] = div_kernel_size[b]; + p_dest_col[3] = div_kernel_size[a]; p_dest_col += dest_rowstride; /* the pixel to add to the kernel */ @@ -3742,6 +3747,7 @@ blur_once (cairo_surface_t *src, r += c1[0] - c2[0]; g += c1[1] - c2[1]; b += c1[2] - c2[2]; + a += c1[3] - c2[3]; } p_src += n_channels; From eb386134e35c229ef20d71163e8ae0c4e75a4031 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 20 May 2019 03:29:11 +0200 Subject: [PATCH 12/14] testuite: Improve compare-render binary - Remove remains of g_test_*() functions We're not a glib test, we're a simple binary. - Handle nonexistence of reference image properly Don't assert, but create the output image and the error out. --- testsuite/gsk/compare-render.c | 37 ++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/testsuite/gsk/compare-render.c b/testsuite/gsk/compare-render.c index 92691c8b34..b12f2459e3 100644 --- a/testsuite/gsk/compare-render.c +++ b/testsuite/gsk/compare-render.c @@ -61,8 +61,8 @@ deserialize_error_func (const GtkCssSection *section, { char *section_str = gtk_css_section_to_string (section); - g_test_message ("Error at %s: %s", section_str, error->message); - g_test_fail (); + g_print ("Error at %s: %s", section_str, error->message); + *((gboolean *) user_data) = FALSE; free (section_str); } @@ -84,6 +84,7 @@ main (int argc, char **argv) GskRenderNode *node; const char *node_file; const char *png_file; + gboolean success = TRUE; g_assert (argc == 3); @@ -109,12 +110,11 @@ main (int argc, char **argv) { g_print ("Could not open node file: %s\n", error->message); g_clear_error (&error); - g_test_fail (); - return -1; + return 1; } bytes = g_bytes_new_take (contents, len); - node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); + node = gsk_render_node_deserialize (bytes, deserialize_error_func, &success); g_bytes_unref (bytes); g_assert_no_error (error); @@ -135,15 +135,30 @@ main (int argc, char **argv) /* Load the given reference png file */ reference_surface = cairo_image_surface_create_from_png (png_file); - g_assert (reference_surface != NULL); + if (cairo_surface_status (reference_surface)) + { + g_print ("Error loading reference surface: %s\n", + cairo_status_to_string (cairo_surface_status (reference_surface))); + success = FALSE; + } + else + { + /* Now compare the two */ + diff_surface = reftest_compare_surfaces (rendered_surface, reference_surface); - /* Now compare the two */ - diff_surface = reftest_compare_surfaces (rendered_surface, reference_surface); + if (diff_surface) + { + save_image (diff_surface, node_file, ".diff.png"); + cairo_surface_destroy (diff_surface); + success = FALSE; + } + } save_image (rendered_surface, node_file, ".out.png"); - if (diff_surface) - save_image (diff_surface, node_file, ".diff.png"); + cairo_surface_destroy (reference_surface); + cairo_surface_destroy (rendered_surface); + g_object_unref (texture); - return diff_surface == NULL ? 0 : 1; + return success ? 0 : 1; } From 0a32305f01791d819158b305b9f294ca58ffd33c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 20 May 2019 03:32:30 +0200 Subject: [PATCH 13/14] testsuite: Add render tests for all the empty nodes Test that rendering empty nodes succees. For a lot of nodes the resulting rendering isn't clearly defined, in those cases we overdraw those regions (sometimes the whole image) with black. --- testsuite/gsk/compare/empty-blend.node | 1 + testsuite/gsk/compare/empty-blend.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-blur.node | 20 ++++++++++++++++++ testsuite/gsk/compare/empty-blur.png | Bin 0 -> 167 bytes testsuite/gsk/compare/empty-border.node | 1 + testsuite/gsk/compare/empty-border.png | Bin 0 -> 169 bytes testsuite/gsk/compare/empty-clip.node | 1 + testsuite/gsk/compare/empty-clip.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-color-matrix.node | 1 + testsuite/gsk/compare/empty-color-matrix.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-color.node | 1 + testsuite/gsk/compare/empty-color.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-container.node | 8 +++++++ testsuite/gsk/compare/empty-container.png | Bin 0 -> 86 bytes testsuite/gsk/compare/empty-cross-fade.node | 9 ++++++++ testsuite/gsk/compare/empty-cross-fade.png | Bin 0 -> 105 bytes testsuite/gsk/compare/empty-debug.node | 1 + testsuite/gsk/compare/empty-debug.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-inset-shadow.node | 1 + testsuite/gsk/compare/empty-inset-shadow.png | Bin 0 -> 164 bytes .../gsk/compare/empty-linear-gradient.node | 1 + .../gsk/compare/empty-linear-gradient.png | Bin 0 -> 203 bytes testsuite/gsk/compare/empty-opacity.node | 9 ++++++++ testsuite/gsk/compare/empty-opacity.png | Bin 0 -> 105 bytes .../gsk/compare/empty-outset-shadow.node | 1 + testsuite/gsk/compare/empty-outset-shadow.png | Bin 0 -> 168 bytes testsuite/gsk/compare/empty-repeat.node | 1 + testsuite/gsk/compare/empty-repeat.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-rounded-clip.node | 1 + testsuite/gsk/compare/empty-rounded-clip.png | Bin 0 -> 153 bytes testsuite/gsk/compare/empty-shadow.node | 1 + testsuite/gsk/compare/empty-shadow.png | Bin 0 -> 181 bytes testsuite/gsk/compare/empty-text.node | 1 + testsuite/gsk/compare/empty-text.png | Bin 0 -> 405 bytes testsuite/gsk/compare/empty-texture.node | 12 +++++++++++ testsuite/gsk/compare/empty-texture.png | Bin 0 -> 197 bytes testsuite/gsk/compare/empty-transform.node | 1 + testsuite/gsk/compare/empty-transform.png | Bin 0 -> 153 bytes testsuite/gsk/meson.build | 19 +++++++++++++++++ 39 files changed, 91 insertions(+) create mode 100644 testsuite/gsk/compare/empty-blend.node create mode 100644 testsuite/gsk/compare/empty-blend.png create mode 100644 testsuite/gsk/compare/empty-blur.node create mode 100644 testsuite/gsk/compare/empty-blur.png create mode 100644 testsuite/gsk/compare/empty-border.node create mode 100644 testsuite/gsk/compare/empty-border.png create mode 100644 testsuite/gsk/compare/empty-clip.node create mode 100644 testsuite/gsk/compare/empty-clip.png create mode 100644 testsuite/gsk/compare/empty-color-matrix.node create mode 100644 testsuite/gsk/compare/empty-color-matrix.png create mode 100644 testsuite/gsk/compare/empty-color.node create mode 100644 testsuite/gsk/compare/empty-color.png create mode 100644 testsuite/gsk/compare/empty-container.node create mode 100644 testsuite/gsk/compare/empty-container.png create mode 100644 testsuite/gsk/compare/empty-cross-fade.node create mode 100644 testsuite/gsk/compare/empty-cross-fade.png create mode 100644 testsuite/gsk/compare/empty-debug.node create mode 100644 testsuite/gsk/compare/empty-debug.png create mode 100644 testsuite/gsk/compare/empty-inset-shadow.node create mode 100644 testsuite/gsk/compare/empty-inset-shadow.png create mode 100644 testsuite/gsk/compare/empty-linear-gradient.node create mode 100644 testsuite/gsk/compare/empty-linear-gradient.png create mode 100644 testsuite/gsk/compare/empty-opacity.node create mode 100644 testsuite/gsk/compare/empty-opacity.png create mode 100644 testsuite/gsk/compare/empty-outset-shadow.node create mode 100644 testsuite/gsk/compare/empty-outset-shadow.png create mode 100644 testsuite/gsk/compare/empty-repeat.node create mode 100644 testsuite/gsk/compare/empty-repeat.png create mode 100644 testsuite/gsk/compare/empty-rounded-clip.node create mode 100644 testsuite/gsk/compare/empty-rounded-clip.png create mode 100644 testsuite/gsk/compare/empty-shadow.node create mode 100644 testsuite/gsk/compare/empty-shadow.png create mode 100644 testsuite/gsk/compare/empty-text.node create mode 100644 testsuite/gsk/compare/empty-text.png create mode 100644 testsuite/gsk/compare/empty-texture.node create mode 100644 testsuite/gsk/compare/empty-texture.png create mode 100644 testsuite/gsk/compare/empty-transform.node create mode 100644 testsuite/gsk/compare/empty-transform.png diff --git a/testsuite/gsk/compare/empty-blend.node b/testsuite/gsk/compare/empty-blend.node new file mode 100644 index 0000000000..291d805ff7 --- /dev/null +++ b/testsuite/gsk/compare/empty-blend.node @@ -0,0 +1 @@ +blend { } diff --git a/testsuite/gsk/compare/empty-blend.png b/testsuite/gsk/compare/empty-blend.png new file mode 100644 index 0000000000000000000000000000000000000000..3a032a391ba59878cabf3e55f84ac5700bf00ff0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt_Bo-U3d z5v^~}88RMFU^rkfqdv2OiMhJ!;6#lRcanR**KBA0zlCe9)9MRaL{NMO*_reMwH&H} PCNp@t`njxgN@xNAIEpo5 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-blur.node b/testsuite/gsk/compare/empty-blur.node new file mode 100644 index 0000000000..a4a6298c09 --- /dev/null +++ b/testsuite/gsk/compare/empty-blur.node @@ -0,0 +1,20 @@ +blur { } + +/* The blur algorithm isn't specified, so + don't test it. */ +color { + bounds: -3 -3 50 6; + color: black; +} +color { + bounds: 47 -3 6 50; + color: black; +} +color { + bounds: 3 47 50 6; + color: black; +} +color { + bounds: -3 3 6 50; + color: black; +} diff --git a/testsuite/gsk/compare/empty-blur.png b/testsuite/gsk/compare/empty-blur.png new file mode 100644 index 0000000000000000000000000000000000000000..313d6d8811d8e92dd3c41ab670893301edd1f822 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1SHj;tnma=Y)RhkE)4%caKYZ?lYt^Jo-U3d z8I5nxZ4`8HU|=}7TwTte^iBQytLy}$)6g>xLfU!OVC+B=71=lT2G`+_=_3HU0`ax!Vn;JPTX kNYf>lfPm%Z$Lme?9m-i^FSq|(1GI_3)78&qol`;+0Ct@^m;e9( literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-clip.node b/testsuite/gsk/compare/empty-clip.node new file mode 100644 index 0000000000..c513eb6597 --- /dev/null +++ b/testsuite/gsk/compare/empty-clip.node @@ -0,0 +1 @@ +clip { } diff --git a/testsuite/gsk/compare/empty-clip.png b/testsuite/gsk/compare/empty-clip.png new file mode 100644 index 0000000000000000000000000000000000000000..3a032a391ba59878cabf3e55f84ac5700bf00ff0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt_Bo-U3d z5v^~}88RMFU^rkfqdv2OiMhJ!;6#lRcanR**KBA0zlCe9)9MRaL{NMO*_reMwH&H} PCNp@t`njxgN@xNAIEpo5 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-color-matrix.node b/testsuite/gsk/compare/empty-color-matrix.node new file mode 100644 index 0000000000..c0fcc1cbd5 --- /dev/null +++ b/testsuite/gsk/compare/empty-color-matrix.node @@ -0,0 +1 @@ +color-matrix { } diff --git a/testsuite/gsk/compare/empty-color-matrix.png b/testsuite/gsk/compare/empty-color-matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..3a032a391ba59878cabf3e55f84ac5700bf00ff0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt_Bo-U3d z5v^~}88RMFU^rkfqdv2OiMhJ!;6#lRcanR**KBA0zlCe9)9MRaL{NMO*_reMwH&H} PCNp@t`njxgN@xNAIEpo5 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-color.node b/testsuite/gsk/compare/empty-color.node new file mode 100644 index 0000000000..adaf509095 --- /dev/null +++ b/testsuite/gsk/compare/empty-color.node @@ -0,0 +1 @@ +color { } diff --git a/testsuite/gsk/compare/empty-color.png b/testsuite/gsk/compare/empty-color.png new file mode 100644 index 0000000000000000000000000000000000000000..3a032a391ba59878cabf3e55f84ac5700bf00ff0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt_Bo-U3d z5v^~}88RMFU^rkfqdv2OiMhJ!;6#lRcanR**KBA0zlCe9)9MRaL{NMO*_reMwH&H} PCNp@t`njxgN@xNAIEpo5 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-container.node b/testsuite/gsk/compare/empty-container.node new file mode 100644 index 0000000000..2ab6cf0ccb --- /dev/null +++ b/testsuite/gsk/compare/empty-container.node @@ -0,0 +1,8 @@ +container { } + +/* We need to contain something because 0x0 nodes + cause NULL textures */ +color { + bounds: -1 -1 1 1; + color: transparent; +} diff --git a/testsuite/gsk/compare/empty-container.png b/testsuite/gsk/compare/empty-container.png new file mode 100644 index 0000000000000000000000000000000000000000..7238a646571feebbec4fc4add4e10e261d9be170 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blwj^(N7l!{JxM1({$v_cqPZ!4! ej+w~`3``6RtPG4vp++4*VFpiEKbLh*2~7aI77{%G literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-cross-fade.node b/testsuite/gsk/compare/empty-cross-fade.node new file mode 100644 index 0000000000..1b69ede5fc --- /dev/null +++ b/testsuite/gsk/compare/empty-cross-fade.node @@ -0,0 +1,9 @@ +cross-fade { } + +/* This is not very useful as a test, because the + resulting color is undefined, because 0.5 * 255 + can be rounded to either 127 or 128 by the renderers. + But at least we know they get the size right... */ +color { + color: black; +} diff --git a/testsuite/gsk/compare/empty-cross-fade.png b/testsuite/gsk/compare/empty-cross-fade.png new file mode 100644 index 0000000000000000000000000000000000000000..68e443cac3f7a358a57a75e4055682ff78754bc9 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt^~o-U3d s5v^|z8ZrWThZcPG&*g|;0Azx|4_?_i2F3+5**1cBp00i_>zopr0QMpps{jB1 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-debug.node b/testsuite/gsk/compare/empty-debug.node new file mode 100644 index 0000000000..088a305cf9 --- /dev/null +++ b/testsuite/gsk/compare/empty-debug.node @@ -0,0 +1 @@ +debug { } diff --git a/testsuite/gsk/compare/empty-debug.png b/testsuite/gsk/compare/empty-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..3a032a391ba59878cabf3e55f84ac5700bf00ff0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt_Bo-U3d z5v^~}88RMFU^rkfqdv2OiMhJ!;6#lRcanR**KBA0zlCe9)9MRaL{NMO*_reMwH&H} PCNp@t`njxgN@xNAIEpo5 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-inset-shadow.node b/testsuite/gsk/compare/empty-inset-shadow.node new file mode 100644 index 0000000000..5b84e7c8a5 --- /dev/null +++ b/testsuite/gsk/compare/empty-inset-shadow.node @@ -0,0 +1 @@ +inset-shadow { } diff --git a/testsuite/gsk/compare/empty-inset-shadow.png b/testsuite/gsk/compare/empty-inset-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..b15967478582e7db2e5a2c8f06030b80df3305bc GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-wj^(N7l!{JxM1({$v}}vPZ!6K zjK;U;8F>#F@Eq9i?vLev6*b#cIV>k<&Mco6Vfg8fY(e)#DP>c)tez_pD-DB^mmKrx fB_NP?_5}O;T&9FK4|vW4En)C<^>bP0l+XkKeQi2b literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-linear-gradient.node b/testsuite/gsk/compare/empty-linear-gradient.node new file mode 100644 index 0000000000..ef6234b661 --- /dev/null +++ b/testsuite/gsk/compare/empty-linear-gradient.node @@ -0,0 +1 @@ +linear-gradient { } diff --git a/testsuite/gsk/compare/empty-linear-gradient.png b/testsuite/gsk/compare/empty-linear-gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e1db0e2783d9e195dc29796761786cbe0a6ba4 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt@)o-U3d z5v^~hZWL@V;5pK9{*66{v=En=$HeuEoMt(s|9tbYru5^BS+%zk9r>4ul|%*T<{bIG z!g$@20x{bAc(CCdj-a qTyEvlJk}qpgm(x|jB?}o!FVFbcw%khlpLU27(8A5T-G@yGywqC98Hw~ literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-opacity.node b/testsuite/gsk/compare/empty-opacity.node new file mode 100644 index 0000000000..ef197ada17 --- /dev/null +++ b/testsuite/gsk/compare/empty-opacity.node @@ -0,0 +1,9 @@ +opacity { } + +/* This is not very useful as a test, because the + resulting color is undefined, because 0.5 * 255 + can be rounded to either 127 or 128 by the renderers. + But at least we know they get the size right... */ +color { + color: black; +} diff --git a/testsuite/gsk/compare/empty-opacity.png b/testsuite/gsk/compare/empty-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..68e443cac3f7a358a57a75e4055682ff78754bc9 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt^~o-U3d s5v^|z8ZrWThZcPG&*g|;0Azx|4_?_i2F3+5**1cBp00i_>zopr0QMpps{jB1 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-outset-shadow.node b/testsuite/gsk/compare/empty-outset-shadow.node new file mode 100644 index 0000000000..87858be472 --- /dev/null +++ b/testsuite/gsk/compare/empty-outset-shadow.node @@ -0,0 +1 @@ +outset-shadow { } diff --git a/testsuite/gsk/compare/empty-outset-shadow.png b/testsuite/gsk/compare/empty-outset-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5fd99bddb6149b3db4cedb05ab5b4de17da27a GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^#vshW1|+Q(8fXD2wj^(N7l!{JxM1({$v}}q2 vZn`~D5?c+j60aOuK}ewQ(3#!tHOzKRi&&El*k)t`ZDsIu^>bP0l+XkK=i@$m literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-text.node b/testsuite/gsk/compare/empty-text.node new file mode 100644 index 0000000000..5964c4e7d1 --- /dev/null +++ b/testsuite/gsk/compare/empty-text.node @@ -0,0 +1 @@ +text { } diff --git a/testsuite/gsk/compare/empty-text.png b/testsuite/gsk/compare/empty-text.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7cd8af8d04874a6f765d12cf90e95d63913464 GIT binary patch literal 405 zcmV;G0c!qRuLr^rJrZ{)QaoN4(Sg82HfjcvI=KJo<+`|(^ z1&a-0tN4^qYaOFGb}kADL=S>zA*dO%*ux>_(VECPflZuX0Uh-O6|=&%r>Umk7qp`f z@6m;+1VNJ+#z>ZbgQblBA1b)bIn||pgKM-!xgW3_*?CJ{!UcMw_$wS|BJZeL!eE^* zT8*CH;RRMA-%I~LvbVxi)*|0;{6aT=7VBl@;4BkV#!+G}vnCH`HJWjMw=|?3Nx6-M`2uL^hfU;p;PE&t$m7b_$vGqZTO6REXPDCH+2Ey z*but4jj<>`k`e!CV3#n51L4~Ej@J#iA0K}KNIFFVR{G(J00000NkvXXu0mjf)RC?# literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-texture.node b/testsuite/gsk/compare/empty-texture.node new file mode 100644 index 0000000000..ba8d2d4fb8 --- /dev/null +++ b/testsuite/gsk/compare/empty-texture.node @@ -0,0 +1,12 @@ +texture { } + +/* The bilinear filtering code can differ + between implementations, so cover it */ +color { + bounds: 21 0 10 50; + color: black; +} +color { + bounds: 0 21 50 10; + color: black; +} diff --git a/testsuite/gsk/compare/empty-texture.png b/testsuite/gsk/compare/empty-texture.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5a60636fdf5959d441b78c80b6d0364b70b9d1 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-wj^(N7l!{JxM1({$v}}RPZ!6K zjK;S&Hu4@&;9+rW>Iv$XmM_|HO|PpNz@NUoX1Nv(T{R zn1GaX1`l+S;` VuKlm`UoX%V44$rjF6*2UngFaDO3DBL literal 0 HcmV?d00001 diff --git a/testsuite/gsk/compare/empty-transform.node b/testsuite/gsk/compare/empty-transform.node new file mode 100644 index 0000000000..4833ddb193 --- /dev/null +++ b/testsuite/gsk/compare/empty-transform.node @@ -0,0 +1 @@ +transform { } diff --git a/testsuite/gsk/compare/empty-transform.png b/testsuite/gsk/compare/empty-transform.png new file mode 100644 index 0000000000000000000000000000000000000000..3a032a391ba59878cabf3e55f84ac5700bf00ff0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AY)RhkE)4%caKYZ?lYt_Bo-U3d z5v^~}88RMFU^rkfqdv2OiMhJ!;6#lRcanR**KBA0zlCe9)9MRaL{NMO*_reMwH&H} PCNp@t`njxgN@xNAIEpo5 literal 0 HcmV?d00001 diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index e2e0328284..cecc0ebed0 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -32,6 +32,25 @@ compare_render_tests = [ 'clipped_rounded_clip', 'color-blur0', 'cross-fade-in-opacity', + 'empty-blend', + 'empty-blur', + 'empty-border', + 'empty-clip', + 'empty-color', + 'empty-color-matrix', + 'empty-container', + 'empty-cross-fade', + 'empty-debug', + 'empty-inset-shadow', + 'empty-linear-gradient', + 'empty-opacity', + 'empty-outset-shadow', + 'empty-repeat', + 'empty-rounded-clip', + 'empty-shadow', + 'empty-text', + 'empty-texture', + 'empty-transform', 'opacity_clip', 'outset_shadow_offset_both', 'outset_shadow_offset_x', From 63a8144e1ad02b8660d1041b7853af9a14eba92e Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 20 May 2019 03:38:45 +0200 Subject: [PATCH 14/14] testsuite: Remove serialize-deserialize test The serialize-deserialize test is completely handled via the new nodeparser tests. So move those tests over and delete the old test binary. --- testsuite/gsk/meson.build | 41 +++--------- .../blend.node | 0 testsuite/gsk/nodeparser/blend.ref.node | 24 +++++++ .../border.node | 0 testsuite/gsk/nodeparser/border.ref.node | 4 ++ .../color.node | 0 testsuite/gsk/nodeparser/color.ref.node | 4 ++ .../debug.node | 3 +- .../rounded-rect.node | 0 .../gsk/nodeparser/rounded-rect.ref.node | 63 +++++++++++++++++++ .../shadow.node | 0 testsuite/gsk/nodeparser/shadow.ref.node | 7 +++ .../testswitch.node | 0 .../widgetfactory.node | 0 testsuite/gsk/serialize-deserialize.c | 58 ----------------- 15 files changed, 112 insertions(+), 92 deletions(-) rename testsuite/gsk/{serializedeserialize => nodeparser}/blend.node (100%) create mode 100644 testsuite/gsk/nodeparser/blend.ref.node rename testsuite/gsk/{serializedeserialize => nodeparser}/border.node (100%) create mode 100644 testsuite/gsk/nodeparser/border.ref.node rename testsuite/gsk/{serializedeserialize => nodeparser}/color.node (100%) create mode 100644 testsuite/gsk/nodeparser/color.ref.node rename testsuite/gsk/{serializedeserialize => nodeparser}/debug.node (62%) rename testsuite/gsk/{serializedeserialize => nodeparser}/rounded-rect.node (100%) create mode 100644 testsuite/gsk/nodeparser/rounded-rect.ref.node rename testsuite/gsk/{serializedeserialize => nodeparser}/shadow.node (100%) create mode 100644 testsuite/gsk/nodeparser/shadow.ref.node rename testsuite/gsk/{serializedeserialize => nodeparser}/testswitch.node (100%) rename testsuite/gsk/{serializedeserialize => nodeparser}/widgetfactory.node (100%) delete mode 100644 testsuite/gsk/serialize-deserialize.c diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index cecc0ebed0..4751dfd537 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -17,14 +17,6 @@ node_parser = executable( install_dir: testexecdir ) -serialize_deserialize = executable( - 'serialize-deserialize', - ['serialize-deserialize.c'], - dependencies: libgtk_dep, - install: get_option('install-tests'), - install_dir: testexecdir, -) - compare_render_tests = [ 'blend-normal', 'blend-difference', @@ -88,6 +80,9 @@ foreach renderer : renderers endforeach node_parser_tests = [ + 'blend.node', + 'border.node', + 'color.node', 'crash1.errors', 'crash1.node', 'crash1.ref.node', @@ -99,6 +94,7 @@ node_parser_tests = [ 'crash4.errors', 'crash4.node', 'crash4.ref.node', + 'debug.node', 'empty-blend.node', 'empty-blend.ref.node', 'empty-blur.node', @@ -137,6 +133,10 @@ node_parser_tests = [ 'empty-texture.ref.node', 'empty-transform.node', 'empty-transform.ref.node', + 'rounded-rect.node', + 'shadow.node', + 'testswitch.node', + 'widgetfactory.node', ] foreach test : node_parser_tests @@ -155,28 +155,3 @@ foreach test : node_parser_tests suite: 'gsk') endif endforeach - -serialize_deserialize_tests = [ - 'blend', - 'border', - 'color', - 'debug', - 'rounded-rect', - 'shadow', - 'testswitch', - 'widgetfactory', -] - -foreach test : serialize_deserialize_tests - test('serialize-deserialize ' + test, serialize_deserialize, - args: [join_paths(meson.current_source_dir(), 'serializedeserialize', test + '.node')], - env: [ 'GIO_USE_VOLUME_MONITOR=unix', - 'GSETTINGS_BACKEND=memory', - 'GTK_CSD=1', - 'G_ENABLE_DIAGNOSTIC=0', - 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), - 'GSK_RENDERER=opengl' - ], - suite: 'gsk') -endforeach diff --git a/testsuite/gsk/serializedeserialize/blend.node b/testsuite/gsk/nodeparser/blend.node similarity index 100% rename from testsuite/gsk/serializedeserialize/blend.node rename to testsuite/gsk/nodeparser/blend.node diff --git a/testsuite/gsk/nodeparser/blend.ref.node b/testsuite/gsk/nodeparser/blend.ref.node new file mode 100644 index 0000000000..49dd83f842 --- /dev/null +++ b/testsuite/gsk/nodeparser/blend.ref.node @@ -0,0 +1,24 @@ +blend { + bottom: container { + } + top: container { + } +} +blend { + bottom: container { + } + mode: color-dodge; + top: container { + } +} +blend { + bottom: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } + mode: difference; + top: color { + bounds: 0 0 50 50; + color: rgb(255,0,204); + } +} diff --git a/testsuite/gsk/serializedeserialize/border.node b/testsuite/gsk/nodeparser/border.node similarity index 100% rename from testsuite/gsk/serializedeserialize/border.node rename to testsuite/gsk/nodeparser/border.node diff --git a/testsuite/gsk/nodeparser/border.ref.node b/testsuite/gsk/nodeparser/border.ref.node new file mode 100644 index 0000000000..4a67ccd849 --- /dev/null +++ b/testsuite/gsk/nodeparser/border.ref.node @@ -0,0 +1,4 @@ +border { + colors: rgb(213,208,204); + outline: -1 -1 50 26 / 13; +} diff --git a/testsuite/gsk/serializedeserialize/color.node b/testsuite/gsk/nodeparser/color.node similarity index 100% rename from testsuite/gsk/serializedeserialize/color.node rename to testsuite/gsk/nodeparser/color.node diff --git a/testsuite/gsk/nodeparser/color.ref.node b/testsuite/gsk/nodeparser/color.ref.node new file mode 100644 index 0000000000..bf5ba1027a --- /dev/null +++ b/testsuite/gsk/nodeparser/color.ref.node @@ -0,0 +1,4 @@ +color { + bounds: 100 100 200 300; + color: rgb(255,0,0); +} diff --git a/testsuite/gsk/serializedeserialize/debug.node b/testsuite/gsk/nodeparser/debug.node similarity index 62% rename from testsuite/gsk/serializedeserialize/debug.node rename to testsuite/gsk/nodeparser/debug.node index cf3c2634e6..cd68defd52 100644 --- a/testsuite/gsk/serializedeserialize/debug.node +++ b/testsuite/gsk/nodeparser/debug.node @@ -1,4 +1,5 @@ debug { + child: container { + } message: "I'm a debug node."; - child: container {} } diff --git a/testsuite/gsk/serializedeserialize/rounded-rect.node b/testsuite/gsk/nodeparser/rounded-rect.node similarity index 100% rename from testsuite/gsk/serializedeserialize/rounded-rect.node rename to testsuite/gsk/nodeparser/rounded-rect.node diff --git a/testsuite/gsk/nodeparser/rounded-rect.ref.node b/testsuite/gsk/nodeparser/rounded-rect.ref.node new file mode 100644 index 0000000000..16c12d0afd --- /dev/null +++ b/testsuite/gsk/nodeparser/rounded-rect.ref.node @@ -0,0 +1,63 @@ +border { + outline: 0 0 100 100; +} +border { + outline: 0 0 100 100 / 50; +} +border { + outline: 0 0 100 100 / 100 0 100 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0; +} +border { + outline: 0 0 100 100 / 50; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 50 50 50; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 50 50 50; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 50 50 50; +} +border { + outline: 0 0 100 100 / 50 50 50 50 / 25 0 25 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 50 50 50 50 / 25 0 25 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 50 50 50 50 / 25 0 25 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} +border { + outline: 0 0 100 100 / 100 0 100 0 / 50 0 50 0; +} diff --git a/testsuite/gsk/serializedeserialize/shadow.node b/testsuite/gsk/nodeparser/shadow.node similarity index 100% rename from testsuite/gsk/serializedeserialize/shadow.node rename to testsuite/gsk/nodeparser/shadow.node diff --git a/testsuite/gsk/nodeparser/shadow.ref.node b/testsuite/gsk/nodeparser/shadow.ref.node new file mode 100644 index 0000000000..bf4c27b69a --- /dev/null +++ b/testsuite/gsk/nodeparser/shadow.ref.node @@ -0,0 +1,7 @@ +shadow { + child: color { + bounds: 100 100 100 100; + color: rgb(0,128,0); + } + shadows: rgb(255,0,0) 10 10 4, rgb(0,0,255) -10 -10 8; +} diff --git a/testsuite/gsk/serializedeserialize/testswitch.node b/testsuite/gsk/nodeparser/testswitch.node similarity index 100% rename from testsuite/gsk/serializedeserialize/testswitch.node rename to testsuite/gsk/nodeparser/testswitch.node diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node b/testsuite/gsk/nodeparser/widgetfactory.node similarity index 100% rename from testsuite/gsk/serializedeserialize/widgetfactory.node rename to testsuite/gsk/nodeparser/widgetfactory.node diff --git a/testsuite/gsk/serialize-deserialize.c b/testsuite/gsk/serialize-deserialize.c deleted file mode 100644 index 452093c6ec..0000000000 --- a/testsuite/gsk/serialize-deserialize.c +++ /dev/null @@ -1,58 +0,0 @@ -#include - -static void -deserialize_error_func (const GtkCssSection *section, - const GError *error, - gpointer user_data) -{ - char *section_str = gtk_css_section_to_string (section); - - g_error ("Error at %s: %s", section_str, error->message); - - free (section_str); -} - -int -main (int argc, char **argv) -{ - GError *error = NULL; - GskRenderNode *node; - GskRenderNode *deserialized; - GBytes *bytes; - GFile *file; - - g_assert (argc == 2); - - gtk_init (); - - file = g_file_new_for_commandline_arg (argv[1]); - bytes = g_file_load_bytes (file, NULL, NULL, &error); - g_assert_no_error (error); - g_assert (bytes != NULL); - - node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); - g_assert_no_error (error); - - /* Now serialize */ - g_bytes_unref (bytes); - bytes = gsk_render_node_serialize (node); - /* and deserialize again... */ - deserialized = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); - if (error) - g_message ("OUTPUT:\n%.*s", (int)g_bytes_get_size (bytes), (char *)g_bytes_get_data (bytes, NULL)); - - g_assert_no_error (error); - - /* And check if that all worked. */ - g_assert_cmpint (gsk_render_node_get_node_type (deserialized), ==, - gsk_render_node_get_node_type (node)); - - - g_clear_error (&error); - g_clear_pointer (&node, gsk_render_node_unref); - g_clear_pointer (&deserialized, gsk_render_node_unref); - g_bytes_unref (bytes); - g_object_unref (file); - - return 0; -}