[gtk/wip/otte/for-master: 91/96] rendernodeparser: Allow parsing strings



commit b90a66cab5baf284aea9aef58a9b0b6fd536650d
Author: Benjamin Otte <otte redhat com>
Date:   Sun May 19 20:20:09 2019 +0200

    rendernodeparser: Allow parsing strings
    
    Instead of only allowing for glyph indexes, allow ASCII characters as
    replacements. So this glyph sequence
      glyphs: 65 8, 66 8, 67 8
    Can be replaced by
      glyphs: "ABC"
    provided that the glyph for "A", "B" and "C" are 65, 66 and 67
    respectively and their advance is exactly 8.
    x offset and y offset must always be 0 and every glyph must start a
    cluster.

 gsk/gskrendernode.h                                |   2 +-
 gsk/gskrendernodeimpl.c                            |   2 +-
 gsk/gskrendernodeparser.c                          | 225 ++++++++++++++++++---
 testsuite/gsk/serializedeserialize/testswitch.node |  10 +-
 .../gsk/serializedeserialize/widgetfactory.node    | 138 ++++++-------
 5 files changed, 276 insertions(+), 101 deletions(-)
---
diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h
index 1c82f2cf13..cdb59a46f4 100644
--- a/gsk/gskrendernode.h
+++ b/gsk/gskrendernode.h
@@ -294,7 +294,7 @@ GskRenderNode *         gsk_text_node_new                       (PangoFont
                                                                  const GdkRGBA            *color,
                                                                  const graphene_point_t   *offset);
 GDK_AVAILABLE_IN_ALL
-const PangoFont *       gsk_text_node_peek_font                 (GskRenderNode            *node);
+PangoFont *             gsk_text_node_peek_font                 (GskRenderNode            *node);
 GDK_AVAILABLE_IN_ALL
 guint                   gsk_text_node_get_num_glyphs            (GskRenderNode            *node);
 GDK_AVAILABLE_IN_ALL
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index a2082dc326..596e6da006 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -3572,7 +3572,7 @@ gsk_text_node_peek_color (GskRenderNode *node)
   return &self->color;
 }
 
-const PangoFont *
+PangoFont *
 gsk_text_node_peek_font (GskRenderNode *node)
 {
   GskTextNode *self = (GskTextNode *) node;
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index 8b4c74a601..ab7b3bd2a8 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -501,6 +501,62 @@ font_from_string (const char *string)
   return font;
 }
 
+#define MIN_ASCII_GLYPH 32
+#define MAX_ASCII_GLYPH 127 /* exclusive */
+#define N_ASCII_GLYPHS (MAX_ASCII_GLYPH - MIN_ASCII_GLYPH)
+
+static PangoGlyphString *
+create_ascii_glyphs (PangoFont *font)
+{
+  PangoLanguage *language = pango_language_from_string ("en_US"); /* just pick one */
+  PangoCoverage *coverage;
+  PangoAnalysis not_a_hack = {
+    .shape_engine = pango_font_find_shaper (font, language, MIN_ASCII_GLYPH), /* never changes */
+    .lang_engine = NULL, /* unused by pango_shape() */
+    .font = font,
+    .level = 0,
+    .gravity = PANGO_GRAVITY_SOUTH,
+    .flags = 0,
+    .script = PANGO_SCRIPT_COMMON,
+    .language = language,
+    .extra_attrs = NULL
+  };
+  PangoGlyphString *result, *glyph_string;
+  guint i;
+
+  coverage = pango_font_get_coverage (font, language);
+  for (i = MIN_ASCII_GLYPH; i < MAX_ASCII_GLYPH; i++)
+    {
+      if (!pango_coverage_get (coverage, i))
+        break;
+    }
+  pango_coverage_unref (coverage);
+  if (i < MAX_ASCII_GLYPH)
+    return NULL;
+
+  result = pango_glyph_string_new ();
+  pango_glyph_string_set_size (result, N_ASCII_GLYPHS);
+  glyph_string = pango_glyph_string_new ();
+  for (i = MIN_ASCII_GLYPH; i < MAX_ASCII_GLYPH; i++)
+    {
+      pango_shape ((char[2]) { i, 0 },
+                   1,
+                   &not_a_hack,
+                   glyph_string);
+      if (glyph_string->num_glyphs != 1)
+        {
+          pango_glyph_string_free (glyph_string);
+          pango_glyph_string_free (result);
+          return NULL;
+        }
+      result->glyphs[i - MIN_ASCII_GLYPH] = glyph_string->glyphs[0];
+    }
+
+  pango_glyph_string_free (glyph_string);
+
+  return result;
+}
+
 static gboolean
 parse_font (GtkCssParser *parser,
             gpointer      out_font)
