Discard reconfigured CTFont if URL changes

Fixes https://github.com/behdad/harfbuzz/issues/267
This commit is contained in:
Dominik Röttsches 2016-06-16 14:19:39 +02:00
parent 4b8de1ea80
commit a0223274b9
1 changed files with 21 additions and 3 deletions

View File

@ -145,6 +145,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed"); DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
return NULL; return NULL;
} }
CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute);
/* Create font copy with cascade list that has LastResort first; this speeds up CoreText /* Create font copy with cascade list that has LastResort first; this speeds up CoreText
* font fallback which we don't need anyway. */ * font fallback which we don't need anyway. */
@ -154,14 +155,31 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
CFRelease (last_resort_font_desc); CFRelease (last_resort_font_desc);
if (new_ct_font) if (new_ct_font)
{ {
CFRelease (ct_font); // The CTFontCreateCopyWithAttributes call fails to stay on the same font
ct_font = new_ct_font; // when reconfiguring the cascade list and may switch to a different font
// when there are fonts that go by the same name, since the descriptor is
// just name and size.
// Avoid reconfiguring the cascade lists if the new font is outside the
// system locations that we cannot access from the sandboxed renderer
// process in Blink. This can be detected by the new file URL location
// that the newly found font points to.
CFURLRef new_url = (CFURLRef)CTFontCopyAttribute(new_ct_font, kCTFontURLAttribute);
if (CFEqual(original_url, new_url)) {
CFRelease (ct_font);
ct_font = new_ct_font;
} else {
CFRelease(new_ct_font);
DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
}
CFRelease(new_url);
} }
else else
DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed"); DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed");
} }
return ct_font; CFRelease(original_url);
return ct_font;
} }
struct hb_coretext_shaper_face_data_t { struct hb_coretext_shaper_face_data_t {