diff --git a/engine/src/coretextfonts.cpp b/engine/src/coretextfonts.cpp index dbc9cd6c274..79c6599ce47 100644 --- a/engine/src/coretextfonts.cpp +++ b/engine/src/coretextfonts.cpp @@ -461,40 +461,3 @@ uint32_t coretext_get_font_size(void *p_font) { return CTFontGetSize((CTFontRef)p_font); } - -#ifdef _MACOSX -ATSUFontID coretext_font_to_atsufontid(void *p_font) -{ - bool t_success; - t_success = true; - - CTFontRef t_ctfont; - t_ctfont = NULL; - if (t_success) - { - t_ctfont = (CTFontRef)p_font; - t_success = t_ctfont != NULL; - } - - char t_name[256]; - if (t_success) - { - CFStringRef t_cfname; - t_cfname = CTFontCopyPostScriptName(t_ctfont); - t_success = t_cfname != NULL && CFStringGetCString(t_cfname, t_name, 256, kCFStringEncodingMacRoman); - if (t_cfname != NULL) - CFRelease(t_cfname); - } - - ATSUFontID t_font_id; - t_font_id = 0; - if (t_success) - { - uint32_t t_name_length; - t_name_length = MCCStringLength(t_name); - t_success = ATSUFindFontFromName(t_name, t_name_length, kFontPostscriptName, kFontNoPlatform, kFontNoScript, kFontNoLanguage, &t_font_id) == noErr; - } - - return t_font_id; -} -#endif diff --git a/engine/src/fieldh.cpp b/engine/src/fieldh.cpp index 6119831a267..c1aaf902740 100644 --- a/engine/src/fieldh.cpp +++ b/engine/src/fieldh.cpp @@ -1013,15 +1013,17 @@ bool MCField::converttoparagraphs(void *p_context, const MCTextParagraph *p_para const char *t_font_name; t_font_name = p_block -> font_name == NULL ? "" : p_block -> font_name; - -#ifdef _MACOSX + +#if defined _MACOSX + // MW-2011-03-13: [[ Bug ]] Try different variants of font searching to ensure we don't // get strange choices. (e.g. Helvetica -> Helvetica Light Oblique). char t_derived_font_name[256]; if (macmatchfontname(t_font_name, t_derived_font_name)) t_font_name = t_derived_font_name; -#endif +#endif + MCAutoStringRef t_font_name_ref; MCStringCreateWithCString(t_font_name, &t_font_name_ref); t_block -> SetTextFont(ctxt, *t_font_name_ref); diff --git a/engine/src/osxfield.cpp b/engine/src/osxfield.cpp index b7fa8a12814..3522f8a1184 100644 --- a/engine/src/osxfield.cpp +++ b/engine/src/osxfield.cpp @@ -35,45 +35,55 @@ along with LiveCode. If not see . */ #include "text.h" + bool MCField::macmatchfontname(const char *p_font_name, char p_derived_font_name[]) { - ATSUFontID t_font_id; - if (ATSUFindFontFromName(p_font_name, strlen(p_font_name), kFontFullName, kFontNoPlatform, kFontNoScript, kFontNoLanguage, &t_font_id) == noErr || - ATSUFindFontFromName(p_font_name, strlen(p_font_name), kFontUniqueName, kFontNoPlatform, kFontNoScript, kFontNoLanguage, &t_font_id) == noErr || - ATSUFindFontFromName(p_font_name, strlen(p_font_name), kFontFamilyName, kFontNoPlatform, kFontNoScript, kFontNoLanguage, &t_font_id) == noErr || - ATSUFindFontFromName(p_font_name, strlen(p_font_name), kFontNoName, kFontNoPlatform, kFontNoScript, kFontNoLanguage, &t_font_id) == noErr) - { - // Fetch the style name - char t_style_name[64]; - ByteCount t_style_name_length; - t_style_name_length = 0; - ATSUFindFontName(t_font_id, kFontStyleName, kFontMacintoshPlatform, kFontNoScript, kFontNoLanguage, 63, t_style_name, &t_style_name_length, NULL); - t_style_name[t_style_name_length] = '\0'; - - // Fetch the full name - char t_full_name[256]; - ByteCount t_full_name_length; - t_full_name_length = 0; - ATSUFindFontName(t_font_id, kFontFullName, kFontMacintoshPlatform, kFontNoScript, kFontNoLanguage, 255, t_full_name, &t_full_name_length, NULL); - t_full_name[t_full_name_length] = '\0'; - - // MW-2011-09-02: Make sure we don't do anything at all if style is regular - // (output name should be fullname!) - if (MCCStringEqualCaseless(t_style_name, "Regular")) - p_font_name = p_font_name; // Do nothing - else if (MCCStringEndsWithCaseless(t_full_name, "Bold Italic")) - t_full_name[t_full_name_length - 12] = '\0'; - else if (MCCStringEndsWithCaseless(t_full_name, "Bold")) - t_full_name[t_full_name_length - 5] = '\0'; - else if (MCCStringEndsWithCaseless(t_full_name, "Italic")) - t_full_name[t_full_name_length - 7] = '\0'; - - strcpy(p_derived_font_name, t_full_name); - - return true; - } - - return false; + // Create a CTFont using the given name. It performs fall-back processing of + // the name (which we had to previously do by hand for ATSUI): it checks for + // a font with that exact name, then family name, etc. + // + // The size and transform matrix here are arbitrary. We just want to know + // that the font exists. + // + CTFontRef t_font_ref = nil; + CFStringRef t_font_name = CFStringCreateWithCString(kCFAllocatorDefault, p_font_name, kCFStringEncodingMacRoman); + if (t_font_name != nil) + { + t_font_ref = CTFontCreateWithName(t_font_name, 12, &CGAffineTransformIdentity); + CFRelease(t_font_name); + } + + // Get the proper name for the font as well as its style name + CFStringRef t_font_full_name = nil; + if (t_font_ref != nil) + { + t_font_full_name = CTFontCopyFullName(t_font_ref); + CFRelease(t_font_ref); + } + + // Check for various stylistic variants at the end of the font name + CFStringRef t_real_font_name = nil; + if (t_font_full_name != nil) + { + CFIndex t_length = CFStringGetLength(t_font_full_name); + if (CFStringHasSuffix(t_font_full_name, CFSTR("Bold Italic"))) + t_real_font_name = CFStringCreateWithSubstring(kCFAllocatorDefault, t_font_full_name, CFRangeMake(0, t_length-12)); + else if (CFStringHasSuffix(t_font_full_name, CFSTR("Bold"))) + t_real_font_name = CFStringCreateWithSubstring(kCFAllocatorDefault, t_font_full_name, CFRangeMake(0, t_length-5)); + else if (CFStringHasSuffix(t_font_full_name, CFSTR("Italic"))) + t_real_font_name = CFStringCreateWithSubstring(kCFAllocatorDefault, t_font_full_name, CFRangeMake(0, t_length-7)); + else + t_real_font_name = (CFStringRef)CFRetain(t_font_full_name); + CFRelease(t_font_full_name); + } + + if (t_real_font_name != nil) + { + bool t_success; + t_success = CFStringGetCString(t_real_font_name, p_derived_font_name, 256, kCFStringEncodingMacRoman); + CFRelease(t_real_font_name); + return t_success; + } + + return false; } - -