src/hb-coretext.cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
New commits: commit c29993a181c2139eaec97b5f6225824040ca3ac9 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Jan 28 17:29:42 2014 -0500 [coretext] Handle surrogate pairs when generating notdef glyphs Fixes github.com/behdad/harfbuzz/pull/19 diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index f247c08..87dd779 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -591,7 +591,6 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, CFMutableAttributedStringRef attr_string = CFAttributedStringCreateMutable (NULL, chars_len); CFAttributedStringReplaceString (attr_string, CFRangeMake (0, 0), string_ref); - CFRelease (string_ref); CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), kCTFontAttributeName, font_data->ct_font); @@ -671,23 +670,33 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, if (buffer->in_error) FAIL ("Buffer resize failed"); hb_glyph_info_t *info = buffer->info + buffer->len; - buffer->len += range.length; CGGlyph notdef = 0; double advance = CTFontGetAdvancesForGlyphs (font_data->ct_font, kCTFontHorizontalOrientation, ¬def, NULL, 1); - for (CFIndex j = 0; j < range.length; j++) + for (CFIndex j = range.location; j < range.location + range.length; j++) { + UniChar ch = CFStringGetCharacterAtIndex (string_ref, j); + if (hb_in_range<UniChar> (ch, 0xDC00, 0xDFFF) && range.location < j) + { + ch = CFStringGetCharacterAtIndex (string_ref, j - 1); + if (hb_in_range<UniChar> (ch, 0xD800, 0xDBFF)) + /* This is the second of a surrogate pair. Don't need .notdef + * for this one. */ + continue; + } + info->codepoint = notdef; /* TODO We have to fixup clusters later. See vis_clusters in * hb-uniscribe.cc for example. */ - info->cluster = range.location + j; + info->cluster = j; info->mask = advance; info->var1.u32 = 0; info->var2.u32 = 0; info++; + buffer->len++; } continue; } @@ -796,6 +805,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } } + CFRelease (string_ref); CFRelease (line); return true; commit 748b2782e4898420003a3bbc041dcccbe9e3edc2 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Jan 28 17:10:05 2014 -0500 [coretext] Minor optimization diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 25e4055..f247c08 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -673,11 +673,11 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, hb_glyph_info_t *info = buffer->info + buffer->len; buffer->len += range.length; + CGGlyph notdef = 0; + double advance = CTFontGetAdvancesForGlyphs (font_data->ct_font, kCTFontHorizontalOrientation, ¬def, NULL, 1); + for (CFIndex j = 0; j < range.length; j++) { - CGGlyph notdef = 0; - double advance = CTFontGetAdvancesForGlyphs (font_data->ct_font, kCTFontHorizontalOrientation, ¬def, NULL, 1); - info->codepoint = notdef; /* TODO We have to fixup clusters later. See vis_clusters in * hb-uniscribe.cc for example. */ _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz