[gtk/wip/otte/css: 21/35] css: Make font-weight an integer



commit 4dd643feefbd6f0d3bd2dbe69a29261b27864f47
Author: Benjamin Otte <otte redhat com>
Date:   Sun Mar 31 20:05:12 2019 +0200

    css: Make font-weight an integer
    
    This conforms to what Pango does and to the CSS4 spec. And it makes the
    parsing code easier. So let's go for it.

 gtk/gtkcssenumvalue.c             | 84 ++++++++++-----------------------------
 gtk/gtkcssenumvalueprivate.h      |  5 +--
 gtk/gtkcssshorthandpropertyimpl.c | 18 ++++++++-
 gtk/gtkcssstylepropertyimpl.c     | 20 ++++++++--
 4 files changed, 55 insertions(+), 72 deletions(-)
---
diff --git a/gtk/gtkcssenumvalue.c b/gtk/gtkcssenumvalue.c
index 467c9a568a..6e2828a23d 100644
--- a/gtk/gtkcssenumvalue.c
+++ b/gtk/gtkcssenumvalue.c
@@ -407,27 +407,27 @@ gtk_css_value_font_weight_compute (GtkCssValue      *value,
     return _gtk_css_value_ref (value);
 
   if (parent_style)
-    parent_value = gtk_css_style_get_value (parent_style, property_id)->value;
+    parent_value = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, property_id), 100);
   else
     parent_value = 400;
 
   if (value->value == BOLDER)
     {
-      if (parent_value < 400)
-        new_weight = PANGO_WEIGHT_NORMAL;
-      else if (parent_value < 600)
-        new_weight = PANGO_WEIGHT_BOLD;
+      if (parent_value < 350)
+        new_weight = 400;
+      else if (parent_value < 550)
+        new_weight = 700;
       else
-        new_weight = PANGO_WEIGHT_HEAVY;
+        new_weight = 900;
     }
   else if (value->value == LIGHTER)
     {
-      if (parent_value > 700)
-        new_weight = PANGO_WEIGHT_BOLD;
-      else if (parent_value > 500)
-        new_weight = PANGO_WEIGHT_NORMAL;
+      if (parent_value > 750)
+        new_weight = 700;
+      else if (parent_value > 550)
+        new_weight = 400;
       else
-        new_weight = PANGO_WEIGHT_THIN;
+        new_weight = 100;
     }
   else
     {
@@ -435,30 +435,14 @@ gtk_css_value_font_weight_compute (GtkCssValue      *value,
       new_weight = PANGO_WEIGHT_NORMAL;
     }
 
-  return _gtk_css_font_weight_value_new (new_weight);
-}
-
-static GtkCssValue *
-gtk_css_value_font_weight_transition (GtkCssValue *start,
-                                      GtkCssValue *end,
-                                      guint        property_id,
-                                      double       progress)
-{
-  PangoWeight new_weight;
-
-  if (start->value < 0 || end->value < 0)
-    return NULL;
-
-  new_weight = (start->value + end->value + 50) / 200 * 100;
-
-  return _gtk_css_font_weight_value_new (new_weight);
+  return _gtk_css_number_value_new (new_weight, GTK_CSS_NUMBER);
 }
 
 static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
   gtk_css_value_enum_free,
   gtk_css_value_font_weight_compute,
   gtk_css_value_enum_equal,
-  gtk_css_value_font_weight_transition,
+  NULL,
   NULL,
   NULL,
   gtk_css_value_enum_print
@@ -467,36 +451,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
 static GtkCssValue font_weight_values[] = {
   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, BOLDER, "bolder" },
   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, LIGHTER, "lighter" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_THIN, "100" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRALIGHT, "200" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_LIGHT, "300" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_NORMAL, "normal" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_MEDIUM, "500" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_SEMIBOLD, "600" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_BOLD, "bold" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRABOLD, "800" },
-  { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_HEAVY, "900" }
 };
 
 GtkCssValue *
-_gtk_css_font_weight_value_new (PangoWeight font_weight)
-{
-  guint i;
-  gint w;
-
-  w = ((font_weight + 50) / 100) * 100;
-
-  for (i = 2; i < G_N_ELEMENTS (font_weight_values); i++)
-    {
-      if (font_weight_values[i].value == w)
-        return _gtk_css_value_ref (&font_weight_values[i]);
-    }
-
-  g_return_val_if_reached (NULL);
-}
-
-GtkCssValue *
-_gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
+gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
 {
   guint i;
 
@@ -504,20 +462,20 @@ _gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
 
   for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
     {
-      if (_gtk_css_parser_try (parser, font_weight_values[i].name, TRUE))
+      if (gtk_css_parser_try_ident (parser, font_weight_values[i].name))
         return _gtk_css_value_ref (&font_weight_values[i]);
     }
-  /* special cases go here */
-  if (_gtk_css_parser_try (parser, "400", TRUE))
-    return _gtk_css_value_ref (&font_weight_values[5]);
-  if (_gtk_css_parser_try (parser, "700", TRUE))
-    return _gtk_css_value_ref (&font_weight_values[8]);
+
+  if (gtk_css_parser_try_ident (parser, "normal"))
+    return _gtk_css_number_value_new (PANGO_WEIGHT_NORMAL, GTK_CSS_NUMBER);
+  if (gtk_css_parser_try_ident (parser, "bold"))
+    return _gtk_css_number_value_new (PANGO_WEIGHT_BOLD, GTK_CSS_NUMBER);
 
   return NULL;
 }
 
 PangoWeight
