diff options
author | Matthias Clasen <mclasen@redhat.com> | 2016-06-03 00:19:24 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2016-06-03 00:26:55 -0400 |
commit | 7b0929ad388d26e7c24620c5b8e93f9401eb8859 (patch) | |
tree | 30c2beaa4ccba393a27c62ac2b9a4e43c5c9509d /gtk/gtkcssstyle.c | |
parent | a961b05200d7a9fb8f7fc97babbd04c19b37c2cb (diff) | |
download | gtk+-7b0929ad388d26e7c24620c5b8e93f9401eb8859.tar.gz |
Add a function to turn a css style into pango attributes
This is _gtk_style_context_get_pango_attributes, decoupled
from the GtkStyleContext. This will be used to drive css-styled
text rendering from css subnodes of widgets, e.g. for the value
in GtkScale.
Diffstat (limited to 'gtk/gtkcssstyle.c')
-rw-r--r-- | gtk/gtkcssstyle.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/gtk/gtkcssstyle.c b/gtk/gtkcssstyle.c index d801c646a2..f4a84a1e74 100644 --- a/gtk/gtkcssstyle.c +++ b/gtk/gtkcssstyle.c @@ -28,6 +28,7 @@ #include "gtkcssinheritvalueprivate.h" #include "gtkcssinitialvalueprivate.h" #include "gtkcssnumbervalueprivate.h" +#include "gtkcssrgbavalueprivate.h" #include "gtkcsssectionprivate.h" #include "gtkcssshorthandpropertyprivate.h" #include "gtkcssstringvalueprivate.h" @@ -188,3 +189,78 @@ gtk_css_style_to_string (GtkCssStyle *style) return g_string_free (string, FALSE); } +static PangoUnderline +get_pango_underline_from_style (GtkTextDecorationStyle style) +{ + switch (style) + { + case GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE: + return PANGO_UNDERLINE_DOUBLE; + case GTK_CSS_TEXT_DECORATION_STYLE_WAVY: + return PANGO_UNDERLINE_ERROR; + case GTK_CSS_TEXT_DECORATION_STYLE_SOLID: + default: + return PANGO_UNDERLINE_SINGLE; + } + + g_return_val_if_reached (PANGO_UNDERLINE_SINGLE); +} + +static PangoAttrList * +add_pango_attr (PangoAttrList *attrs, + PangoAttribute *attr) +{ + if (attrs == NULL) + attrs = pango_attr_list_new (); + + pango_attr_list_insert (attrs, attr); + + return attrs; +} + +PangoAttrList * +gtk_css_style_get_pango_attributes (GtkCssStyle *style) +{ + PangoAttrList *attrs = NULL; + GtkTextDecorationLine decoration_line; + GtkTextDecorationStyle decoration_style; + const GdkRGBA *color; + const GdkRGBA *decoration_color; + gint letter_spacing; + + /* text-decoration */ + decoration_line = _gtk_css_text_decoration_line_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_LINE)); + decoration_style = _gtk_css_text_decoration_style_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE)); + color = _gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR)); + decoration_color = _gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR)); + + switch (decoration_line) + { + case GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE: + attrs = add_pango_attr (attrs, pango_attr_underline_new (get_pango_underline_from_style (decoration_style))); + if (!gdk_rgba_equal (color, decoration_color)) + attrs = add_pango_attr (attrs, pango_attr_underline_color_new (decoration_color->red * 65535. + 0.5, + decoration_color->green * 65535. + 0.5, + decoration_color->blue * 65535. + 0.5)); + break; + case GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH: + attrs = add_pango_attr (attrs, pango_attr_strikethrough_new (TRUE)); + if (!gdk_rgba_equal (color, decoration_color)) + attrs = add_pango_attr (attrs, pango_attr_strikethrough_color_new (decoration_color->red * 65535. + 0.5, + decoration_color->green * 65535. + 0.5, + decoration_color->blue * 65535. + 0.5)); + break; + case GTK_CSS_TEXT_DECORATION_LINE_NONE: + default: + break; + } + + /* letter-spacing */ + letter_spacing = _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_LETTER_SPACING), 100); + if (letter_spacing != 0) + { + attrs = add_pango_attr (attrs, pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE)); + } + + return attrs; +} |