Commit d22634e5 authored by YAMAMOTO Mitsuharu's avatar YAMAMOTO Mitsuharu

Work around crash when displaying etc/HELLO on OS X 10.11

* src/macfont.m (mac_font_get_weight)
(mac_font_descriptor_get_adjusted_weight): New functions.
(macfont_store_descriptor_attributes): Adjust weight.
parent 1c6a5870
......@@ -190,6 +190,14 @@ static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char,
return string;
}
static CFIndex
mac_font_get_weight (CTFontRef font)
{
NSFont *nsFont = (NSFont *) font;
return [[NSFontManager sharedFontManager] weightOfFont:nsFont];
}
static CGFloat
mac_screen_font_get_advance_width_for_glyph (ScreenFontRef font, CGGlyph glyph)
{
......@@ -758,6 +766,46 @@ static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char,
return false;
}
static CGFloat
mac_font_descriptor_get_adjusted_weight (CTFontDescriptorRef desc, CGFloat val)
{
long percent_val = lround (val * 100);
if (percent_val == -40 || percent_val == 56)
{
CTFontRef font = NULL;
CFStringRef name =
CTFontDescriptorCopyAttribute (desc, kCTFontNameAttribute);
if (name)
{
font = CTFontCreateWithName (name, 0, NULL);
CFRelease (name);
}
if (font)
{
CFIndex weight = mac_font_get_weight (font);
if (percent_val == -40)
{
/* Workaround for crash when displaying Oriya characters
with Arial Unicode MS on OS X 10.11. */
if (weight == 5)
val = 0;
}
else /* percent_val == 56 */
{
if (weight == 9)
/* Adjustment for HiraginoSans-W7 on OS X 10.11. */
val = 0.4;
}
CFRelease (font);
}
}
return val;
}
static void
macfont_store_descriptor_attributes (CTFontDescriptorRef desc,
Lisp_Object spec_or_entity)
......@@ -781,6 +829,7 @@ static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char,
enum font_property_index index;
CFStringRef trait;
CGPoint points[6];
CGFloat (*adjust_func) (CTFontDescriptorRef, CGFloat);
} numeric_traits[] =
{{FONT_WEIGHT_INDEX, kCTFontWeightTrait,
{{-0.4, 50}, /* light */
......@@ -788,11 +837,12 @@ static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char,
{0, 100}, /* normal */
{0.24, 140}, /* (semi-bold + normal) / 2 */
{0.4, 200}, /* bold */
{CGFLOAT_MAX, CGFLOAT_MAX}}},
{CGFLOAT_MAX, CGFLOAT_MAX}},
mac_font_descriptor_get_adjusted_weight},
{FONT_SLANT_INDEX, kCTFontSlantTrait,
{{0, 100}, {0.1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}},
{{0, 100}, {0.1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}, NULL},
{FONT_WIDTH_INDEX, kCTFontWidthTrait,
{{0, 100}, {1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}}};
{{0, 100}, {1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}, NULL}};
int i;
for (i = 0; i < ARRAYELTS (numeric_traits); i++)
......@@ -802,6 +852,8 @@ static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char,
{
CGPoint *point = numeric_traits[i].points;
if (numeric_traits[i].adjust_func)
floatval = (*numeric_traits[i].adjust_func) (desc, floatval);
while (point->x < floatval)
point++;
if (point == numeric_traits[i].points)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment