summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/basic/basic-coretext.c80
1 files changed, 37 insertions, 43 deletions
diff --git a/modules/basic/basic-coretext.c b/modules/basic/basic-coretext.c
index 8dc3dbab..991743e4 100644
--- a/modules/basic/basic-coretext.c
+++ b/modules/basic/basic-coretext.c
@@ -76,7 +76,6 @@ basic_engine_shape (PangoEngineShape *engine,
const PangoAnalysis *analysis,
PangoGlyphString *glyphs)
{
- const char *p;
char *copy;
CTLineRef line;
CFStringRef cstr;
@@ -88,6 +87,7 @@ basic_engine_shape (PangoEngineShape *engine,
CTRunRef run;
CTRunStatus run_status;
CFIndex i, glyph_count;
+ CFIndex *indices = NULL;
const CGGlyph *cgglyphs;
CFTypeRef keys[] = {
@@ -128,7 +128,9 @@ basic_engine_shape (PangoEngineShape *engine,
glyph_count = CTRunGetGlyphCount (run);
cgglyphs = CTRunGetGlyphsPtr (run);
- p = text;
+ indices = malloc (sizeof (CFIndex *) * glyph_count);
+ CTRunGetStringIndices (run, CFRangeMake (0, glyph_count), indices);
+
pango_glyph_string_set_size (glyphs, glyph_count);
coverage = pango_font_get_coverage (PANGO_FONT (cfont),
analysis->language);
@@ -138,12 +140,7 @@ basic_engine_shape (PangoEngineShape *engine,
CFIndex real_i, prev_i;
gunichar wc;
gunichar mirrored_ch;
-
- wc = g_utf8_get_char (p);
-
- if (analysis->level % 2)
- if (pango_get_mirror_char (wc, &mirrored_ch))
- wc = mirrored_ch;
+ PangoCoverageLevel result;
if (run_status & kCTRunStatusRightToLeft)
{
@@ -156,53 +153,50 @@ basic_engine_shape (PangoEngineShape *engine,
prev_i = real_i - 1;
}
+ wc = CFStringGetCharacterAtIndex (cstr, indices[real_i]);
+
+ if (analysis->level % 2)
+ if (pango_get_mirror_char (wc, &mirrored_ch))
+ wc = mirrored_ch;
+
if (wc == 0xa0) /* non-break-space */
wc = 0x20;
- if (pango_is_zero_width (wc))
- {
- set_glyph (font, glyphs, real_i, p - text, PANGO_GLYPH_EMPTY);
- }
- else
- {
- PangoCoverageLevel result;
+ result = pango_coverage_get (coverage, wc);
- result = pango_coverage_get (coverage, wc);
+ if (result != PANGO_COVERAGE_NONE)
+ {
+ set_glyph (font, glyphs, real_i,
+ g_utf8_offset_to_pointer (text, indices[real_i]) - text,
+ cgglyphs[real_i]);
- if (result != PANGO_COVERAGE_NONE)
+ if (g_unichar_type (wc) == G_UNICODE_NON_SPACING_MARK)
{
- set_glyph (font, glyphs, real_i, p - text, cgglyphs[real_i]);
-
- if (g_unichar_type (wc) == G_UNICODE_NON_SPACING_MARK)
+ if (i > 0)
{
- if (i > 0)
- {
- PangoRectangle logical_rect, ink_rect;
-
- 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[real_i].glyph, &ink_rect, &logical_rect);
- if (logical_rect.width == 0 && ink_rect.x == 0)
- glyphs->glyphs[real_i].geometry.x_offset = (glyphs->glyphs[real_i].geometry.width - ink_rect.width) / 2;
- }
+ PangoRectangle logical_rect, ink_rect;
+
+ glyphs->glyphs[real_i].geometry.width = MAX (glyphs->glyphs[prev_i].geometry.width,
+ glyphs->glyphs[real_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[real_i].glyph, &ink_rect, &logical_rect);
+ if (logical_rect.width == 0 && ink_rect.x == 0)
+ glyphs->glyphs[real_i].geometry.x_offset = (glyphs->glyphs[real_i].geometry.width - ink_rect.width) / 2;
}
}
- else
- {
- set_glyph (font, glyphs, real_i, p - text,
- PANGO_GET_UNKNOWN_GLYPH (wc));
- }
}
-
- p = g_utf8_next_char (p);
+ else
+ set_glyph (font, glyphs, real_i,
+ g_utf8_offset_to_pointer (text, indices[real_i]) - text,
+ PANGO_GET_UNKNOWN_GLYPH (wc));
}
+ free (indices);
CFRelease (line);
CFRelease (attstr);
CFRelease (cstr);