17

Prior to OSX 10.6, ATSFontActivateFromFileSpecification/ATSFontActivateFromFileReference were available and could be used to load a font from a file. I can't find anything similar in Core Text.

miekelly
  • 281
  • 2
  • 7

4 Answers4

20

You can get a CTFontRef from a font file by going via a CGFontRef:

CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/path/to/font"), kCFURLPOSIXPathStyle, false);
CGDataProviderRef dataProvider = CGDataProviderCreateWithURL(url);
CGFontRef theCGFont = CGFontCreateWithDataProvider(dataProvider);
CTFontRef theCTFont = CTFontCreateWithGraphicsFont(theCGFont);
CFRelease(theCGFont);
CFRelease(dataProvider);
CFRelease(url);

// do something with the CTFontRef here

CFRelease(theCTFont);   
JOM
  • 8,139
  • 6
  • 78
  • 111
Rob Keniger
  • 45,830
  • 6
  • 101
  • 134
11

It looks like CTFontManagerCreateFontDescriptorsFromURL is the Core Text replacement.

eonil
  • 83,476
  • 81
  • 317
  • 516
miekelly
  • 281
  • 2
  • 7
6

Here's an updated version of how to do this in 2020. Much simpler now. Used 12 as arbitrary type size.

let fontURL = URL(fileURLWithPath: "path/to/font.otf")
let fd = CTFontManagerCreateFontDescriptorsFromURL(fontURL as CFURL) as! [CTFontDescriptor]
let theCTFont = CTFontCreateWithFontDescriptor(fd[0], 12.0, nil)
awfulcode
  • 597
  • 5
  • 12
5
NSURL *fontURL = [[NSBundle mainBundle] URLForResource:@"Crystal" withExtension:@"ttf"];
    assert(fontURL);
    CFErrorRef error = NULL;
    if (!CTFontManagerRegisterFontsForURL((__bridge CFURLRef)fontURL, kCTFontManagerScopeProcess, &error))
    {
        CFShow(error);
        abort();
    }
Muruganandham K
  • 5,271
  • 5
  • 34
  • 62