-_gtk_css_font_weight_value_get (const GtkCssValue *value)
+gtk_css_font_weight_value_get (const GtkCssValue *value)
 {
   g_return_val_if_fail (value->class == &GTK_CSS_VALUE_FONT_WEIGHT, PANGO_WEIGHT_NORMAL);
 
diff --git a/gtk/gtkcssenumvalueprivate.h b/gtk/gtkcssenumvalueprivate.h
index 972ffd96d0..22bab5f1f4 100644
--- a/gtk/gtkcssenumvalueprivate.h
+++ b/gtk/gtkcssenumvalueprivate.h
@@ -45,9 +45,8 @@ GtkCssValue *   _gtk_css_font_style_value_new         (PangoStyle         style)
 GtkCssValue *   _gtk_css_font_style_value_try_parse   (GtkCssParser      *parser);
 PangoStyle      _gtk_css_font_style_value_get         (const GtkCssValue *value);
 
-GtkCssValue *   _gtk_css_font_weight_value_new        (PangoWeight        weight);
-GtkCssValue *   _gtk_css_font_weight_value_try_parse  (GtkCssParser      *parser);
-PangoWeight     _gtk_css_font_weight_value_get        (const GtkCssValue *value);
+GtkCssValue *   gtk_css_font_weight_value_try_parse   (GtkCssParser      *parser);
+PangoWeight     gtk_css_font_weight_value_get         (const GtkCssValue *value);
 
 GtkCssValue *   _gtk_css_font_stretch_value_new       (PangoStretch       stretch);
 GtkCssValue *   _gtk_css_font_stretch_value_try_parse (GtkCssParser      *parser);
diff --git a/gtk/gtkcssshorthandpropertyimpl.c b/gtk/gtkcssshorthandpropertyimpl.c
index e0712380b9..a436c92c5b 100644
--- a/gtk/gtkcssshorthandpropertyimpl.c
+++ b/gtk/gtkcssshorthandpropertyimpl.c
@@ -450,7 +450,21 @@ parse_font (GtkCssShorthandProperty  *shorthand,
 
       if (values[3] == NULL)
         {
-          values[3] = _gtk_css_font_weight_value_try_parse (parser);
+          values[3] = gtk_css_font_weight_value_try_parse (parser);
+          if (values[3] == NULL && gtk_css_number_value_can_parse (parser))
+            {
+              values[3] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
+
+              if (values[3] == NULL)
+                _gtk_css_parser_error (parser, "unknown value for property");
+              else if (_gtk_css_number_value_get (values[3], 100) < 1 || 
+                       _gtk_css_number_value_get (values[3], 100) > 1000)
+                {
+                  _gtk_css_parser_error (parser, "Font weight values must be between 1 and 1000");
+                  g_clear_pointer (&values[3], gtk_css_value_unref);
+                }
+              return FALSE;
+            }
           parsed_one = parsed_one || values[3] != NULL;
         }
 
@@ -1119,7 +1133,7 @@ pack_font_description (GtkCssShorthandProperty *shorthand,
 
   v = (* query_func) (GTK_CSS_PROPERTY_FONT_WEIGHT, query_data);
   if (v)
-    pango_font_description_set_weight (description, _gtk_css_font_weight_value_get (v));
+    pango_font_description_set_weight (description, _gtk_css_number_value_get (v, 100));
 
   v = (* query_func) (GTK_CSS_PROPERTY_FONT_STRETCH, query_data);
   if (v)
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index 2f61397ef9..70f5c4bbfb 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -244,10 +244,22 @@ static GtkCssValue *
 font_weight_parse (GtkCssStyleProperty *property,
                    GtkCssParser        *parser)
 {
-  GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
+  GtkCssValue *value;
   
+  value = gtk_css_font_weight_value_try_parse (parser);
   if (value == NULL)
-    _gtk_css_parser_error (parser, "unknown value for property");
+    {
+      value = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
+
+      if (value == NULL)
+        _gtk_css_parser_error (parser, "unknown value for property");
+      else if (_gtk_css_number_value_get (value, 100) < 1 || 
+               _gtk_css_number_value_get (value, 100) > 1000)
+        {
+          _gtk_css_parser_error (parser, "Font weight values must be between 1 and 1000");
+          g_clear_pointer (&value, gtk_css_value_unref);
+        }
+    }
 
   return value;
 }
@@ -258,7 +270,7 @@ font_weight_query (GtkCssStyleProperty *property,
                    GValue              *value)
 {
   g_value_init (value, PANGO_TYPE_WEIGHT);
-  g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
+  g_value_set_enum (value, _gtk_css_number_value_get (css_value, 100));
 }
 
 static GtkCssValue *
@@ -1003,7 +1015,7 @@ _gtk_css_style_property_init_properties (void)
                                           GTK_CSS_AFFECTS_TEXT_SIZE,
                                           font_weight_parse,
                                           font_weight_query,
-                                          _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
+                                          _gtk_css_number_value_new (PANGO_WEIGHT_NORMAL, GTK_CSS_NUMBER));
   gtk_css_style_property_register        ("font-stretch",
                                           GTK_CSS_PROPERTY_FONT_STRETCH,
                                           PANGO_TYPE_STRETCH,


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