diff options
Diffstat (limited to 'pango/glyphstring.c')
-rw-r--r-- | pango/glyphstring.c | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/pango/glyphstring.c b/pango/glyphstring.c index b29efe09..d3030e39 100644 --- a/pango/glyphstring.c +++ b/pango/glyphstring.c @@ -22,6 +22,7 @@ #include <glib.h> #include <pango-glyph.h> #include <pango-font.h> +#include <unicode.h> /** * pango_glyph_string_new: @@ -151,12 +152,12 @@ pango_glyph_string_extents (PangoGlyphString *glyphs, { new_pos = MIN (ink_rect->x, x_pos + glyph_ink.x + geometry->x_offset); ink_rect->width = MAX (ink_rect->x + ink_rect->width, - x_pos + glyph_ink.x + glyph_ink.width + geometry->x_offset) - ink_rect->x; + x_pos + glyph_ink.x + glyph_ink.width + geometry->x_offset) - new_pos; ink_rect->x = new_pos; new_pos = MIN (ink_rect->y, glyph_ink.y + geometry->y_offset); ink_rect->height = MAX (ink_rect->y + ink_rect->height, - glyph_ink.y + glyph_ink.height + geometry->y_offset) - ink_rect->y; + glyph_ink.y + glyph_ink.height + geometry->y_offset) - new_pos; ink_rect->y = new_pos; } @@ -164,12 +165,12 @@ pango_glyph_string_extents (PangoGlyphString *glyphs, { new_pos = MIN (logical_rect->x, x_pos + glyph_logical.x + geometry->x_offset); logical_rect->width = MAX (logical_rect->x + logical_rect->width, - x_pos + glyph_logical.x + glyph_logical.width + geometry->x_offset) - logical_rect->x; + x_pos + glyph_logical.x + glyph_logical.width + geometry->x_offset) - new_pos; logical_rect->x = new_pos; new_pos = MIN (logical_rect->y, glyph_logical.y + geometry->y_offset); logical_rect->height = MAX (logical_rect->y + logical_rect->height, - glyph_logical.y + glyph_logical.height + geometry->y_offset) - logical_rect->y; + glyph_logical.y + glyph_logical.height + geometry->y_offset) - new_pos; logical_rect->y = new_pos; } } @@ -178,3 +179,67 @@ pango_glyph_string_extents (PangoGlyphString *glyphs, } } +/** + * pango_glyph_string_get_logical_widths: + * @glyphs: a #PangoGlyphString + * @text: the text corresponding to the glyphs + * @length: the length of @text, in bytes + * @embedding_level: the embedding level of the string + * @logical_widths: an array whose length is unicode_strlen (text, length) + * to be filled in with the resulting character widths. + * + * Given a #PangoGlyphString resulting from pango_shape() and the corresponding + * text, determine the screen width corresponding to each character. When + * multiple characters compose a single cluster, the width of the entire + * cluster is divided equally among the characters. + **/ +void +pango_glyph_string_get_logical_widths (PangoGlyphString *glyphs, + char *text, + int length, + int embedding_level, + int *logical_widths) +{ + int i, j; + int last_cluster = 0; + int width = 0; + int last_cluster_width = 0; + char *p = text; + + for (i=0; i<=glyphs->num_glyphs; i++) + { + int glyph_index = (embedding_level % 2 == 0) ? i : glyphs->num_glyphs - i - 1; + + if (i == glyphs->num_glyphs || p != text + glyphs->log_clusters[glyph_index]) + { + int next_cluster = last_cluster; + + if (glyph_index < glyphs->num_glyphs) + { + while (p < text + glyphs->log_clusters[glyph_index]) + { + next_cluster++; + p = unicode_next_utf8 (p); + } + } + else + { + while (p < text + length) + { + next_cluster++; + p = unicode_next_utf8 (p); + } + } + + for (j = last_cluster; j < next_cluster; j++) + logical_widths[j] = (width - last_cluster_width) / (next_cluster - last_cluster); + + last_cluster = next_cluster; + last_cluster_width = width; + } + + if (i < glyphs->num_glyphs) + width += glyphs->glyphs[i].geometry.width; + } +} + |