@@ -546,34 +602,52 @@ parse_glyphs (GtkCssParser *parser,
       double d, d2;
       int i;
 
-      if (!gtk_css_parser_consume_integer (parser, &i) ||
-          !gtk_css_parser_consume_number (parser, &d))
+      if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_STRING))
         {
-          pango_glyph_string_free (glyph_string);
-          return FALSE;
-        }
-      gi.glyph = i;
-      gi.geometry.width = (int) (d * PANGO_SCALE);
+          char *s = gtk_css_parser_consume_string (parser);
 
-      if (gtk_css_parser_has_number (parser))
+          for (i = 0; s[i] != 0; i++)
+            {
+              if (s[i] < MIN_ASCII_GLYPH || s[i] >= MAX_ASCII_GLYPH)
+                {
+                  gtk_css_parser_error_value (parser, "Unsupported character %d in string", i);
+                }
+              gi.glyph = PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH + s[i];
+              pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1);
+              glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi;
+            }
+        }
+      else
         {
-          if (!gtk_css_parser_consume_number (parser, &d) ||
-              !gtk_css_parser_consume_number (parser, &d2))
+          if (!gtk_css_parser_consume_integer (parser, &i) ||
+              !gtk_css_parser_consume_number (parser, &d))
             {
               pango_glyph_string_free (glyph_string);
               return FALSE;
             }
-          gi.geometry.x_offset = (int) (d * PANGO_SCALE);
-          gi.geometry.y_offset = (int) (d2 * PANGO_SCALE);
+          gi.glyph = i;
+          gi.geometry.width = (int) (d * PANGO_SCALE);
 
-          if (gtk_css_parser_try_ident (parser, "same-cluster"))
-            gi.attr.is_cluster_start = 0;
-          else
-            gi.attr.is_cluster_start = 1;
-        }
+          if (gtk_css_parser_has_number (parser))
+            {
+              if (!gtk_css_parser_consume_number (parser, &d) ||
+                  !gtk_css_parser_consume_number (parser, &d2))
+                {
+                  pango_glyph_string_free (glyph_string);
+                  return FALSE;
+                }
+              gi.geometry.x_offset = (int) (d * PANGO_SCALE);
+              gi.geometry.y_offset = (int) (d2 * PANGO_SCALE);
 
-      pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1);
-      glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi;
+              if (gtk_css_parser_try_ident (parser, "same-cluster"))
+                gi.attr.is_cluster_start = 0;
+              else
+                gi.attr.is_cluster_start = 1;
+            }
+
+          pango_glyph_string_set_size (glyph_string, glyph_string->num_glyphs + 1);
+          glyph_string->glyphs[glyph_string->num_glyphs - 1] = gi;
+        }
     }
   while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA));
 
@@ -1009,6 +1083,39 @@ parse_repeat_node (GtkCssParser *parser)
   return result;
 }
 
