Skip to content
This repository has been archived by the owner on Aug 31, 2021. It is now read-only.

Commit

Permalink
Merge pull request #3167 from livecodefraser/mac64-field
Browse files Browse the repository at this point in the history
Don't use ATSUI fontname mapping in 64-bit mode
  • Loading branch information
livecodefraser committed Dec 3, 2015
2 parents 711947d + 1ed8eb7 commit 679756f
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 79 deletions.
37 changes: 0 additions & 37 deletions engine/src/coretextfonts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 5 additions & 3 deletions engine/src/fieldh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
88 changes: 49 additions & 39 deletions engine/src/osxfield.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,45 +35,55 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */

#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;
}


0 comments on commit 679756f

Please sign in to comment.