summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/xetexdir/XeTeX_mac.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/xetexdir/XeTeX_mac.c')
-rw-r--r--Build/source/texk/web2c/xetexdir/XeTeX_mac.c70
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];
}