From 7b0929ad388d26e7c24620c5b8e93f9401eb8859 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 3 Jun 2016 00:19:24 -0400 Subject: [PATCH] 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. --- gtk/gtkcssstyle.c | 76 ++++++++++++++++++++++++++++++++++++++++ gtk/gtkcssstyleprivate.h | 2 ++ gtk/gtkstylecontext.c | 71 +------------------------------------ 3 files changed, 79 insertions(+), 70 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; +} diff --git a/gtk/gtkcssstyleprivate.h b/gtk/gtkcssstyleprivate.h index f1d165f8df..049574a450 100644 --- a/gtk/gtkcssstyleprivate.h +++ b/gtk/gtkcssstyleprivate.h @@ -74,6 +74,8 @@ gboolean gtk_css_style_print (GtkCssStyle GString *string, guint indent, gboolean skip_initial); +PangoAttrList * gtk_css_style_get_pango_attributes (GtkCssStyle *style); + G_END_DECLS diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index f5da8cab76..a6191bd0d1 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -3034,79 +3034,10 @@ _gtk_style_context_get_icon_extents (GtkStyleContext *context, x, y, width, height); } -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_style_context_get_pango_attributes (GtkStyleContext *context) { - 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_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_DECORATION_LINE)); - decoration_style = _gtk_css_text_decoration_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE)); - color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)); - decoration_color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, 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_style_context_peek_property (context, 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; + return gtk_css_style_get_pango_attributes (gtk_style_context_lookup_style (context)); } static AtkAttributeSet *