diff options
author | Kristian Rietveld <kris@gtk.org> | 2010-03-07 17:16:33 +0100 |
---|---|---|
committer | Kristian Rietveld <kris@gtk.org> | 2011-04-14 12:30:03 +0200 |
commit | 32fea7e2821f28c470048f5951d8de1b787104a5 (patch) | |
tree | 765c0bbce22d7c82bbbc024d9baa835dcf8ad70f /modules | |
parent | 6854053a1603a6dfe8421376d3455255800ce735 (diff) | |
download | pango-32fea7e2821f28c470048f5951d8de1b787104a5.tar.gz |
Shape engine should return array in LTR order when expected
Diffstat (limited to 'modules')
-rw-r--r-- | modules/basic/basic-coretext.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/modules/basic/basic-coretext.c b/modules/basic/basic-coretext.c index 16707102..8dc3dbab 100644 --- a/modules/basic/basic-coretext.c +++ b/modules/basic/basic-coretext.c @@ -86,6 +86,7 @@ basic_engine_shape (PangoEngineShape *engine, PangoCoverage *coverage; CFArrayRef runs; CTRunRef run; + CTRunStatus run_status; CFIndex i, glyph_count; const CGGlyph *cgglyphs; @@ -119,7 +120,11 @@ basic_engine_shape (PangoEngineShape *engine, runs = CTLineGetGlyphRuns (line); + /* Since Pango divides things into runs already, we assume there is + * only a single run in this line. + */ run = CFArrayGetValueAtIndex (runs, 0); + run_status = CTRunGetStatus (run); glyph_count = CTRunGetGlyphCount (run); cgglyphs = CTRunGetGlyphsPtr (run); @@ -130,6 +135,7 @@ basic_engine_shape (PangoEngineShape *engine, for (i = 0; i < glyph_count; i++) { + CFIndex real_i, prev_i; gunichar wc; gunichar mirrored_ch; @@ -139,12 +145,23 @@ basic_engine_shape (PangoEngineShape *engine, if (pango_get_mirror_char (wc, &mirrored_ch)) wc = mirrored_ch; + if (run_status & kCTRunStatusRightToLeft) + { + real_i = glyph_count - i - 1; + prev_i = real_i + 1; + } + else + { + real_i = i; + prev_i = real_i - 1; + } + if (wc == 0xa0) /* non-break-space */ wc = 0x20; if (pango_is_zero_width (wc)) { - set_glyph (font, glyphs, i, p - text, PANGO_GLYPH_EMPTY); + set_glyph (font, glyphs, real_i, p - text, PANGO_GLYPH_EMPTY); } else { @@ -154,7 +171,7 @@ basic_engine_shape (PangoEngineShape *engine, if (result != PANGO_COVERAGE_NONE) { - set_glyph (font, glyphs, i, p - text, cgglyphs[i]); + set_glyph (font, glyphs, real_i, p - text, cgglyphs[real_i]); if (g_unichar_type (wc) == G_UNICODE_NON_SPACING_MARK) { @@ -162,23 +179,23 @@ basic_engine_shape (PangoEngineShape *engine, { PangoRectangle logical_rect, ink_rect; - glyphs->glyphs[i].geometry.width = MAX (glyphs->glyphs[i-1].geometry.width, - glyphs->glyphs[i].geometry.width); - glyphs->glyphs[i-1].geometry.width = 0; - glyphs->log_clusters[i] = glyphs->log_clusters[i-1]; + glyphs->glyphs[real_i].geometry.width = MAX (glyphs->glyphs[prev_i].geometry.width, + glyphs->glyphs[prev_i].geometry.width); + glyphs->glyphs[prev_i].geometry.width = 0; + glyphs->log_clusters[real_i] = glyphs->log_clusters[prev_i]; /* Some heuristics to try to guess how overstrike glyphs are * done and compensate */ - pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, &ink_rect, &logical_rect); + pango_font_get_glyph_extents (font, glyphs->glyphs[real_i].glyph, &ink_rect, &logical_rect); if (logical_rect.width == 0 && ink_rect.x == 0) - glyphs->glyphs[i].geometry.x_offset = (glyphs->glyphs[i].geometry.width - ink_rect.width) / 2; + glyphs->glyphs[real_i].geometry.x_offset = (glyphs->glyphs[real_i].geometry.width - ink_rect.width) / 2; } } } else { - set_glyph (font, glyphs, i, p - text, + set_glyph (font, glyphs, real_i, p - text, PANGO_GET_UNKNOWN_GLYPH (wc)); } } |