CoreText does automatic font fallback (AKA "cascading") for characters
not supported by the requested font, and provides no way to turn it off,
so detect if the returned run uses a font other than the requested one
and fill in the buffer with .notdef glyphs instead of random indices
glyph from a different font.
---
src/hb-coretext.cc | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index ba80136..398b866 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -685,6 +685,33 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
#undef ALLOCATE_ARRAY
+ /* CoreText does automatic font fallback (AKA "cascading") for characters
+ * not supported by the requested font, and provides no way to turn it off,
+ * so we detect if the returned run uses a font other than the requested
+ * one and fill in the buffer with .notdef glyphs instead of random glyph
+ * indices from a different font.
+ */
+ CFDictionaryRef attributes = CTRunGetAttributes(run);
+ if (!CFEqual(CFDictionaryGetValue(attributes, kCTFontAttributeName),
font_data->ct_font)) {
+ for (unsigned int j = 0; j < num_glyphs; j++) {
+ CGGlyph notdef = 0;
+ double advance = CTFontGetAdvancesForGlyphs(font_data->ct_font,
kCTFontHorizontalOrientation, ¬def, NULL, 1);
+
+ hb_glyph_info_t *info = &buffer->info[buffer->len];
+
+ info->codepoint = notdef;
+ info->cluster = string_indices[0] + j;
+
+ info->mask = advance;
+ info->var1.u32 = 0;
+ info->var2.u32 = 0;
+
+ buffer->len++;
+ }
+ continue;
+ }
+
double run_width = CTRunGetTypographicBounds (run, range_all, NULL, NULL,
NULL);
for (unsigned int j = 0; j < num_glyphs; j++) {
--
1.8.4.1
_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz