Files
byre/mac/Sources/Byre/Fonts.swift
T

40 lines
1.6 KiB
Swift
Raw Normal View History

import CoreText
import Synchronization
import SwiftUI
enum Fonts {
private static func file(_ subset: String, _ italic: Bool, _ weight: CGFloat) -> CTFontDescriptor {
2026-10-18 00:31:46 -07:00
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)
}
2026-10-18 00:31:46 -07:00
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]>([:])
2026-10-16 23:30:57 -07:00
private static func cached(_ size: CGFloat, _ weight: CGFloat, _ italic: Bool) -> CTFont {
2026-10-16 23:30:57 -07:00
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
2026-10-16 23:30:57 -07:00
return f
}
}
2026-10-17 09:15:50 -07:00
static func font(_ size: CGFloat, weight: CGFloat = 400, italic: Bool = false) -> Font {
Font(cached(size, weight, italic))
2026-10-17 09:15:50 -07:00
}
static func ns(_ size: CGFloat, weight: CGFloat = 400, italic: Bool = false) -> NSFont {
cached(size, weight, italic) as NSFont
2026-10-17 09:15:50 -07:00
}
}