import CoreText import Synchronization import SwiftUI enum Fonts { private static func file(_ subset: String, _ italic: Bool, _ weight: CGFloat) -> CTFontDescriptor { let url = Bundle.main.resourceURL!.appending(path: "fonts/atkinson-hyperlegible-mono-\(subset)-wght-\(italic ? "italic" : "normal").woff2") let d = (CTFontManagerCreateFontDescriptorsFromURL(url as CFURL) as! [CTFontDescriptor])[0] return CTFontDescriptorCreateCopyWithVariation(d, 0x7767_6874 as CFNumber, weight) } private static func ct(_ size: CGFloat, weight: CGFloat = 400, italic: Bool = false) -> CTFont { let ext = file("latin-ext", italic, weight) let d = CTFontDescriptorCreateCopyWithAttributes(file("latin", italic, weight), [kCTFontCascadeListAttribute: [ext]] as CFDictionary) return CTFontCreateWithFontDescriptor(d, size, nil) } private static let fonts = Mutex<[String: CTFont]>([:]) private static func cached(_ size: CGFloat, _ weight: CGFloat, _ italic: Bool) -> CTFont { let key = "\(size) \(weight) \(italic)" return fonts.withLock { fonts in if let f = fonts[key] { return f } let f = ct(size, weight: weight, italic: italic) fonts[key] = f return f } } static func font(_ size: CGFloat, weight: CGFloat = 400, italic: Bool = false) -> Font { Font(cached(size, weight, italic)) } static func ns(_ size: CGFloat, weight: CGFloat = 400, italic: Bool = false) -> NSFont { cached(size, weight, italic) as NSFont } }