[pango] Shape engine should return array in LTR order when expected
- From: Kristian Rietveld <kristian src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango] Shape engine should return array in LTR order when expected
- Date: Thu, 14 Apr 2011 10:44:02 +0000 (UTC)
commit 32fea7e2821f28c470048f5951d8de1b787104a5
Author: Kristian Rietveld <kris gtk org>
Date: Sun Mar 7 17:16:33 2010 +0100
Shape engine should return array in LTR order when expected
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 1670710..8dc3dba 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));
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]