From 584a71ae960c76e1fc715f0f11e9834ab0ca4471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Sun, 12 Apr 2020 09:22:38 +0200 Subject: [PATCH] cssstyle: Only create PangoAttrList if there are attribtues Don't allocate a new GString if we never need it and therefore don't create the PangoAttrList if we have no attributes anyway. Update callers to handle the possible NULL return value. --- gtk/gtkcssstyle.c | 101 +++++++++++++++++++++++++--------------------- gtk/gtklabel.c | 28 +++++++------ 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/gtk/gtkcssstyle.c b/gtk/gtkcssstyle.c index d303fdecdd..9c570a61a0 100644 --- a/gtk/gtkcssstyle.c +++ b/gtk/gtkcssstyle.c @@ -412,11 +412,16 @@ add_pango_attr (PangoAttrList *attrs, } static void -append_separated (GString *s, const char *text) +append_separated (GString **s, + const char *text) { - if (s->len > 0) - g_string_append (s, ", "); - g_string_append (s, text); + if (G_UNLIKELY (!*s)) + *s = g_string_new (NULL); + + if ((*s)->len > 0) + g_string_append (*s, ", "); + + g_string_append (*s, text); } PangoAttrList * @@ -472,15 +477,15 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) /* OpenType features */ - s = g_string_new (""); + s = NULL; switch (_gtk_css_font_kerning_value_get (style->font_variant->font_kerning)) { case GTK_CSS_FONT_KERNING_NORMAL: - append_separated (s, "kern 1"); + append_separated (&s, "kern 1"); break; case GTK_CSS_FONT_KERNING_NONE: - append_separated (s, "kern 0"); + append_separated (&s, "kern 0"); break; case GTK_CSS_FONT_KERNING_AUTO: default: @@ -493,34 +498,34 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) /* all defaults */ } else if (ligatures == GTK_CSS_FONT_VARIANT_LIGATURE_NONE) - append_separated (s, "liga 0, clig 0, dlig 0, hlig 0, calt 0"); + append_separated (&s, "liga 0, clig 0, dlig 0, hlig 0, calt 0"); else { if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_COMMON_LIGATURES) - append_separated (s, "liga 1, clig 1"); + append_separated (&s, "liga 1, clig 1"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_NO_COMMON_LIGATURES) - append_separated (s, "liga 0, clig 0"); + append_separated (&s, "liga 0, clig 0"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_DISCRETIONARY_LIGATURES) - append_separated (s, "dlig 1"); + append_separated (&s, "dlig 1"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_NO_DISCRETIONARY_LIGATURES) - append_separated (s, "dlig 0"); + append_separated (&s, "dlig 0"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_HISTORICAL_LIGATURES) - append_separated (s, "hlig 1"); + append_separated (&s, "hlig 1"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_NO_HISTORICAL_LIGATURES) - append_separated (s, "hlig 0"); + append_separated (&s, "hlig 0"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_CONTEXTUAL) - append_separated (s, "calt 1"); + append_separated (&s, "calt 1"); if (ligatures & GTK_CSS_FONT_VARIANT_LIGATURE_NO_CONTEXTUAL) - append_separated (s, "calt 0"); + append_separated (&s, "calt 0"); } switch (_gtk_css_font_variant_position_value_get (style->font_variant->font_variant_position)) { case GTK_CSS_FONT_VARIANT_POSITION_SUB: - append_separated (s, "subs 1"); + append_separated (&s, "subs 1"); break; case GTK_CSS_FONT_VARIANT_POSITION_SUPER: - append_separated (s, "sups 1"); + append_separated (&s, "sups 1"); break; case GTK_CSS_FONT_VARIANT_POSITION_NORMAL: default: @@ -530,22 +535,22 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) switch (_gtk_css_font_variant_caps_value_get (style->font_variant->font_variant_caps)) { case GTK_CSS_FONT_VARIANT_CAPS_SMALL_CAPS: - append_separated (s, "smcp 1"); + append_separated (&s, "smcp 1"); break; case GTK_CSS_FONT_VARIANT_CAPS_ALL_SMALL_CAPS: - append_separated (s, "c2sc 1, smcp 1"); + append_separated (&s, "c2sc 1, smcp 1"); break; case GTK_CSS_FONT_VARIANT_CAPS_PETITE_CAPS: - append_separated (s, "pcap 1"); + append_separated (&s, "pcap 1"); break; case GTK_CSS_FONT_VARIANT_CAPS_ALL_PETITE_CAPS: - append_separated (s, "c2pc 1, pcap 1"); + append_separated (&s, "c2pc 1, pcap 1"); break; case GTK_CSS_FONT_VARIANT_CAPS_UNICASE: - append_separated (s, "unic 1"); + append_separated (&s, "unic 1"); break; case GTK_CSS_FONT_VARIANT_CAPS_TITLING_CAPS: - append_separated (s, "titl 1"); + append_separated (&s, "titl 1"); break; case GTK_CSS_FONT_VARIANT_CAPS_NORMAL: default: @@ -560,27 +565,27 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) else { if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_LINING_NUMS) - append_separated (s, "lnum 1"); + append_separated (&s, "lnum 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_OLDSTYLE_NUMS) - append_separated (s, "onum 1"); + append_separated (&s, "onum 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_PROPORTIONAL_NUMS) - append_separated (s, "pnum 1"); + append_separated (&s, "pnum 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_TABULAR_NUMS) - append_separated (s, "tnum 1"); + append_separated (&s, "tnum 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_DIAGONAL_FRACTIONS) - append_separated (s, "frac 1"); + append_separated (&s, "frac 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_STACKED_FRACTIONS) - append_separated (s, "afrc 1"); + append_separated (&s, "afrc 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_ORDINAL) - append_separated (s, "ordn 1"); + append_separated (&s, "ordn 1"); if (numeric & GTK_CSS_FONT_VARIANT_NUMERIC_SLASHED_ZERO) - append_separated (s, "zero 1"); + append_separated (&s, "zero 1"); } switch (_gtk_css_font_variant_alternate_value_get (style->font_variant->font_variant_alternates)) { case GTK_CSS_FONT_VARIANT_ALTERNATE_HISTORICAL_FORMS: - append_separated (s, "hist 1"); + append_separated (&s, "hist 1"); break; case GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL: default: @@ -595,34 +600,37 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) else { if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS78) - append_separated (s, "jp78 1"); + append_separated (&s, "jp78 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS83) - append_separated (s, "jp83 1"); + append_separated (&s, "jp83 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS90) - append_separated (s, "jp90 1"); + append_separated (&s, "jp90 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS04) - append_separated (s, "jp04 1"); + append_separated (&s, "jp04 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED) - append_separated (s, "smpl 1"); + append_separated (&s, "smpl 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL) - append_separated (s, "trad 1"); + append_separated (&s, "trad 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH) - append_separated (s, "fwid 1"); + append_separated (&s, "fwid 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL) - append_separated (s, "pwid 1"); + append_separated (&s, "pwid 1"); if (east_asian & GTK_CSS_FONT_VARIANT_EAST_ASIAN_RUBY) - append_separated (s, "ruby 1"); + append_separated (&s, "ruby 1"); } settings = gtk_css_font_features_value_get_features (style->font->font_feature_settings); if (settings) { - append_separated (s, settings); + append_separated (&s, settings); g_free (settings); } - attrs = add_pango_attr (attrs, pango_attr_font_features_new (s->str)); - g_string_free (s, TRUE); + if (s) + { + attrs = add_pango_attr (attrs, pango_attr_font_features_new (s->str)); + g_string_free (s, TRUE); + } return attrs; } @@ -672,7 +680,8 @@ gtk_css_style_get_pango_font (GtkCssStyle *style) v = style->font->font_variation_settings; str = gtk_css_font_variations_value_get_variations (v); - pango_font_description_set_variations (description, str); + if (str) + pango_font_description_set_variations (description, str); g_free (str); return description; diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index b960018f43..705c6ae7d8 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -2998,24 +2998,24 @@ gtk_label_update_layout_attributes (GtkLabel *label) const GdkRGBA *link_color; PangoAttrList *link_attrs; PangoAttribute *attr; - GSList *attributes; - GSList *l; style = gtk_css_node_get_style (link->cssnode); link_attrs = gtk_css_style_get_pango_attributes (style); - - attributes = pango_attr_list_get_attributes (link_attrs); - for (l = attributes; l; l = l->next) + if (link_attrs) { - attr = l->data; + GSList *attributes = pango_attr_list_get_attributes (link_attrs); + GSList *l; + for (l = attributes; l; l = l->next) + { + attr = l->data; - attr->start_index = link->start; - attr->end_index = link->end; - pango_attr_list_insert (attrs, attr); + attr->start_index = link->start; + attr->end_index = link->end; + pango_attr_list_insert (attrs, attr); + } + g_slist_free (attributes); } - g_slist_free (attributes); - link_color = gtk_css_color_value_get_rgba (style->core->color); attr = pango_attr_foreground_new (link_color->red * 65535, link_color->green * 65535, @@ -3034,9 +3034,11 @@ gtk_label_update_layout_attributes (GtkLabel *label) style = gtk_css_node_get_style (gtk_widget_get_css_node (widget)); style_attrs = gtk_css_style_get_pango_attributes (style); - attrs = _gtk_pango_attr_list_merge (attrs, style_attrs); if (style_attrs) - pango_attr_list_unref (style_attrs); + { + attrs = _gtk_pango_attr_list_merge (attrs, style_attrs); + pango_attr_list_unref (style_attrs); + } attrs = _gtk_pango_attr_list_merge (attrs, priv->markup_attrs); attrs = _gtk_pango_attr_list_merge (attrs, priv->attrs);