Fix width calculation. Was causing ellipsization to stop at a zero-width
authorBehdad Esfahbod <behdad@gnome.org>
Tue, 16 Jan 2007 13:16:32 +0000 (13:16 +0000)
committerBehdad Esfahbod <behdad@src.gnome.org>
Tue, 16 Jan 2007 13:16:32 +0000 (13:16 +0000)
2007-01-16  Behdad Esfahbod  <behdad@gnome.org>

        * 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
pango/ellipsize.c
pango/pango-glyph-item.c

index dd18f7a..a72543e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2007-01-16  Behdad Esfahbod  <behdad@gnome.org>
 
+       * 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  <behdad@gnome.org>
+
        * examples/cairotwisted.c (point_on_path), (draw_text),
        (draw_twisted), (draw_dream), (draw_wow), (main):
        Improve text-on-path example.
index e392d3c..052ae5d 100644 (file)
@@ -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;
index b33e7c4..b42e041 100644 (file)
@@ -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,