From 9028047d34e7c856947556d9b0cef900aae731c2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 16 Jan 2007 13:16:32 +0000 Subject: Fix width calculation. Was causing ellipsization to stop at a zero-width 2007-01-16 Behdad Esfahbod * pango/ellipsize.c (get_cluster_width): Fix width calculation. Was causing ellipsization to stop at a zero-width glyph that was part of a bigger cluster. * pango/ellipsize.c (remove_one_span): Skip over zero-width clusters, otherwise ellipsization will stop at a zero-width cluster. * pango/pango-glyph-item.c (_pango_glyph_item_iter_next_cluster), (_pango_glyph_item_iter_prev_cluster): Fix yet another bug with in prev_cluster that was making it not work for any interesting cluster. svn path=/trunk/; revision=2158 --- ChangeLog | 14 ++++++++++++++ pango/ellipsize.c | 17 +++++++++++------ pango/pango-glyph-item.c | 14 ++++++++++---- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd18f7a6..a72543e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2007-01-16 Behdad Esfahbod + + * pango/ellipsize.c (get_cluster_width): Fix width calculation. + Was causing ellipsization to stop at a zero-width glyph that was + part of a bigger cluster. + + * pango/ellipsize.c (remove_one_span): Skip over zero-width clusters, + otherwise ellipsization will stop at a zero-width cluster. + + * pango/pango-glyph-item.c (_pango_glyph_item_iter_next_cluster), + (_pango_glyph_item_iter_prev_cluster): Fix yet another bug with + in prev_cluster that was making it not work for any interesting + cluster. + 2007-01-16 Behdad Esfahbod * examples/cairotwisted.c (point_on_path), (draw_text), diff --git a/pango/ellipsize.c b/pango/ellipsize.c index e392d3c9..052ae5d8 100644 --- a/pango/ellipsize.c +++ b/pango/ellipsize.c @@ -174,12 +174,12 @@ get_cluster_width (LineIter *iter) if (run_iter->start_glyph < run_iter->end_glyph) /* LTR */ { for (i = run_iter->start_glyph; i < run_iter->end_glyph; i++) - width += glyphs->glyphs[run_iter->start_glyph].geometry.width; + width += glyphs->glyphs[i].geometry.width; } else /* RTL */ { for (i = run_iter->start_glyph; i > run_iter->end_glyph; i--) - width += glyphs->glyphs[run_iter->start_glyph].geometry.width; + width += glyphs->glyphs[i].geometry.width; } return width; @@ -564,6 +564,7 @@ remove_one_span (EllipsizeState *state) LineIter new_gap_end_iter; int new_gap_start_x; int new_gap_end_x; + int width; /* Find one span backwards and forward from the gap */ @@ -573,9 +574,11 @@ remove_one_span (EllipsizeState *state) { if (!line_iter_prev_cluster (state, &new_gap_start_iter)) break; - new_gap_start_x -= get_cluster_width (&new_gap_start_iter); + width = get_cluster_width (&new_gap_start_iter); + new_gap_start_x -= width; } - while (!starts_at_ellipsization_boundary (state, &new_gap_start_iter)); + while (!starts_at_ellipsization_boundary (state, &new_gap_start_iter) || + width == 0); new_gap_end_iter = state->gap_end_iter; new_gap_end_x = state->gap_end_x; @@ -583,9 +586,11 @@ remove_one_span (EllipsizeState *state) { if (!line_iter_next_cluster (state, &new_gap_end_iter)) break; - new_gap_end_x += get_cluster_width (&new_gap_end_iter); + width = get_cluster_width (&new_gap_end_iter); + new_gap_end_x += width; } - while (!ends_at_ellipsization_boundary (state, &new_gap_end_iter)); + while (!ends_at_ellipsization_boundary (state, &new_gap_end_iter) || + width == 0); if (state->gap_end_x == new_gap_end_x && state->gap_start_x == new_gap_start_x) return FALSE; diff --git a/pango/pango-glyph-item.c b/pango/pango-glyph-item.c index b33e7c4b..b42e0411 100644 --- a/pango/pango-glyph-item.c +++ b/pango/pango-glyph-item.c @@ -162,6 +162,7 @@ _pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) { int glyph_index = iter->end_glyph; PangoGlyphString *glyphs = iter->glyph_item->glyphs; + int cluster; PangoItem *item = iter->glyph_item->item; if (LTR (iter->glyph_item)) @@ -181,6 +182,7 @@ _pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) if (LTR (iter->glyph_item)) { + cluster = glyphs->log_clusters[glyph_index + 1]; while (TRUE) { glyph_index++; @@ -192,7 +194,7 @@ _pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) break; } - if (item->offset + glyphs->log_clusters[glyph_index] != iter->start_index) + if (glyphs->log_clusters[glyph_index] != cluster) { iter->end_index = item->offset + glyphs->log_clusters[glyph_index]; iter->end_char += g_utf8_strlen (iter->text + iter->start_index, @@ -203,6 +205,7 @@ _pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) } else /* RTL */ { + cluster = glyphs->log_clusters[glyph_index - 1]; while (TRUE) { glyph_index--; @@ -214,7 +217,7 @@ _pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) break; } - if (item->offset + glyphs->log_clusters[glyph_index] != iter->start_index) + if (glyphs->log_clusters[glyph_index] != cluster) { iter->end_index = item->offset + glyphs->log_clusters[glyph_index]; iter->end_char += g_utf8_strlen (iter->text + iter->start_index, @@ -242,6 +245,7 @@ _pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) { int glyph_index = iter->start_glyph; PangoGlyphString *glyphs = iter->glyph_item->glyphs; + int cluster; PangoItem *item = iter->glyph_item->item; if (LTR (iter->glyph_item)) @@ -262,6 +266,7 @@ _pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) if (LTR (iter->glyph_item)) { + cluster = glyphs->log_clusters[glyph_index - 1]; while (TRUE) { glyph_index--; @@ -273,7 +278,7 @@ _pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) break; } - if (item->offset + glyphs->log_clusters[glyph_index] != iter->end_index) + if (glyphs->log_clusters[glyph_index] != cluster) { iter->start_index = item->offset + glyphs->log_clusters[glyph_index]; iter->start_char -= g_utf8_strlen (iter->text + iter->start_index, @@ -284,6 +289,7 @@ _pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) } else /* RTL */ { + cluster = glyphs->log_clusters[glyph_index + 1]; while (TRUE) { glyph_index++; @@ -295,7 +301,7 @@ _pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) break; } - if (item->offset + glyphs->log_clusters[glyph_index] != iter->start_index) + if (glyphs->log_clusters[glyph_index] != cluster) { iter->start_index = item->offset + glyphs->log_clusters[glyph_index]; iter->start_char -= g_utf8_strlen (iter->text + iter->start_index, -- cgit v1.2.1