From c802c85d0ed07cc1dae5db8f1991d82ec45bf1bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Wed, 15 Apr 2020 15:37:38 +0200 Subject: Allocate internal PangoAttrLists on the stack --- pango/break.c | 21 +++++++++-------- pango/ellipsize.c | 15 +++++++----- pango/pango-attributes-private.h | 9 ++++++++ pango/pango-attributes.c | 50 ++++++++++++++++++++++------------------ pango/pango-layout.c | 22 +++++++++--------- 5 files changed, 67 insertions(+), 50 deletions(-) diff --git a/pango/break.c b/pango/break.c index 875d776c..432ff493 100644 --- a/pango/break.c +++ b/pango/break.c @@ -24,6 +24,7 @@ #include "pango-break.h" #include "pango-script-private.h" #include "pango-emoji-private.h" +#include "pango-attributes-private.h" #include "pango-break-table.h" #include "pango-impl-utils.h" #include @@ -1905,31 +1906,31 @@ break_attrs (const char *text, PangoLogAttr *log_attrs, int log_attrs_len) { - PangoAttrList *list; - PangoAttrIterator *iter; + PangoAttrList list; + PangoAttrIterator iter; GSList *l; - list = pango_attr_list_new (); + _pango_attr_list_init (&list); for (l = attributes; l; l = l->next) { PangoAttribute *attr = l->data; if (attr->klass->type == PANGO_ATTR_ALLOW_BREAKS) - pango_attr_list_insert (list, pango_attribute_copy (attr)); + pango_attr_list_insert (&list, pango_attribute_copy (attr)); } - iter = pango_attr_list_get_iterator (list); + _pango_attr_list_get_iterator (&list, &iter); do { PangoAttribute *attr; - attr = pango_attr_iterator_get (iter, PANGO_ATTR_ALLOW_BREAKS); + attr = pango_attr_iterator_get (&iter, PANGO_ATTR_ALLOW_BREAKS); if (attr && ((PangoAttrInt*)attr)->value == 0) { int start, end; int start_pos, end_pos; int pos; - pango_attr_iterator_range (iter, &start, &end); + pango_attr_iterator_range (&iter, &start, &end); if (start < offset) start_pos = 0; else @@ -1946,10 +1947,10 @@ break_attrs (const char *text, log_attrs[pos].is_char_break = FALSE; } } - } while (pango_attr_iterator_next (iter)); + } while (pango_attr_iterator_next (&iter)); - pango_attr_iterator_destroy (iter); - pango_attr_list_unref (list); + _pango_attr_iterator_destroy (&iter); + _pango_attr_list_destroy (&list); return TRUE; } diff --git a/pango/ellipsize.c b/pango/ellipsize.c index 4b27025e..4eb98a1a 100644 --- a/pango/ellipsize.c +++ b/pango/ellipsize.c @@ -25,6 +25,7 @@ #include "pango-glyph-item.h" #include "pango-layout-private.h" #include "pango-font-private.h" +#include "pango-attributes-private.h" #include "pango-impl-utils.h" typedef struct _EllipsizeState EllipsizeState; @@ -299,7 +300,7 @@ itemize_text (EllipsizeState *state, static void shape_ellipsis (EllipsizeState *state) { - PangoAttrList *attrs = pango_attr_list_new (); + PangoAttrList attrs; GSList *run_attrs; PangoItem *item; PangoGlyphString *glyphs; @@ -309,6 +310,8 @@ shape_ellipsis (EllipsizeState *state) int len; int i; + _pango_attr_list_init (&attrs); + /* Create/reset state->ellipsis_run */ if (!state->ellipsis_run) @@ -333,7 +336,7 @@ shape_ellipsis (EllipsizeState *state) attr->start_index = 0; attr->end_index = G_MAXINT; - pango_attr_list_insert (attrs, attr); + pango_attr_list_insert (&attrs, attr); } g_slist_free (run_attrs); @@ -341,7 +344,7 @@ shape_ellipsis (EllipsizeState *state) fallback = pango_attr_fallback_new (FALSE); fallback->start_index = 0; fallback->end_index = G_MAXINT; - pango_attr_list_insert (attrs, fallback); + pango_attr_list_insert (&attrs, fallback); /* First try using a specific ellipsis character in the best matching font */ @@ -350,7 +353,7 @@ shape_ellipsis (EllipsizeState *state) else ellipsis_text = "\342\200\246"; /* U+2026: HORIZONTAL ELLIPSIS */ - item = itemize_text (state, ellipsis_text, attrs); + item = itemize_text (state, ellipsis_text, &attrs); /* If that fails we use "..." in the first matching font */ @@ -365,10 +368,10 @@ shape_ellipsis (EllipsizeState *state) ((PangoAttrInt *)fallback)->value = TRUE; ellipsis_text = "..."; - item = itemize_text (state, ellipsis_text, attrs); + item = itemize_text (state, ellipsis_text, &attrs); } - pango_attr_list_unref (attrs); + _pango_attr_list_destroy (&attrs); state->ellipsis_run->item = item; diff --git a/pango/pango-attributes-private.h b/pango/pango-attributes-private.h index 38e4525d..efeb88cd 100644 --- a/pango/pango-attributes-private.h +++ b/pango/pango-attributes-private.h @@ -28,6 +28,15 @@ struct _PangoAttrIterator guint end_index; }; +struct _PangoAttrList +{ + guint ref_count; + GSList *attributes; + GSList *attributes_tail; +}; + +void _pango_attr_list_init (PangoAttrList *list); +void _pango_attr_list_destroy (PangoAttrList *list); void _pango_attr_list_get_iterator (PangoAttrList *list, PangoAttrIterator *iterator); diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c index 98e26872..5ac955c4 100644 --- a/pango/pango-attributes.c +++ b/pango/pango-attributes.c @@ -37,13 +37,6 @@ #include "pango-attributes-private.h" #include "pango-impl-utils.h" -struct _PangoAttrList -{ - guint ref_count; - GSList *attributes; - GSList *attributes_tail; -}; - static PangoAttribute *pango_attr_color_new (const PangoAttrClass *klass, guint16 red, guint16 green, @@ -1313,6 +1306,14 @@ G_DEFINE_BOXED_TYPE (PangoAttrList, pango_attr_list, pango_attr_list_copy, pango_attr_list_unref); +void +_pango_attr_list_init (PangoAttrList *list) +{ + list->ref_count = 1; + list->attributes = NULL; + list->attributes_tail = NULL; +} + /** * pango_attr_list_new: * @@ -1326,9 +1327,7 @@ pango_attr_list_new (void) { PangoAttrList *list = g_slice_new (PangoAttrList); - list->ref_count = 1; - list->attributes = NULL; - list->attributes_tail = NULL; + _pango_attr_list_init (list); return list; } @@ -1354,6 +1353,23 @@ pango_attr_list_ref (PangoAttrList *list) return list; } +void +_pango_attr_list_destroy (PangoAttrList *list) +{ + GSList *tmp_list; + + tmp_list = list->attributes; + while (tmp_list) + { + PangoAttribute *attr = tmp_list->data; + tmp_list = tmp_list->next; + + attr->klass->destroy (attr); + } + + g_slist_free (list->attributes); +} + /** * pango_attr_list_unref: * @list: (nullable): a #PangoAttrList, may be %NULL @@ -1365,8 +1381,6 @@ pango_attr_list_ref (PangoAttrList *list) void pango_attr_list_unref (PangoAttrList *list) { - GSList *tmp_list; - if (list == NULL) return; @@ -1374,17 +1388,7 @@ pango_attr_list_unref (PangoAttrList *list) if (g_atomic_int_dec_and_test ((int *) &list->ref_count)) { - tmp_list = list->attributes; - while (tmp_list) - { - PangoAttribute *attr = tmp_list->data; - tmp_list = tmp_list->next; - - attr->klass->destroy (attr); - } - - g_slist_free (list->attributes); - + _pango_attr_list_destroy (list); g_slice_free (PangoAttrList, list); } } diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 09132a45..f6d37068 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -3069,7 +3069,7 @@ ensure_tab_width (PangoLayout *layout) GList *items; PangoAttribute *attr; PangoAttrList *layout_attrs; - PangoAttrList *tmp_attrs; + PangoAttrList tmp_attrs; PangoAttrIterator iter; PangoFontDescription *font_desc = pango_font_description_copy_static (pango_context_get_font_description (layout->context)); PangoLanguage *language; @@ -3078,19 +3078,19 @@ ensure_tab_width (PangoLayout *layout) _pango_attr_list_get_iterator (layout_attrs, &iter); pango_attr_iterator_get_font (&iter, font_desc, &language, NULL); - tmp_attrs = pango_attr_list_new (); + _pango_attr_list_init (&tmp_attrs); attr = pango_attr_font_desc_new (font_desc); pango_font_description_free (font_desc); - pango_attr_list_insert_before (tmp_attrs, attr); + pango_attr_list_insert_before (&tmp_attrs, attr); if (language) { attr = pango_attr_language_new (language); - pango_attr_list_insert_before (tmp_attrs, attr); + pango_attr_list_insert_before (&tmp_attrs, attr); } - items = pango_itemize (layout->context, " ", 0, 1, tmp_attrs, NULL); + items = pango_itemize (layout->context, " ", 0, 1, &tmp_attrs, NULL); _pango_attr_iterator_destroy (&iter); if (layout_attrs != layout->attrs) @@ -3098,7 +3098,7 @@ ensure_tab_width (PangoLayout *layout) pango_attr_list_unref (layout_attrs); layout_attrs = NULL; } - pango_attr_list_unref (tmp_attrs); + _pango_attr_list_destroy (&tmp_attrs); item = items->data; pango_shape (" ", 8, &item->analysis, glyphs); @@ -3466,18 +3466,18 @@ get_need_hyphen (PangoItem *item, const char *p; gboolean prev_space; gboolean prev_hyphen; - PangoAttrList *attrs; + PangoAttrList attrs; PangoAttrIterator iter; GSList *l; - attrs = pango_attr_list_new (); + _pango_attr_list_init (&attrs); for (l = item->analysis.extra_attrs; l; l = l->next) { PangoAttribute *attr = l->data; if (attr->klass->type == PANGO_ATTR_INSERT_HYPHENS) - pango_attr_list_change (attrs, pango_attribute_copy (attr)); + pango_attr_list_change (&attrs, pango_attribute_copy (attr)); } - _pango_attr_list_get_iterator (attrs, &iter); + _pango_attr_list_get_iterator (&attrs, &iter); for (i = 0, p = text + item->offset; i < item->num_chars; i++, p = g_utf8_next_char (p)) { @@ -3563,7 +3563,7 @@ get_need_hyphen (PangoItem *item, } _pango_attr_iterator_destroy (&iter); - pango_attr_list_unref (attrs); + _pango_attr_list_destroy (&attrs); } static gboolean -- cgit v1.2.1