diff --git a/gtk/gtkcssstyle.c b/gtk/gtkcssstyle.c index 1fbe5e6bba..f6eaa35764 100644 --- a/gtk/gtkcssstyle.c +++ b/gtk/gtkcssstyle.c @@ -231,6 +231,7 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) GtkCssValue *caps; GtkCssValue *numeric; GtkCssValue *alternatives; + GtkCssValue *east_asian; GString *s; int i; @@ -379,6 +380,31 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) g_string_append (s, "hist 1"); } + east_asian = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN); + for (i = 0; i < _gtk_css_array_value_get_n_values (east_asian); i++) + { + GtkCssValue *value = _gtk_css_array_value_get_nth (east_asian, i); + if (s->len > 0) g_string_append (s, ", "); + if (strcmp (_gtk_css_ident_value_get (value), "jis78") == 0) + g_string_append (s, "jp78 1"); + if (strcmp (_gtk_css_ident_value_get (value), "jis83") == 0) + g_string_append (s, "jp83 1"); + if (strcmp (_gtk_css_ident_value_get (value), "jis90") == 0) + g_string_append (s, "jp90 1"); + if (strcmp (_gtk_css_ident_value_get (value), "jis04") == 0) + g_string_append (s, "jp04 1"); + if (strcmp (_gtk_css_ident_value_get (value), "simplified") == 0) + g_string_append (s, "smpl 1"); + if (strcmp (_gtk_css_ident_value_get (value), "traditional") == 0) + g_string_append (s, "trad 1"); + if (strcmp (_gtk_css_ident_value_get (value), "full-width") == 0) + g_string_append (s, "fwid 1"); + if (strcmp (_gtk_css_ident_value_get (value), "proportional-width") == 0) + g_string_append (s, "pwid 1"); + if (strcmp (_gtk_css_ident_value_get (value), "ruby") == 0) + g_string_append (s, "ruby 1"); + } + attrs = add_pango_attr (attrs, pango_attr_font_features_new (s->str)); g_string_free (s, TRUE); diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 25c66f9b77..a81a5a2507 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -749,6 +749,68 @@ parse_font_variant_alternatives (GtkCssStyleProperty *property, return value; } +static GtkCssValue * +parse_font_variant_east_asian (GtkCssStyleProperty *property, + GtkCssParser *parser) +{ + GtkCssValue *value = NULL; + + if (_gtk_css_parser_try (parser, "normal", TRUE)) + value = _gtk_css_array_value_new (_gtk_css_ident_value_new ("normal")); + else + { + GtkCssValue *values[3] = { NULL, NULL, NULL }; + guint n_values = 0; + guint old_n; + gboolean variant = FALSE; + gboolean width = FALSE; + gboolean ruby = FALSE; + + do { + old_n = n_values; + if (!variant) + { + values[n_values] = _gtk_css_ident_value_try (parser, "jis78", "jis83", "jis90", "jis04", + "simplified", "traditional", NULL); + if (values[n_values]) + { + n_values++; + variant = TRUE; + } + } + if (!width) + { + values[n_values] = _gtk_css_ident_value_try (parser, "full-width" + "proportional-width", NULL); + if (values[n_values]) + { + n_values++; + width = TRUE; + } + } + if (!ruby) + { + values[n_values] = _gtk_css_ident_value_try (parser, "ruby", NULL); + if (values[n_values]) + { + n_values++; + ruby = TRUE; + } + } + if (old_n == n_values) + { + _gtk_css_parser_error (parser, "Not a valid value"); + return NULL; + } + } while (!value_is_done_parsing (parser)); + + value = _gtk_css_array_value_new_from_array (values, n_values); + } + + return value; +} + + static GtkCssValue * box_shadow_value_parse (GtkCssStyleProperty *property, GtkCssParser *parser) @@ -1282,6 +1344,14 @@ _gtk_css_style_property_init_properties (void) parse_font_variant_alternatives, NULL, _gtk_css_array_value_new (_gtk_css_ident_value_new ("normal"))); + gtk_css_style_property_register ("font-variant-east-asian", + GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, + G_TYPE_NONE, + 0, + GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS, + parse_font_variant_east_asian, + NULL, + _gtk_css_array_value_new (_gtk_css_ident_value_new ("normal"))); gtk_css_style_property_register ("text-shadow", GTK_CSS_PROPERTY_TEXT_SHADOW, G_TYPE_NONE, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 6518a24291..8e939f3c67 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -169,6 +169,7 @@ enum { /*< skip >*/ GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC, GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATIVES, + GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, GTK_CSS_PROPERTY_TEXT_SHADOW, GTK_CSS_PROPERTY_BOX_SHADOW, GTK_CSS_PROPERTY_MARGIN_TOP,