diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-11-10 23:45:00 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-11-10 23:48:15 -0500 |
commit | 9ae51bf8ee1e8c225221aea7e57b256a77208219 (patch) | |
tree | 65b9159e7f5a4a6f842dbd6dbef65381604615c4 | |
parent | bbbdc707f3c568e5a642afe6342b45654f8f332f (diff) | |
download | pango-9ae51bf8ee1e8c225221aea7e57b256a77208219.tar.gz |
wip: glyph item: get more info
This needs to be made properly private.
-rw-r--r-- | pango/pango-glyph-item.c | 48 | ||||
-rw-r--r-- | pango/pango-glyph-item.h | 5 |
2 files changed, 53 insertions, 0 deletions
diff --git a/pango/pango-glyph-item.c b/pango/pango-glyph-item.c index 7eb1737d..93645d34 100644 --- a/pango/pango-glyph-item.c +++ b/pango/pango-glyph-item.c @@ -860,3 +860,51 @@ pango_glyph_item_get_logical_widths (PangoGlyphItem *glyph_item, } } } + +void +pango_glyph_item_get_logical_widths_and_clusters (PangoGlyphItem *glyph_item, + const char *text, + int *logical_widths, + int *clusters) +{ + PangoGlyphItemIter iter; + gboolean has_cluster; + int dir; + + dir = glyph_item->item->analysis.level % 2 == 0 ? +1 : -1; + for (has_cluster = pango_glyph_item_iter_init_start (&iter, glyph_item, text); + has_cluster; + has_cluster = pango_glyph_item_iter_next_cluster (&iter)) + { + int glyph_index, char_index, num_chars, cluster_width = 0, char_width; + + for (glyph_index = iter.start_glyph; + glyph_index != iter.end_glyph; + glyph_index += dir) + { + cluster_width += glyph_item->glyphs->glyphs[glyph_index].geometry.width; + } + + num_chars = iter.end_char - iter.start_char; + if (num_chars == 1) + { + logical_widths[char_index] = cluster_width; + clusters[char_index] = 0; + } + else if (num_chars > 0) /* pedantic */ + { + char_width = cluster_width / num_chars; + + for (char_index = iter.start_char; + char_index < iter.end_char; + char_index++) + { + logical_widths[char_index] = char_width; + clusters[char_index] = char_index - iter.start_char + 1; + } + + /* add any residues to the first char */ + logical_widths[iter.start_char] += cluster_width - (char_width * num_chars); + } + } +} diff --git a/pango/pango-glyph-item.h b/pango/pango-glyph-item.h index fd8951d2..fc18ca02 100644 --- a/pango/pango-glyph-item.h +++ b/pango/pango-glyph-item.h @@ -85,6 +85,11 @@ void pango_glyph_item_get_logical_widths (PangoGlyphItem *glyph_item, const char *text, int *logical_widths); +void pango_glyph_item_get_logical_widths_and_clusters (PangoGlyphItem *glyph_item, + const char *text, + int *logical_widths, + int *clusters); + /** * PangoGlyphItemIter: |