diff options
author | Benjamin Otte <otte.benjamin@googlemail.com> | 2019-05-21 05:22:41 +0000 |
---|---|---|
committer | Benjamin Otte <otte.benjamin@googlemail.com> | 2019-05-21 05:22:41 +0000 |
commit | 321a21015ecc88dd51be2f665ea25cbc374e5c26 (patch) | |
tree | 00d04d06c9bae44974bd91c70b4112e8abacab10 | |
parent | fc2dc82b708dd550bdaac180779dbb97333a654e (diff) | |
parent | 63a8144e1ad02b8660d1041b7853af9a14eba92e (diff) | |
download | gtk+-321a21015ecc88dd51be2f665ea25cbc374e5c26.tar.gz |
Merge branch 'wip/otte/for-master' into 'master'
Wip/otte/for master
See merge request GNOME/gtk!860
116 files changed, 2193 insertions, 1464 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/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 1a9f20bf02..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)) @@ -2605,11 +2606,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: diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index 1b1dd2d78f..2e4753a2e0 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -311,34 +311,6 @@ gsk_render_node_diff (GskRenderNode *node1, #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 * @filename: the file to save it to. diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index b1ae30785e..cdb59a46f4 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -292,10 +292,9 @@ 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); +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 @@ -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..d0a24ed463 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); @@ -3577,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; @@ -3607,24 +3602,14 @@ gsk_text_node_peek_glyphs (GskRenderNode *node) return self->glyphs; } -float -gsk_text_node_get_x (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->x; -} - -float -gsk_text_node_get_y (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->y; + return &self->offset; } /*** GSK_BLUR_NODE ***/ @@ -3681,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++) @@ -3689,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 */ @@ -3707,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; @@ -3730,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; @@ -3740,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 */ @@ -3757,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; diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index e0b881310d..ab7b3bd2a8 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 <http://www.gnu.org/licenses/>. + * + * Authors: Benjamin Otte <otte@gnome.org> + * Timm Bäder <mail@baedert.org> + */ + +#include "config.h" #include "gskrendernodeparserprivate.h" @@ -8,8 +30,8 @@ #include "gdk/gdkrgbaprivate.h" #include "gdk/gdktextureprivate.h" #include <gtk/css/gtkcss.h> -#include "gtk/css/gtkcssparserprivate.h" #include "gtk/css/gtkcssdataurlprivate.h" +#include "gtk/css/gtkcssparserprivate.h" typedef struct _Declaration Declaration; @@ -319,17 +341,59 @@ 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; } @@ -340,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)) @@ -352,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; } @@ -419,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); @@ -441,10 +498,86 @@ parse_font (GtkCssParser *parser, pango_font_description_free (desc); g_object_unref (context); + 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) +{ + 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; } @@ -459,49 +592,64 @@ 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])); + glyph_string = pango_glyph_string_new (); - for (;;) + do { - double values[5]; + PangoGlyphInfo gi = { 0, { 0, 0, 0}, { 1 } }; + double d, d2; + int i; - /* We have 5 numbers per glyph */ - for (i = 0; i < 5; i ++) + if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_STRING)) { - if (!gtk_css_parser_consume_number (parser, &values[i])) - return FALSE; - } - - g_array_append_val (glyphs, values); + char *s = gtk_css_parser_consume_string (parser); - if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_COMMA)) - gtk_css_parser_skip (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 - break; - } - - glyph_string = pango_glyph_string_new (); - pango_glyph_string_set_size (glyph_string, glyphs->len); + { + 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); - for (i = 0; i < glyphs->len; i ++) - { - PangoGlyphInfo g; - double *v = (double *)(glyphs->data + (i * sizeof (double) * 5)); + 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); - 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_try_ident (parser, "same-cluster")) + gi.attr.is_cluster_start = 0; + else + gi.attr.is_cluster_start = 1; + } - glyph_string->glyphs[i] = g; + 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; @@ -621,10 +769,16 @@ parse_declarations (GtkCssParser *parser, } 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 = { 0, 0, 0, 1 }; + 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 }, @@ -638,9 +792,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 }, @@ -653,8 +807,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); @@ -667,8 +825,8 @@ parse_linear_gradient_node (GtkCssParser *parser) static GskRenderNode * parse_inset_shadow_node (GtkCssParser *parser) { - GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); - GdkRGBA color = { 0, 0, 0, 1 }; + 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[] = { { "outline", parse_rounded_rect, NULL, &outline }, @@ -687,24 +845,24 @@ parse_inset_shadow_node (GtkCssParser *parser) 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 } }; + 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[] = { { "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 * 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 }, @@ -716,8 +874,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); @@ -729,8 +900,8 @@ parse_texture_node (GtkCssParser *parser) static GskRenderNode * parse_outset_shadow_node (GtkCssParser *parser) { - GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 0, 0); - GdkRGBA color = { 0, 0, 0, 1 }; + 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[] = { { "outline", parse_rounded_rect, NULL, &outline }, @@ -759,11 +930,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 (); @@ -780,7 +948,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 }, @@ -789,10 +957,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); @@ -818,10 +983,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, @@ -851,16 +1013,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); @@ -884,16 +1040,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); @@ -919,10 +1069,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); @@ -936,18 +1083,49 @@ 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) { PangoFont *font = NULL; - double x = 0; - double y = 0; - GdkRGBA color = { 0, 0, 0, 1 }; + graphene_point_t offset = GRAPHENE_POINT_INIT (0, 0); + GdkRGBA color = GDK_RGBA("000000"); 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 } }; @@ -955,14 +1133,48 @@ parse_text_node (GtkCssParser *parser) parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); - if (!font || !glyphs) - return NULL; + if (font == NULL) + { + font = font_from_string ("Cantarell 11"); + g_assert (font); + } - result = gsk_text_node_new (font, glyphs, &color, x, y); + if (!glyphs) + { + const char *text = "Hello"; + PangoGlyphInfo gi = { 0, { 0, 0, 0}, { 1 } }; + guint i; + + 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; } @@ -970,7 +1182,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 }, @@ -979,10 +1191,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); @@ -994,22 +1203,22 @@ parse_blur_node (GtkCssParser *parser) static GskRenderNode * parse_clip_node (GtkCssParser *parser) { - graphene_rect_t clip = GRAPHENE_RECT_INIT (0, 0, 0, 0); + GskRoundedRect clip = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50); GskRenderNode *child = NULL; const Declaration declarations[] = { - { "clip", parse_rect, NULL, &clip }, + { "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) - { - gtk_css_parser_error_syntax (parser, "Missing \"child\" property definition"); - return NULL; - } + child = create_default_render_node (); - result = gsk_clip_node_new (child, &clip); + 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); @@ -1019,7 +1228,7 @@ parse_clip_node (GtkCssParser *parser) 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 }, @@ -1029,10 +1238,7 @@ 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 (); result = gsk_rounded_clip_node_new (child, &clip); @@ -1054,15 +1260,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); @@ -1086,10 +1289,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); @@ -1379,8 +1579,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); @@ -1536,9 +1741,9 @@ render_node_print (Printer *p, { start_node (p, "cross-fade"); - 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)); + 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); } @@ -1547,33 +1752,26 @@ 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"); 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:"); - 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); @@ -1584,8 +1782,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), 0.5f); end_node (p); } @@ -1593,14 +1791,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), 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_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, "spread", gsk_outset_shadow_node_get_spread (node)); - append_float_param (p, "blur", gsk_outset_shadow_node_get_blur_radius (node)); + append_float_param (p, "spread", gsk_outset_shadow_node_get_spread (node), 0.0f); end_node (p); } @@ -1610,8 +1811,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 +1822,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); @@ -1631,10 +1832,12 @@ render_node_print (Printer *p, case GSK_TRANSFORM_NODE: { + GskTransform *transform = gsk_transform_node_get_transform (node); 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)); + if (gsk_transform_get_category (transform) != GSK_TRANSFORM_CATEGORY_IDENTITY) + append_transform_param (p, "transform", transform); end_node (p); } @@ -1644,9 +1847,11 @@ render_node_print (Printer *p, { start_node (p, "color-matrix"); - 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)); + 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); } @@ -1654,31 +1859,60 @@ 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"); - append_rounded_rect_param (p, "outline", gsk_border_node_peek_outline (node)); + 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 if (!gdk_rgba_equal (&colors[0], &GDK_RGBA("000000"))) + n = 1; + else + n = 0; + + 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"); + } - _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"); + append_rounded_rect_param (p, "outline", gsk_border_node_peek_outline (node)); - _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 (widths[3] != widths[1]) + n = 4; + else if (widths[2] != widths[0]) + n = 3; + else if (widths[1] != widths[0]) + n = 2; + else if (widths[0] != 1.0) + n = 1; + else + n = 0; + + 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); } @@ -1691,6 +1925,8 @@ render_node_print (Printer *p, start_node (p, "shadow"); + 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 ++) @@ -1698,17 +1934,20 @@ render_node_print (Printer *p, 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); } @@ -1716,22 +1955,22 @@ 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; 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), 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_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, "spread", gsk_inset_shadow_node_get_spread (node)); - append_float_param (p, "blur", gsk_inset_shadow_node_get_blur_radius (node)); + append_float_param (p, "spread", gsk_inset_shadow_node_get_spread (node), 0.0f); end_node (p); } @@ -1765,56 +2004,108 @@ 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); + 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); - 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); + str = g_string_new (NULL); 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 (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); + 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"); + } + + 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'); + if (!graphene_point_equal (offset, graphene_point_zero ())) + append_point_param (p, "offset", offset); + end_node (p); + + g_string_free (str, TRUE); + if (ascii) + pango_glyph_string_free (ascii); } break; 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); + } - append_node_param (p, "child", gsk_debug_node_get_child (node)); end_node (p); } break; @@ -1823,7 +2114,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); @@ -1832,11 +2123,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); - append_rect_param (p, "child-bounds", gsk_repeat_node_peek_child_bounds (node)); + 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)); + if (!graphene_rect_equal (child_bounds, &child->bounds)) + append_rect_param (p, "child-bounds", child_bounds); end_node (p); } @@ -1849,17 +2145,21 @@ render_node_print (Printer *p, start_node (p, "blend"); - _indent (p); - for (i = 0; i < G_N_ELEMENTS (blend_modes); i++) + append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node)); + + 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)); - append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node)); end_node (p); } @@ -1877,13 +2177,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 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/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/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); - - /* Now compare the two */ - diff_surface = reftest_compare_surfaces (rendered_surface, reference_surface); + 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); + + 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; } 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 Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-blend.png 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 Binary files differnew file mode 100644 index 0000000000..313d6d8811 --- /dev/null +++ b/testsuite/gsk/compare/empty-blur.png diff --git a/testsuite/gsk/compare/empty-border.node b/testsuite/gsk/compare/empty-border.node new file mode 100644 index 0000000000..0a58c89c65 --- /dev/null +++ b/testsuite/gsk/compare/empty-border.node @@ -0,0 +1 @@ +border { } diff --git a/testsuite/gsk/compare/empty-border.png b/testsuite/gsk/compare/empty-border.png Binary files differnew file mode 100644 index 0000000000..5d3e0fdcb1 --- /dev/null +++ b/testsuite/gsk/compare/empty-border.png 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 Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-clip.png 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 Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-color-matrix.png 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 Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-color.png 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 Binary files differnew file mode 100644 index 0000000000..7238a64657 --- /dev/null +++ b/testsuite/gsk/compare/empty-container.png 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 Binary files differnew file mode 100644 index 0000000000..68e443cac3 --- /dev/null +++ b/testsuite/gsk/compare/empty-cross-fade.png 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 Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-debug.png 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 Binary files differnew file mode 100644 index 0000000000..b159674785 --- /dev/null +++ b/testsuite/gsk/compare/empty-inset-shadow.png 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 Binary files differnew file mode 100644 index 0000000000..f0e1db0e27 --- /dev/null +++ b/testsuite/gsk/compare/empty-linear-gradient.png 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 Binary files differnew file mode 100644 index 0000000000..68e443cac3 --- /dev/null +++ b/testsuite/gsk/compare/empty-opacity.png 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 Binary files differnew file mode 100644 index 0000000000..3a5fd99bdd --- /dev/null +++ b/testsuite/gsk/compare/empty-outset-shadow.png diff --git a/testsuite/gsk/compare/empty-repeat.node b/testsuite/gsk/compare/empty-repeat.node new file mode 100644 index 0000000000..9f82f0e3ac --- /dev/null +++ b/testsuite/gsk/compare/empty-repeat.node @@ -0,0 +1 @@ +repeat { } diff --git a/testsuite/gsk/compare/empty-repeat.png b/testsuite/gsk/compare/empty-repeat.png Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-repeat.png diff --git a/testsuite/gsk/compare/empty-rounded-clip.node b/testsuite/gsk/compare/empty-rounded-clip.node new file mode 100644 index 0000000000..28373aa45f --- /dev/null +++ b/testsuite/gsk/compare/empty-rounded-clip.node @@ -0,0 +1 @@ +rounded-clip { } diff --git a/testsuite/gsk/compare/empty-rounded-clip.png b/testsuite/gsk/compare/empty-rounded-clip.png Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-rounded-clip.png diff --git a/testsuite/gsk/compare/empty-shadow.node b/testsuite/gsk/compare/empty-shadow.node new file mode 100644 index 0000000000..3f4879359d --- /dev/null +++ b/testsuite/gsk/compare/empty-shadow.node @@ -0,0 +1 @@ +shadow { } diff --git a/testsuite/gsk/compare/empty-shadow.png b/testsuite/gsk/compare/empty-shadow.png Binary files differnew file mode 100644 index 0000000000..47617ce64c --- /dev/null +++ b/testsuite/gsk/compare/empty-shadow.png 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 Binary files differnew file mode 100644 index 0000000000..cd7cd8af8d --- /dev/null +++ b/testsuite/gsk/compare/empty-text.png 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 Binary files differnew file mode 100644 index 0000000000..bb5a60636f --- /dev/null +++ b/testsuite/gsk/compare/empty-texture.png 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 Binary files differnew file mode 100644 index 0000000000..3a032a391b --- /dev/null +++ b/testsuite/gsk/compare/empty-transform.png diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 20851649b3..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', @@ -32,6 +24,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', @@ -69,47 +80,78 @@ foreach renderer : renderers endforeach node_parser_tests = [ - 'crash1', - 'crash2', - 'crash3', - 'crash4', + 'blend.node', + 'border.node', + 'color.node', + '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', + 'debug.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', + 'rounded-rect.node', + 'shadow.node', + 'testswitch.node', + 'widgetfactory.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') -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') + 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 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 <otte@redhat.com> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + #include <gtk/gtk.h> +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; + + section_string = gtk_css_section_to_string (section); - /* 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); + g_string_append_printf (errors, + "%s: error: ", + section_string); + g_free (section_string); - free (section_str); + 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'); } -int -main (int argc, char **argv) +static gboolean +parse_node_file (GFile *file, gboolean generate) { - GError *error = NULL; + char *node_file, *reference_file, *errors_file; GskRenderNode *node; - GBytes *bytes; - GFile *file; + GString *errors; + GBytes *diff, *bytes; + GError *error = NULL; + gboolean result = TRUE; - g_assert (argc == 2); + 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); - gtk_init (); + errors = g_string_new (""); - file = g_file_new_for_commandline_arg (argv[1]); - bytes = g_file_load_bytes (file, NULL, NULL, &error); + 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); - g_assert (bytes != NULL); - node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); - if (error) - g_test_message ("Error: %s\n", error->message); + 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); - g_clear_error (&error); - g_clear_pointer (&node, gsk_render_node_unref); + 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); - g_object_unref (file); - return 0; + 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) +{ + gboolean success; + + gtk_test_init (&argc, &argv); + + if (argc < 2) + { + const char *basedir; + GFile *dir; + + basedir = g_test_get_dir (G_TEST_DIST); + dir = g_file_new_for_path (basedir); + success = test_files_in_directory (dir); + + g_object_unref (dir); + } + else if (strcmp (argv[1], "--generate") == 0) + { + if (argc >= 3) + { + GFile *file = g_file_new_for_commandline_arg (argv[2]); + + success = parse_node_file (file, TRUE); + + 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/serializedeserialize/blend.node b/testsuite/gsk/nodeparser/blend.node index 0b228ade85..0b228ade85 100644 --- a/testsuite/gsk/serializedeserialize/blend.node +++ b/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 index 89b490329f..89b490329f 100644 --- a/testsuite/gsk/serializedeserialize/border.node +++ b/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 index acbc79288d..acbc79288d 100644 --- a/testsuite/gsk/serializedeserialize/color.node +++ b/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/nodeparser/crash1.errors b/testsuite/gsk/nodeparser/crash1.errors new file mode 100644 index 0000000000..b47b8c75f0 --- /dev/null +++ b/testsuite/gsk/nodeparser/crash1.errors @@ -0,0 +1,3 @@ +<data>:2:9-10: error: GTK_CSS_PARSER_ERROR_SYNTAX +<data>:2:17-3:1: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>: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..a02df0f9e8 --- /dev/null +++ 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 new file mode 100644 index 0000000000..91bb427e87 --- /dev/null +++ b/testsuite/gsk/nodeparser/crash2.errors @@ -0,0 +1,3 @@ +<data>:2:3-7: error: GTK_CSS_PARSER_ERROR_SYNTAX +<data>:2:15-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>: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..76ab4d6943 --- /dev/null +++ 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/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 @@ +<data>: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..e9b8985745 --- /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(255,0,204); + } +} diff --git a/testsuite/gsk/serializedeserialize/debug.node b/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/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 --- /dev/null +++ b/testsuite/gsk/nodeparser/empty-container.ref.node 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); + } +} diff --git a/testsuite/gsk/serializedeserialize/rounded-rect.node b/testsuite/gsk/nodeparser/rounded-rect.node index 5aeeb0b9f1..5aeeb0b9f1 100644 --- a/testsuite/gsk/serializedeserialize/rounded-rect.node +++ b/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 index a957ce7988..a957ce7988 100644 --- a/testsuite/gsk/serializedeserialize/shadow.node +++ b/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 index 940d821e00..89d884bcda 100644 --- a/testsuite/gsk/serializedeserialize/testswitch.node +++ b/testsuite/gsk/nodeparser/testswitch.node @@ -1,5 +1,4 @@ transform { - transform: translate(0, 0); child: container { color { bounds: 0 0 404 204; @@ -8,382 +7,335 @@ 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); 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; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: -1 -1 26 26 / 13; } outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; - spread: 0; - blur: 2; + outline: -1 -1 26 26 / 13; } rounded-clip { - clip: -1 -1 26 26 / 13; child: 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); + 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; color: rgb(255,255,255); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: 0 0 24 24 / 12; } } border { + colors: 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Disabled"; + offset: 145 18; } + 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); 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; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: -1 -1 26 26 / 13; } outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; - spread: 0; - blur: 2; + outline: -1 -1 26 26 / 13; } 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; color: rgb(255,255,255); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: 0 0 24 24 / 12; } } border { + colors: 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Enabled"; + offset: 147 18; } + 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); 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Disabled"; + offset: 145 18; } + 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); 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Enabled"; + offset: 147 18; } + 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); 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; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: -1 -1 26 26 / 13; } outset-shadow { - outline: -1 -1 26 26 / 13; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; - spread: 0; - blur: 2; + outline: -1 -1 26 26 / 13; } rounded-clip { - clip: -1 -1 26 26 / 13; child: 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); + 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; color: rgb(255,255,255); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: 0 0 24 24 / 12; } } border { + colors: 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Disabled"; + offset: 123 18; } + 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; color: rgba(0,0,0,0.1); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: -1 -1 16 16 / 3; } outset-shadow { - outline: -1 -1 16 16 / 3; + blur: 2; color: rgba(0,0,0,0.07); dx: 0; - dy: 1; - spread: 0; - blur: 2; + outline: -1 -1 16 16 / 3; } linear-gradient { bounds: 0 0 14 14; - start: 7 0; end: 7 14; - stops: 0.2 rgb(255,255,255),0.9 rgb(246,245,244); + start: 7 0; + stops: 0.2 rgb(255,255,255), 0.9 rgb(246,245,244); } inset-shadow { - outline: 0 0 14 14 / 2; color: rgb(255,255,255); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: 0 0 14 14 / 2; } } border { + colors: 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/nodeparser/widgetfactory.node index 780a847bd4..36b5f1b328 100644 --- a/testsuite/gsk/serializedeserialize/widgetfactory.node +++ b/testsuite/gsk/nodeparser/widgetfactory.node @@ -1,22 +1,20 @@ 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; 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 +22,1338 @@ 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; - stops: 0.08 rgb(227,234,242),0.25 rgb(246,245,244); + 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,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"); } + 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; color: rgba(255,255,255,0.8); dx: 0; - dy: 1; - spread: 0; - blur: 0; + outline: -6 0 1464 46 / 7 7 0 0; } } border { + colors: 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); + widths: 0 0 1; } 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Page 1"; + offset: 0 17; } + 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Page 2"; + offset: 0 17; } + 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Page 3"; + offset: 0 17; } + 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); 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=="); } + 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 { - 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; 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "comboboxentry"; + offset: 0 21; } clip { - clip: 0 6 101 19; child: container { color { bounds: 0 0 357 32; color: rgb(53,132,228); } text { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "comboboxentry"; + offset: 0 21; } } + 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 { - 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); + outline: -10 -5 36 34 / 0 5 5 0; } 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "comboboxentry"; + offset: 0 21; } + 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); 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Click icon to change mode"; + offset: 0 21; } + 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "entry"; + offset: 0 21; } + 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "entry"; + offset: 0 22; } + 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); 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Left"; + offset: 2 17; } 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Middle"; + offset: 2 17; } 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Right"; + offset: 2 17; } 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "label"; + offset: 0 22; } transform { - transform: translate(52, 0); child: text { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "label"; + offset: 0 22; } + 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); 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 { - font: "Cantarell 11"; - x: 0; - y: 15; color: rgb(50,50,50); - glyphs: 682 8192 0 0 1, 677 9216 0 0 1; + font: "Cantarell 11"; + glyphs: "50"; + offset: 0 15; } + transform: translate(6, 6); } transform { - transform: translate(40, 0) translate(6, 0); child: container { border { + colors: 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=="); } + 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 { - transform: translate(75, 0) translate(6, 0); child: container { border { + colors: 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, 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+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); 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 { - font: "Cantarell 11"; - x: 0; - y: 15; color: rgb(212,207,202); - glyphs: 677 9216 0 0 1; + font: "Cantarell 11"; + glyphs: "0"; + offset: 0 15; } + 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); 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); 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 { - transform: 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); 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"); } + 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 { - 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; + font: "Cantarell 11"; + glyphs: "checkbutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(0, 2); } 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 { + colors: 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); } } + transform: translate(5, 2); } 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; + font: "Cantarell 11"; + glyphs: "checkbutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(0, 29) translate(0, 2); } 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); 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 { - 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; + font: "Cantarell 11"; + glyphs: "checkbutton"; + offset: 0 15; } + 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); 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"); } + 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 { - 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; + font: "Cantarell 11"; + glyphs: "checkbutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(0, 87) translate(0, 2); } 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 { + colors: 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); } } + transform: translate(5, 2); } 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; + font: "Cantarell 11"; + glyphs: "checkbutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(0, 116) translate(0, 2); } 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 { + colors: 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+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 { - 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; + font: "Cantarell 11"; + glyphs: "checkbutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(0, 145) translate(0, 2); } 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); } + clip: -1 -1 16 16 / 8; } border { + colors: 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); } } + transform: translate(5, 2); } 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; + font: "Cantarell 11"; + glyphs: "radiobutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(125, 0) 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); } + clip: -1 -1 16 16 / 8; } border { + colors: 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); } } + transform: translate(5, 2); } 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; + font: "Cantarell 11"; + glyphs: "radiobutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(125, 29) 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); } + clip: -1 -1 16 16 / 8; } border { + colors: 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.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 { - 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; + font: "Cantarell 11"; + glyphs: "radiobutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(125, 58) translate(0, 2); } transform { - transform: translate(125, 87) 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); } + clip: -1 -1 16 16 / 8; } border { + colors: 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="); } + 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 { - 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; + font: "Cantarell 11"; + glyphs: "radiobutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(125, 87) translate(0, 2); } 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); } + clip: -1 -1 16 16 / 8; } border { + colors: 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); } } + transform: translate(5, 2); } 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; + font: "Cantarell 11"; + glyphs: "radiobutton"; + offset: 0 15; } + transform: translate(24, 0); } } + transform: translate(125, 116) translate(0, 2); } 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); } + clip: -1 -1 16 16 / 8; } border { + colors: 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+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 { - 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; + font: "Cantarell 11"; + glyphs: "radiobutton"; + offset: 0 15; } + 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); 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); - 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; + font: "Cantarell 11"; + glyphs: "togglebutton"; + offset: 2 17; } } + 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); 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(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; + font: "Cantarell 11"; + glyphs: "togglebutton"; + offset: 2 17; } } + 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); 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); - 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; + font: "Cantarell 11"; + glyphs: "togglebutton"; + offset: 2 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); 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(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; + font: "Cantarell 11"; + glyphs: "togglebutton"; + offset: 2 17; } } + 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Andrea"; + offset: 2 17; } 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Otto"; + offset: 2 17; } 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Sans Regular"; + offset: 0 17; } transform { - transform: translate(86, 0); child: transform { - transform: translate(1, 0); child: text { - font: "Cantarell Bold 11"; - x: 0; - y: 17; color: rgb(146,149,149); - glyphs: 678 7168 0 0 1, 679 8192 0 0 1; + font: "Cantarell Bold 11"; + glyphs: "12"; + offset: 0 17; } + 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); 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 +1361,821 @@ transform { color: rgb(49,104,160); } transform { - transform: translate(1, 1); child: border { + colors: 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "(None)"; + offset: 0 17; } + 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "link button"; + offset: 10 17; } 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); 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); 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); 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); 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); 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); 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); 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); 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 { - font: "Cantarell 9.1669921875"; - 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; + font: "Cantarell 9.1669921875"; + glyphs: "50", 859 1, "%"; + offset: 0 13; } + 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); 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); 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); 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); 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); 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); 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(2, 1); 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); 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: translate(2, 1); } 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); } + clip: -1 -1 97 3 / 1; } border { + colors: 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: translate(99, 0) translate(2, 1); } transform { - transform: translate(198, 0) translate(2, 1); child: border { + colors: 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(198, 0) translate(2, 1); } transform { - transform: translate(297, 0) translate(2, 1); child: border { + colors: 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(297, 0) translate(2, 1); } transform { - transform: translate(396, 0) translate(2, 1); child: border { + colors: 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); 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); 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); 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); 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); 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 { - transform: translate(2, 0); child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } + transform: translate(2, 0); } transform { - transform: translate(120, 0); child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } + transform: translate(120, 0); } transform { - transform: translate(239, 0); child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } + transform: translate(239, 0); } transform { - transform: translate(357, 0); child: color { bounds: 0 0 1 6; color: rgba(146,149,149,0.55); } + transform: translate(357, 0); } 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); 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); 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); 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); 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "50.0"; + offset: 26 15; } 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); 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); 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); 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "50.0"; + offset: 26 15; } 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); 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); 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 { - transform: translate(1086, 0); child: color { bounds: 0 0 1 558; color: rgba(0,0,0,0.1); } + transform: translate(1086, 0); } 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); + outline: -1 -1 114 135; } 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; + font: "Cantarell Bold 11"; + glyphs: "Inset"; + offset: 0 15; } } + transform: translate(1, 1); } transform { - transform: translate(0, 141) translate(1, 1); child: container { border { - outline: -1 -1 114 135; - widths: 1 1 1 1; colors: rgb(255,255,255) rgb(213,208,204) rgb(213,208,204) rgb(255,255,255); + outline: -1 -1 114 135; } text { - font: "Cantarell Bold 11"; - x: 0; - y: 15; color: rgb(146,149,149); - 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; + font: "Cantarell Bold 11"; + glyphs: "Outset"; + offset: 0 15; } } + transform: translate(0, 141) translate(1, 1); } transform { - transform: translate(0, 282) translate(2, 2); child: container { container { border { - 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); + outline: -2 -2 114 135; } border { - 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); + outline: -1 -1 112 133; } border { + colors: 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); + widths: 2; } } text { - font: "Cantarell Bold 11"; - x: 0; - y: 15; color: rgb(146,149,149); - 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; + font: "Cantarell Bold 11"; + glyphs: "Groove"; + offset: 0 15; } } + transform: translate(0, 282) translate(2, 2); } transform { - transform: translate(0, 423) translate(2, 2); child: container { container { border { - 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); + outline: -2 -2 114 135; } border { - 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); + outline: -1 -1 112 133; } border { + colors: 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); + widths: 2; } } text { - font: "Cantarell Bold 11"; - 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; + font: "Cantarell Bold 11"; + glyphs: "Ridge"; + offset: 0 15; } } + 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); 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 +2188,6 @@ transform { } container { clip { - clip: 0 25 210 262; child: container { color { bounds: 0 117 210 195; @@ -2327,11 +2200,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 +2212,16 @@ transform { } } border { + colors: 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 +2229,32 @@ 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Andrea"; + offset: 86 42; } color { bounds: 153 25 60 23; color: rgb(252,252,252); } text { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Cimi"; + offset: 157 42; } color { bounds: 0 48 42 23; @@ -2393,11 +2263,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 +2275,8 @@ transform { } } border { + colors: 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 +2284,32 @@ 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Otto"; + offset: 86 65; } color { bounds: 153 48 60 23; color: rgb(252,252,252); } text { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "chaotic"; + offset: 157 65; } color { bounds: 0 71 42 23; @@ -2451,11 +2318,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 +2330,16 @@ transform { } } border { + colors: 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 +2347,22 @@ 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Orville"; + offset: 86 88; } color { bounds: 153 71 60 23; @@ -2505,18 +2370,16 @@ transform { } container { text { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Reden"; + offset: 157 88; } text { - font: "Cantarell 11"; - x: 198; - y: 88; color: rgb(50,50,50); - glyphs: 809 10240 0 0 1; + font: "Cantarell 11"; + glyphs: 809 10; + offset: 198 88; } } color { @@ -2526,32 +2389,31 @@ 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); 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 +2421,22 @@ 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 { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Benjamin"; + offset: 86 111; } color { bounds: 153 94 60 23; @@ -2583,122 +2444,116 @@ transform { } container { text { - font: "Cantarell 11"; - 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; + font: "Cantarell 11"; + glyphs: "Comp"; + offset: 157 111; } text { - font: "Cantarell 11"; - x: 196; - y: 111; color: rgb(50,50,50); - glyphs: 809 10240 0 0 1; + font: "Cantarell 11"; + glyphs: 809 10; + offset: 196 111; } } } + 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); 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 { - font: "Cantarell Bold 11"; - 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; + font: "Cantarell Bold 11"; + glyphs: "Cool"; + offset: 0 17; } } + 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); 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 { - font: "Cantarell Bold 11"; - 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; + font: "Cantarell Bold 11"; + glyphs: "Icon"; + offset: 0 17; } } + 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); 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 { - font: "Cantarell Bold 11"; - 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; + font: "Cantarell Bold 11"; + glyphs: "Name"; + offset: 0 17; } } + 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); 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); + widths: 0 0 1; } text { - font: "Cantarell Bold 11"; - 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; + font: "Cantarell Bold 11"; + glyphs: "Nick"; + offset: 0 17; } } + 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); 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 +2561,108 @@ 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); 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); 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); + widths: 0 0 1; } 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); - 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; + font: "Cantarell Bold 11"; + glyphs: "page 3"; + offset: 0 20; } + transform: translate(149, 0) translate(16, 3); } 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; + font: "Cantarell Bold 11"; + glyphs: "page 2"; + offset: 0 20; } + transform: translate(74, 0) translate(16, 3); } transform { - transform: translate(16, 3); child: container { inset-shadow { - outline: -12 -3 66 37; color: rgb(53,132,228); dx: 0; dy: -3; - spread: 0; - blur: 0; + outline: -12 -3 66 37; } 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, 678 7168 0 0 1; + font: "Cantarell Bold 11"; + glyphs: "page 1"; + offset: 0 20; } } + 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); 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 +2670,68 @@ 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); 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); - 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; + font: "Cantarell Bold 11"; + glyphs: "page 3"; + offset: 0 20; } + transform: translate(0, 88) translate(12, 7); } 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; + font: "Cantarell Bold 11"; + glyphs: "page 2"; + offset: 0 20; } + transform: translate(0, 44) translate(12, 7); } transform { - transform: translate(12, 7); child: container { inset-shadow { - outline: -12 -3 67 36; color: rgb(53,132,228); dx: 3; dy: 0; - spread: 0; - blur: 0; + outline: -12 -3 67 36; } 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, 678 7168 0 0 1; + font: "Cantarell Bold 11"; + glyphs: "page 1"; + offset: 0 20; } } + 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); 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 +2739,141 @@ 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); 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); + widths: 1 0 0; } 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); - 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; + font: "Cantarell Bold 11"; + glyphs: "page 3"; + offset: 0 20; } + transform: translate(149, 0) translate(16, 4); } 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; + font: "Cantarell Bold 11"; + glyphs: "page 2"; + offset: 0 20; } + transform: translate(74, 0) translate(16, 4); } transform { - transform: translate(16, 4); child: container { inset-shadow { - outline: -12 -4 66 37; color: rgb(53,132,228); dx: 0; dy: 3; - spread: 0; - blur: 0; + outline: -12 -4 66 37; } 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, 678 7168 0 0 1; + font: "Cantarell Bold 11"; + glyphs: "page 1"; + offset: 0 20; } } + 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); 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); 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); - 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; + font: "Cantarell Bold 11"; + glyphs: "page 3"; + offset: 0 20; } + transform: translate(0, 88) translate(12, 7); } 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; + font: "Cantarell Bold 11"; + glyphs: "page 2"; + offset: 0 20; } + transform: translate(0, 44) translate(12, 7); } transform { - transform: translate(12, 7); child: container { inset-shadow { - outline: -12 -3 67 36; color: rgb(53,132,228); dx: -3; dy: 0; - spread: 0; - blur: 0; + outline: -12 -3 67 36; } 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, 678 7168 0 0 1; + font: "Cantarell Bold 11"; + glyphs: "page 1"; + offset: 0 20; } } + 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); } 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 <gtk/gtk.h> - -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; -} |