+static gboolean
+unpack_glyphs (PangoFont        *font,
+               PangoGlyphString *glyphs)
+{
+  PangoGlyphString *ascii = NULL;
+  guint i;
+
+  for (i = 0; i < glyphs->num_glyphs; i++)
+    {
+      PangoGlyph glyph = glyphs->glyphs[i].glyph;
+
+      if (glyph < PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH ||
+          glyph >= PANGO_GLYPH_INVALID_INPUT)
+        continue;
+
+      glyph = glyph - (PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH) - MIN_ASCII_GLYPH;
+
+      if (ascii == NULL)
+        {
+          ascii = create_ascii_glyphs (font);
+          if (ascii == NULL)
+            return FALSE;
+        }
+
+      glyphs->glyphs[i].glyph = ascii->glyphs[glyph].glyph;
+      glyphs->glyphs[i].geometry.width = ascii->glyphs[glyph].geometry.width;
+    }
+
+  g_clear_pointer (&ascii, pango_glyph_string_free);
+
+  return TRUE;
+}
+
 static GskRenderNode *
 parse_text_node (GtkCssParser *parser)
 {
@@ -1033,13 +1140,41 @@ parse_text_node (GtkCssParser *parser)
     }
 
   if (!glyphs)
-    return NULL;
+    {
+      const char *text = "Hello";
+      PangoGlyphInfo gi = { 0, { 0, 0, 0}, { 1 } };
+      guint i;
 
-  result = gsk_text_node_new (font, glyphs, &color, &offset);
+      glyphs = pango_glyph_string_new ();
+      pango_glyph_string_set_size (glyphs, strlen (text));
+      for (i = 0; i < strlen (text); i++)
+        {
+          gi.glyph = PANGO_GLYPH_INVALID_INPUT - MAX_ASCII_GLYPH + text[i];
+          glyphs->glyphs[i] = gi;
+        }
+    }
+
+  if (!unpack_glyphs (font, glyphs))
+    {
+      gtk_css_parser_error_value (parser, "Given font cannot decode the glyph text");
+      result = NULL;
+    }
+  else
+    {
+      result = gsk_text_node_new (font, glyphs, &color, &offset);
+      if (result == NULL)
+        {
+          gtk_css_parser_error_value (parser, "Glyphs result in empty text");
+        }
+    }
 
   g_object_unref (font);
   pango_glyph_string_free (glyphs);
 
+  /* return anything, whatever, just not NULL */
+  if (result == NULL)
+    result = create_default_render_node ();
+
   return result;
 }
 
@@ -1872,27 +2007,56 @@ render_node_print (Printer       *p,
         const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node);
         const graphene_point_t *offset = gsk_text_node_get_offset (node);
         const GdkRGBA *color = gsk_text_node_peek_color (node);
+        PangoFont *font = gsk_text_node_peek_font (node);
         PangoFontDescription *desc;
         char *font_name;
-        guint i;
+        GString *str;
+        guint i, j;
+        PangoGlyphString *ascii = create_ascii_glyphs (font);
+
         start_node (p, "text");
 
         if (!gdk_rgba_equal (color, &GDK_RGBA("000000")))
           append_rgba_param (p, "color", color);
 
         _indent (p);
-        desc = pango_font_describe ((PangoFont *)gsk_text_node_peek_font (node));;
+        desc = pango_font_describe (font);
         font_name = pango_font_description_to_string (desc);
+        if (ascii == NULL)
+          g_print ("\"%s\" has no ascii table\n", font_name);
         g_string_append_printf (p->str, "font: \"%s\";\n", font_name);
         g_free (font_name);
         pango_font_description_free (desc);
 
         _indent (p);
+        str = g_string_new (NULL);
         g_string_append (p->str, "glyphs: ");
         for (i = 0; i < n_glyphs; i++)
           {
-            if (i > 0)
-              g_string_append (p->str, ", ");
+            if (ascii)
+              {
+                for (j = 0; j < ascii->num_glyphs; j++)
+                  {
+                    if (glyphs[i].glyph == ascii->glyphs[j].glyph &&
+                        glyphs[i].geometry.width == ascii->glyphs[j].geometry.width &&
+                        glyphs[i].geometry.x_offset == 0 &&
+                        glyphs[i].geometry.x_offset == 0 &&
+                        glyphs[i].attr.is_cluster_start)
+                      {
+                        g_string_append_c (str, j + MIN_ASCII_GLYPH);
+                        break;
+                      }
+                  }
+                if (j != ascii->num_glyphs)
+                  continue;
+              }
+
+            if (str->len)
+              {
+                g_string_append_printf (p->str, "\"%s\", ", str->str);
+                g_string_set_size (str, 0);
+              }
+
             g_string_append_printf (p->str, "%u %g",
                                     glyphs[i].glyph,
                                     (double) glyphs[i].geometry.width / PANGO_SCALE);
@@ -1906,7 +2070,14 @@ render_node_print (Printer       *p,
               if (!glyphs[i].attr.is_cluster_start)
                 g_string_append (p->str, " same-cluster");
             }
+
+            if (i + 1 < n_glyphs)
+              g_string_append (p->str, ", ");
           }
