diff options
Diffstat (limited to 'Build/source/texk/web2c/xetexdir/XeTeX_mac.c')
-rw-r--r-- | Build/source/texk/web2c/xetexdir/XeTeX_mac.c | 70 |
1 files changed, 66 insertions, 4 deletions
diff --git a/Build/source/texk/web2c/xetexdir/XeTeX_mac.c b/Build/source/texk/web2c/xetexdir/XeTeX_mac.c index 2bedefe6bc7..30a891b83f1 100644 --- a/Build/source/texk/web2c/xetexdir/XeTeX_mac.c +++ b/Build/source/texk/web2c/xetexdir/XeTeX_mac.c @@ -471,18 +471,46 @@ int MapGlyphToIndex_AAT(ATSUStyle style, const char* glyphName) ByteCount length; OSStatus status = ATSFontGetTable(fontRef, kPost, 0, 0, 0, &length); if (status != noErr) - return 0; + goto ats_failed; void* table = xmalloc(length); status = ATSFontGetTable(fontRef, kPost, 0, length, table, &length); if (status != noErr) { free(table); - return 0; + goto ats_failed; } int rval = findGlyphInPostTable(table, length, glyphName); free(table); + if (rval) + return rval; + +ats_failed: + return GetGlyphIDFromCGFont(fontRef, glyphName); +} + +int GetGlyphIDFromCGFont(ATSFontRef atsFontRef, const char* glyphName) +{ + if (&CGFontGetGlyphWithGlyphName == NULL) + return 0; + + int rval = 0; + CFStringRef psname; + OSStatus status = ATSFontGetPostScriptName(atsFontRef, 0, &psname); + if ((status == noErr) && psname) { + CGFontRef cgfont = CGFontCreateWithFontName(psname); + CFRelease(psname); + if (cgfont) { + CFStringRef glyphname = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + glyphName, + kCFStringEncodingUTF8, + kCFAllocatorNull); + rval = CGFontGetGlyphWithGlyphName(cgfont, glyphname); + CFRelease(glyphname); + CGFontRelease(cgfont); + } + } return rval; } @@ -500,15 +528,16 @@ GetGlyphName_AAT(ATSUStyle style, UInt16 gid, int* len) ByteCount length; OSStatus status = ATSFontGetTable(fontRef, kPost, 0, 0, 0, &length); if (status != noErr) - return 0; + goto ats_failed; void* table = xmalloc(length); status = ATSFontGetTable(fontRef, kPost, 0, length, table, &length); if (status != noErr) { free(table); - return 0; + goto ats_failed; } + buffer[0] = 0; namePtr = getGlyphNamePtr(table, length, gid, len); if (*len > 255) *len = 255; @@ -519,6 +548,39 @@ GetGlyphName_AAT(ATSUStyle style, UInt16 gid, int* len) free(table); + if (buffer[0]) + return &buffer[0]; + +ats_failed: + return GetGlyphNameFromCGFont(fontRef, gid, len); +} + +char* +GetGlyphNameFromCGFont(ATSFontRef atsFontRef, UInt16 gid, int* len) +{ + *len = 0; + static char buffer[256]; + buffer[0] = 0; + + if (&CGFontCopyGlyphNameForGlyph == NULL) + return &buffer[0]; + + CFStringRef psname; + OSStatus status = ATSFontGetPostScriptName(atsFontRef, 0, &psname); + if ((status == noErr) && psname) { + CGFontRef cgfont = CGFontCreateWithFontName(psname); + CFRelease(psname); + if (cgfont && gid < CGFontGetNumberOfGlyphs(cgfont)) { + CFStringRef glyphname = CGFontCopyGlyphNameForGlyph(cgfont, gid); + if (glyphname) { + if (CFStringGetCString(glyphname, buffer, 256, kCFStringEncodingUTF8)) { + *len = strlen(buffer); + } + CFRelease(glyphname); + } + CGFontRelease(cgfont); + } + } return &buffer[0]; } |