diff options
author | Timm Bäder <mail@baedert.org> | 2017-10-07 18:22:24 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2017-10-27 16:29:14 -0400 |
commit | 1599288b4f5394a314bfadae5af56d9b60150562 (patch) | |
tree | 067813e3673a89eac9ada2c629efa3bd820820b8 /pango | |
parent | fa79c5fc004b8a852074fe63670b55129f81f52e (diff) | |
download | pango-1599288b4f5394a314bfadae5af56d9b60150562.tar.gz |
layout/renderer: Don't heap-allocate short lived layout iterators
Use the new _pango_layout_get_iter and _pango_layout_iter_destroy
instead.
https://bugzilla.gnome.org/show_bug.cgi?id=788643
Diffstat (limited to 'pango')
-rw-r--r-- | pango/pango-layout.c | 57 | ||||
-rw-r--r-- | pango/pango-renderer.c | 15 |
2 files changed, 37 insertions, 35 deletions
diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 3c817b61..1e123efa 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -1682,31 +1682,31 @@ pango_layout_index_to_line_and_extents (PangoLayout *layout, int index, PangoRectangle *line_rect) { - PangoLayoutIter *iter; + PangoLayoutIter iter; PangoLayoutLine *line = NULL; - iter = pango_layout_get_iter (layout); + _pango_layout_get_iter (layout, &iter); - if (!ITER_IS_INVALID (iter)) + if (!ITER_IS_INVALID (&iter)) while (TRUE) { - PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (iter); + PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (&iter); if (tmp_line->start_index > index) break; /* index was in paragraph delimiters */ line = tmp_line; - pango_layout_iter_get_line_extents (iter, NULL, line_rect); + pango_layout_iter_get_line_extents (&iter, NULL, line_rect); if (line->start_index + line->length > index) break; - if (!pango_layout_iter_next_line (iter)) + if (!pango_layout_iter_next_line (&iter)) break; /* Use end of last line */ } - pango_layout_iter_free (iter); + _pango_layout_iter_destroy (&iter); return line; } @@ -1983,7 +1983,7 @@ pango_layout_xy_to_index (PangoLayout *layout, int *index, gint *trailing) { - PangoLayoutIter *iter; + PangoLayoutIter iter; PangoLayoutLine *prev_line = NULL; PangoLayoutLine *found = NULL; int found_line_x = 0; @@ -1994,15 +1994,15 @@ pango_layout_xy_to_index (PangoLayout *layout, g_return_val_if_fail (PANGO_IS_LAYOUT (layout), FALSE); - iter = pango_layout_get_iter (layout); + _pango_layout_get_iter (layout, &iter); do { PangoRectangle line_logical; int first_y, last_y; - pango_layout_iter_get_line_extents (iter, NULL, &line_logical); - pango_layout_iter_get_line_yrange (iter, &first_y, &last_y); + pango_layout_iter_get_line_extents (&iter, NULL, &line_logical); + pango_layout_iter_get_line_yrange (&iter, &first_y, &last_y); if (y < first_y) { @@ -2016,27 +2016,27 @@ pango_layout_xy_to_index (PangoLayout *layout, if (prev_line == NULL) outside = TRUE; /* off the top */ - found = _pango_layout_iter_get_line (iter); + found = _pango_layout_iter_get_line (&iter); found_line_x = x - line_logical.x; } } else if (y >= first_y && y < last_y) { - found = _pango_layout_iter_get_line (iter); + found = _pango_layout_iter_get_line (&iter); found_line_x = x - line_logical.x; } - prev_line = _pango_layout_iter_get_line (iter); + prev_line = _pango_layout_iter_get_line (&iter); prev_last = last_y; prev_line_x = x - line_logical.x; if (found != NULL) break; } - while (pango_layout_iter_next_line (iter)); + while (pango_layout_iter_next_line (&iter)); - pango_layout_iter_free (iter); + _pango_layout_iter_destroy (&iter); if (found == NULL) { @@ -2076,7 +2076,7 @@ pango_layout_index_to_pos (PangoLayout *layout, PangoRectangle *pos) { PangoRectangle logical_rect; - PangoLayoutIter *iter; + PangoLayoutIter iter; PangoLayoutLine *layout_line = NULL; int x_pos; @@ -2084,20 +2084,20 @@ pango_layout_index_to_pos (PangoLayout *layout, g_return_if_fail (index >= 0); g_return_if_fail (pos != NULL); - iter = pango_layout_get_iter (layout); + _pango_layout_get_iter (layout, &iter); - if (!ITER_IS_INVALID (iter)) + if (!ITER_IS_INVALID (&iter)) { while (TRUE) { - PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (iter); + PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (&iter); if (tmp_line->start_index > index) { - /* index is in the paragraph delimiters, move to + /* index is in the paragraph delim&iters, move to * end of previous line * - * This shouldn’t occur in the first loop iteration as the first + * This shouldn’t occur in the first loop &iteration as the first * line’s start_index should always be 0. */ g_assert (layout_line != NULL); @@ -2107,12 +2107,12 @@ pango_layout_index_to_pos (PangoLayout *layout, layout_line = tmp_line; - pango_layout_iter_get_line_extents (iter, NULL, &logical_rect); + pango_layout_iter_get_line_extents (&iter, NULL, &logical_rect); if (layout_line->start_index + layout_line->length > index) break; - if (!pango_layout_iter_next_line (iter)) + if (!pango_layout_iter_next_line (&iter)) { index = layout_line->start_index + layout_line->length; break; @@ -2134,7 +2134,7 @@ pango_layout_index_to_pos (PangoLayout *layout, pos->width = 0; } - pango_layout_iter_free (iter); + _pango_layout_iter_destroy (&iter); } static void @@ -2835,11 +2835,12 @@ int pango_layout_get_baseline (PangoLayout *layout) { int baseline; + PangoLayoutIter iter; /* XXX this is so inefficient */ - PangoLayoutIter *iter = pango_layout_get_iter (layout); - baseline = pango_layout_iter_get_baseline (iter); - pango_layout_iter_free (iter); + _pango_layout_get_iter (layout, &iter); + baseline = pango_layout_iter_get_baseline (&iter); + _pango_layout_iter_destroy (&iter); return baseline; } diff --git a/pango/pango-renderer.c b/pango/pango-renderer.c index 01b96156..f82c4e48 100644 --- a/pango/pango-renderer.c +++ b/pango/pango-renderer.c @@ -24,6 +24,7 @@ #include "pango-renderer.h" #include "pango-impl-utils.h" +#include "pango-layout-private.h" #define N_RENDER_PARTS 4 @@ -162,7 +163,7 @@ pango_renderer_draw_layout (PangoRenderer *renderer, int x, int y) { - PangoLayoutIter *iter; + PangoLayoutIter iter; g_return_if_fail (PANGO_IS_RENDERER (renderer)); g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -179,7 +180,7 @@ pango_renderer_draw_layout (PangoRenderer *renderer, pango_renderer_activate (renderer); - iter = pango_layout_get_iter (layout); + _pango_layout_get_iter (layout, &iter); do { @@ -187,19 +188,19 @@ pango_renderer_draw_layout (PangoRenderer *renderer, PangoLayoutLine *line; int baseline; - line = pango_layout_iter_get_line_readonly (iter); + line = pango_layout_iter_get_line_readonly (&iter); - pango_layout_iter_get_line_extents (iter, NULL, &logical_rect); - baseline = pango_layout_iter_get_baseline (iter); + pango_layout_iter_get_line_extents (&iter, NULL, &logical_rect); + baseline = pango_layout_iter_get_baseline (&iter); pango_renderer_draw_layout_line (renderer, line, x + logical_rect.x, y + baseline); } - while (pango_layout_iter_next_line (iter)); + while (pango_layout_iter_next_line (&iter)); - pango_layout_iter_free (iter); + _pango_layout_iter_destroy (&iter); pango_renderer_deactivate (renderer); } |