+
+        if (str->len)
+          g_string_append_printf (p->str, "\"%s\"", str->str);
+
         g_string_append_c (p->str, ';');
         g_string_append_c (p->str, '\n');
 
@@ -1914,6 +2085,10 @@ render_node_print (Printer       *p,
           append_point_param (p, "offset", offset);
 
         end_node (p);
+
+        g_string_free (str, TRUE);
+        if (ascii)
+          pango_glyph_string_free (ascii);
       }
       break;
 
diff --git a/testsuite/gsk/serializedeserialize/testswitch.node 
b/testsuite/gsk/serializedeserialize/testswitch.node
index eb529b703b..89d884bcda 100644
--- a/testsuite/gsk/serializedeserialize/testswitch.node
+++ b/testsuite/gsk/serializedeserialize/testswitch.node
@@ -59,7 +59,7 @@ transform {
           child: text {
             color: rgb(46,52,54);
             font: "Cantarell 11";
-            glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8;
+            glyphs: "Disabled";
             offset: 145 18;
           }
           transform: translate(56, 0);
@@ -139,7 +139,7 @@ transform {
             child: text {
               color: rgb(46,52,54);
               font: "Cantarell 11";
-              glyphs: 45 9, 360 8, 244 8, 272 8, 349 4, 287 8, 280 8;
+              glyphs: "Enabled";
               offset: 147 18;
             }
             transform: translate(56, 0);
@@ -182,7 +182,7 @@ transform {
             child: text {
               color: rgb(46,52,54);
               font: "Cantarell 11";
-              glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8;
+              glyphs: "Disabled";
               offset: 145 18;
             }
             transform: translate(56, 0);
@@ -228,7 +228,7 @@ transform {
             child: text {
               color: rgb(46,52,54);
               font: "Cantarell 11";
-              glyphs: 45 9, 360 8, 244 8, 272 8, 349 4, 287 8, 280 8;
+              glyphs: "Enabled";
               offset: 147 18;
             }
             transform: translate(56, 0);
@@ -291,7 +291,7 @@ transform {
             child: text {
               color: rgb(46,52,54);
               font: "Cantarell 11";
-              glyphs: 37 11, 324 4, 417 7, 244 8, 272 8, 349 4, 287 8, 280 8;
+              glyphs: "Disabled";
               offset: 123 18;
             }
             transform: translate(78, 0);
diff --git a/testsuite/gsk/serializedeserialize/widgetfactory.node 
b/testsuite/gsk/serializedeserialize/widgetfactory.node
index a8b36b42e2..36b5f1b328 100644
--- a/testsuite/gsk/serializedeserialize/widgetfactory.node
+++ b/testsuite/gsk/serializedeserialize/widgetfactory.node
@@ -75,7 +75,7 @@ transform {
                   child: text {
                     color: rgb(46,52,54);
                     font: "Cantarell 11";
-                    glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 678 7;
+                    glyphs: "Page 1";
                     offset: 0 17;
                   }
                   transform: translate(28, 0);
@@ -98,7 +98,7 @@ transform {
                   child: text {
                     color: rgb(46,52,54);
                     font: "Cantarell 11";
-                    glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 679 8;
+                    glyphs: "Page 2";
                     offset: 0 17;
                   }
                   transform: translate(28, 0);
@@ -123,7 +123,7 @@ transform {
                   child: text {
                     color: rgb(46,52,54);
                     font: "Cantarell 11";
-                    glyphs: 162 9, 244 8, 312 8, 287 8, 862 3, 680 8;
+                    glyphs: "Page 3";
                     offset: 0 17;
                   }
                   transform: translate(28, 0);
@@ -199,7 +199,7 @@ transform {
                       text {
                         color: rgb(50,50,50);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 
5, 409 6, 473 7;
+                        glyphs: "comboboxentry";
                         offset: 0 21;
                       }
                       clip {
@@ -211,7 +211,7 @@ transform {
                           text {
                             color: rgb(252,252,252);
                             font: "Cantarell 11";
-                            glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 
430 5, 409 6, 473 7;
+                            glyphs: "comboboxentry";
                             offset: 0 21;
                           }
                         }
@@ -268,7 +268,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 370 8, 358 13, 272 8, 370 8, 272 8, 370 8, 472 7, 287 8, 360 8, 430 
5, 409 6, 473 7;
+                        glyphs: "comboboxentry";
                         offset: 0 21;
                       }
                       clip: 0 0 357 32;
@@ -321,7 +321,7 @@ transform {
                     child: text {
                       color: rgb(50,50,50);
                       font: "Cantarell 11";
-                      glyphs: 30 10, 349 4, 324 4, 273 7, 345 7, 862 3, 324 4, 273 7, 370 8, 360 8, 862 3, 
430 5, 370 8, 862 3, 273 7, 319 8, 244 8, 360 8, 312 8, 287 8, 862 3, 358 13, 370 8, 280 8, 287 8;
+                      glyphs: "Click icon to change mode";
                       offset: 0 21;
                     }
                     opacity: 0.54902;
@@ -359,7 +359,7 @@ transform {
                   child: text {
                     color: rgb(212,207,202);
                     font: "Cantarell 11";
-                    glyphs: 287 8, 360 8, 430 5, 409 6, 473 7;
+                    glyphs: "entry";
                     offset: 0 21;
                   }
                   clip: 0 0 392 32;
@@ -387,7 +387,7 @@ transform {
                       child: text {
                         color: rgb(50,50,50);
                         font: "Cantarell 11";
-                        glyphs: 287 8, 360 8, 430 5, 409 6, 473 7;
+                        glyphs: "entry";
                         offset: 0 22;
                       }
                       clip: 0 0 357 33;
@@ -442,7 +442,7 @@ transform {
                       text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 103 8, 287 8, 311 5, 430 5;
+                        glyphs: "Left";
                         offset: 2 17;
                       }
                       transform {
@@ -476,7 +476,7 @@ transform {
                         text {
                           color: rgb(146,149,149);
                           font: "Cantarell 11";
-                          glyphs: 113 13, 324 4, 280 8, 280 8, 349 4, 287 8;
+                          glyphs: "Middle";
                           offset: 2 17;
                         }
                         transform {
@@ -514,7 +514,7 @@ transform {
                         text {
                           color: rgb(146,149,149);
                           font: "Cantarell 11";
-                          glyphs: 165 9, 324 4, 312 8, 319 8, 430 5;
+                          glyphs: "Right";
                           offset: 2 17;
                         }
                         transform {
@@ -542,14 +542,14 @@ transform {
                 text {
                   color: rgb(146,149,149);
                   font: "Cantarell 11";
-                  glyphs: 349 4, 244 8, 272 8, 287 8, 349 4;
+                  glyphs: "label";
                   offset: 0 22;
                 }
                 transform {
                   child: text {
                     color: rgb(212,207,202);
                     font: "Cantarell 11";
-                    glyphs: 349 4, 244 8, 272 8, 287 8, 349 4;
+                    glyphs: "label";
                     offset: 0 22;
                   }
                   transform: translate(52, 0);
@@ -572,7 +572,7 @@ transform {
                         child: text {
                           color: rgb(50,50,50);
                           font: "Cantarell 11";
-                          glyphs: 682 8, 677 9;
+                          glyphs: "50";
                           offset: 0 15;
                         }
                         transform: translate(6, 6);
@@ -635,7 +635,7 @@ transform {
                         child: text {
                           color: rgb(212,207,202);
                           font: "Cantarell 11";
-                          glyphs: 677 9;
+                          glyphs: "0";
                           offset: 0 15;
                         }
                         transform: translate(6, 6);
@@ -723,7 +723,7 @@ transform {
                       child: text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "checkbutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -750,7 +750,7 @@ transform {
                       child: text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "checkbutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -785,7 +785,7 @@ transform {
                       child: text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "checkbutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -820,7 +820,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "checkbutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -847,7 +847,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "checkbutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -882,7 +882,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 273 7, 319 8, 287 8, 273 7, 345 7, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "checkbutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -912,7 +912,7 @@ transform {
                       child: text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "radiobutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -942,7 +942,7 @@ transform {
                       child: text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "radiobutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -980,7 +980,7 @@ transform {
                       child: text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "radiobutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -1018,7 +1018,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "radiobutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -1048,7 +1048,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "radiobutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -1086,7 +1086,7 @@ transform {
                       child: text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 409 6, 244 8, 280 8, 324 4, 370 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                        glyphs: "radiobutton";
                         offset: 0 15;
                       }
                       transform: translate(24, 0);
@@ -1154,7 +1154,7 @@ transform {
                   text {
                     color: rgb(146,149,149);
                     font: "Cantarell 11";
-                    glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 
8;
+                    glyphs: "togglebutton";
                     offset: 2 17;
                   }
                 }
@@ -1176,7 +1176,7 @@ transform {
                   text {
                     color: rgb(212,207,202);
                     font: "Cantarell 11";
-                    glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 
8;
+                    glyphs: "togglebutton";
                     offset: 2 17;
                   }
                 }
@@ -1198,7 +1198,7 @@ transform {
                   text {
                     color: rgb(146,149,149);
                     font: "Cantarell 11";
-                    glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 
8;
+                    glyphs: "togglebutton";
                     offset: 2 17;
                   }
                 }
@@ -1220,7 +1220,7 @@ transform {
                   text {
                     color: rgb(212,207,202);
                     font: "Cantarell 11";
-                    glyphs: 430 5, 370 8, 312 8, 312 8, 349 4, 287 8, 272 8, 438 8, 430 5, 430 5, 370 8, 360 
8;
+                    glyphs: "togglebutton";
                     offset: 2 17;
                   }
                 }
@@ -1244,7 +1244,7 @@ transform {
                       text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 1 10, 360 8, 280 8, 409 6, 287 8, 244 8;
+                        glyphs: "Andrea";
                         offset: 2 17;
                       }
                       transform {
@@ -1282,7 +1282,7 @@ transform {
                       text {
                         color: rgb(212,207,202);
                         font: "Cantarell 11";
-                        glyphs: 126 11, 430 5, 430 5, 370 8;
+                        glyphs: "Otto";
                         offset: 2 17;
                       }
                       transform {
@@ -1320,7 +1320,7 @@ transform {
                       text {
                         color: rgb(146,149,149);
                         font: "Cantarell 11";
-                        glyphs: 173 9, 244 8, 360 8, 417 7, 862 3, 165 9, 287 8, 312 8, 438 8, 349 4, 244 8, 
409 6;
+                        glyphs: "Sans Regular";
                         offset: 0 17;
                       }
                       transform {
@@ -1328,7 +1328,7 @@ transform {
                           child: text {
                             color: rgb(146,149,149);
                             font: "Cantarell Bold 11";
-                            glyphs: 678 7, 679 8;
+                            glyphs: "12";
                             offset: 0 17;
                           }
                           transform: translate(1, 0);
@@ -1392,7 +1392,7 @@ transform {
                         child: text {
                           color: rgb(146,149,149);
                           font: "Cantarell 11";
-                          glyphs: 822 4, 115 11, 370 8, 360 8, 287 8, 823 4;
+                          glyphs: "(None)";
                           offset: 0 17;
                         }
                         transform: translate(16, 0);
@@ -1419,7 +1419,7 @@ transform {
                   text {
                     color: rgb(53,132,228);
                     font: "Cantarell 11";
-                    glyphs: 349 4, 324 4, 360 8, 345 7, 862 3, 272 8, 438 8, 430 5, 430 5, 370 8, 360 8;
+                    glyphs: "link button";
                     offset: 10 17;
                   }
                   color {
@@ -1573,7 +1573,7 @@ transform {
                       child: text {
                         color: rgba(46,52,54,0.4);
                         font: "Cantarell 9.1669921875";
-                        glyphs: 682 7, 677 8, 859 1, 919 12;
+                        glyphs: "50", 859 1, "%";
                         offset: 0 13;
                       }
                       transform: translate(237, 0);
@@ -1965,7 +1965,7 @@ transform {
                           text {
                             color: rgba(146,149,149,0.55);
                             font: "Cantarell 11";
-                            glyphs: 682 8, 677 9, 805 4, 677 9;
+                            glyphs: "50.0";
                             offset: 26 15;
                           }
                           transform {
@@ -2021,7 +2021,7 @@ transform {
                           text {
                             color: rgba(146,149,149,0.55);
                             font: "Cantarell 11";
-                            glyphs: 682 8, 677 9, 805 4, 677 9;
+                            glyphs: "50.0";
                             offset: 26 15;
                           }
                           transform {
@@ -2086,7 +2086,7 @@ transform {
                   text {
                     color: rgb(146,149,149);
                     font: "Cantarell Bold 11";
-                    glyphs: 81 4, 360 8, 417 7, 287 8, 430 6;
+                    glyphs: "Inset";
                     offset: 0 15;
                   }
                 }
@@ -2101,7 +2101,7 @@ transform {
                   text {
                     color: rgb(146,149,149);
                     font: "Cantarell Bold 11";
-                    glyphs: 126 11, 438 8, 430 6, 417 7, 287 8, 430 6;
+                    glyphs: "Outset";
                     offset: 0 15;
                   }
                 }
@@ -2127,7 +2127,7 @@ transform {
                   text {
                     color: rgb(146,149,149);
                     font: "Cantarell Bold 11";
-                    glyphs: 69 11, 409 6, 370 8, 370 8, 466 7, 287 8;
+                    glyphs: "Groove";
                     offset: 0 15;
                   }
                 }
@@ -2153,7 +2153,7 @@ transform {
                   text {
                     color: rgb(146,149,149);
                     font: "Cantarell Bold 11";
-                    glyphs: 165 10, 324 4, 280 8, 312 8, 287 8;
+                    glyphs: "Ridge";
                     offset: 0 15;
                   }
                 }
@@ -2243,7 +2243,7 @@ transform {
                           text {
                             color: rgb(50,50,50);
                             font: "Cantarell 11";
-                            glyphs: 1 10, 360 8, 280 8, 409 6, 287 8, 244 8;
+                            glyphs: "Andrea";
                             offset: 86 42;
                           }
                           color {
@@ -2253,7 +2253,7 @@ transform {
                           text {
                             color: rgb(50,50,50);
                             font: "Cantarell 11";
-                            glyphs: 30 10, 324 4, 358 13, 324 4;
+                            glyphs: "Cimi";
                             offset: 157 42;
                           }
                           color {
@@ -2298,7 +2298,7 @@ transform {
                           text {
                             color: rgb(50,50,50);
                             font: "Cantarell 11";
-                            glyphs: 126 11, 430 5, 430 5, 370 8;
+                            glyphs: "Otto";
                             offset: 86 65;
                           }
                           color {
@@ -2308,7 +2308,7 @@ transform {
                           text {
                             color: rgb(50,50,50);
                             font: "Cantarell 11";
-                            glyphs: 273 7, 319 8, 244 8, 370 8, 430 5, 324 4, 273 7;
+                            glyphs: "chaotic";
                             offset: 157 65;
                           }
                           color {
@@ -2361,7 +2361,7 @@ transform {
                           text {
                             color: rgb(50,50,50);
                             font: "Cantarell 11";
-                            glyphs: 126 11, 409 6, 466 7, 324 4, 349 4, 349 4, 287 8;
+                            glyphs: "Orville";
                             offset: 86 88;
                           }
                           color {
@@ -2372,7 +2372,7 @@ transform {
                             text {
                               color: rgb(50,50,50);
                               font: "Cantarell 11";
-                              glyphs: 165 9, 287 8, 280 8, 287 8, 360 8;
+                              glyphs: "Reden";
                               offset: 157 88;
                             }
                             text {
@@ -2435,7 +2435,7 @@ transform {
                           text {
                             color: rgb(50,50,50);
                             font: "Cantarell 11";
-                            glyphs: 29 10, 287 8, 360 8, 341 4, 244 8, 358 13, 324 4, 360 8;
+                            glyphs: "Benjamin";
                             offset: 86 111;
                           }
                           color {
@@ -2446,7 +2446,7 @@ transform {
                             text {
                               color: rgb(50,50,50);
                               font: "Cantarell 11";
-                              glyphs: 30 10, 370 8, 358 13, 406 8;
+                              glyphs: "Comp";
                               offset: 157 111;
                             }
                             text {
@@ -2475,7 +2475,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 30 9, 370 8, 370 8, 349 4;
+                                glyphs: "Cool";
                                 offset: 0 17;
                               }
                             }
@@ -2495,7 +2495,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 81 4, 273 7, 370 8, 360 8;
+                                glyphs: "Icon";
                                 offset: 0 17;
                               }
                             }
@@ -2515,7 +2515,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 115 11, 244 8, 358 13, 287 8;
+                                glyphs: "Name";
                                 offset: 0 17;
                               }
                             }
@@ -2535,7 +2535,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 115 11, 324 4, 273 7, 345 8;
+                                glyphs: "Nick";
                                 offset: 0 17;
                               }
                             }
@@ -2610,7 +2610,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8;
+                              glyphs: "page 3";
                               offset: 0 20;
                             }
                             transform: translate(149, 0) translate(16, 3);
@@ -2619,7 +2619,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8;
+                              glyphs: "page 2";
                               offset: 0 20;
                             }
                             transform: translate(74, 0) translate(16, 3);
@@ -2635,7 +2635,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7;
+                                glyphs: "page 1";
                                 offset: 0 20;
                               }
                             }
@@ -2686,7 +2686,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8;
+                              glyphs: "page 3";
                               offset: 0 20;
                             }
                             transform: translate(0, 88) translate(12, 7);
@@ -2695,7 +2695,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8;
+                              glyphs: "page 2";
                               offset: 0 20;
                             }
                             transform: translate(0, 44) translate(12, 7);
@@ -2711,7 +2711,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7;
+                                glyphs: "page 1";
                                 offset: 0 20;
                               }
                             }
@@ -2755,7 +2755,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8;
+                              glyphs: "page 3";
                               offset: 0 20;
                             }
                             transform: translate(149, 0) translate(16, 4);
@@ -2764,7 +2764,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8;
+                              glyphs: "page 2";
                               offset: 0 20;
                             }
                             transform: translate(74, 0) translate(16, 4);
@@ -2780,7 +2780,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7;
+                                glyphs: "page 1";
                                 offset: 0 20;
                               }
                             }
@@ -2820,7 +2820,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 680 8;
+                              glyphs: "page 3";
                               offset: 0 20;
                             }
                             transform: translate(0, 88) translate(12, 7);
@@ -2829,7 +2829,7 @@ transform {
                             child: text {
                               color: rgb(146,149,149);
                               font: "Cantarell Bold 11";
-                              glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 679 8;
+                              glyphs: "page 2";
                               offset: 0 20;
                             }
                             transform: translate(0, 44) translate(12, 7);
@@ -2845,7 +2845,7 @@ transform {
                               text {
                                 color: rgb(146,149,149);
                                 font: "Cantarell Bold 11";
-                                glyphs: 406 8, 244 8, 312 8, 287 8, 862 3, 678 7;
+                                glyphs: "page 1";
                                 offset: 0 20;
                               }
                             }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]