From 68e43131b7fbf6cabfba540ed15798df378d9997 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 21 Jul 2024 19:45:03 -0700 Subject: [PATCH] Minor optimization for caching platform fonts --- .../HTMLStreamer/AttributedStringConverter.swift | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Sources/HTMLStreamer/AttributedStringConverter.swift b/Sources/HTMLStreamer/AttributedStringConverter.swift index f58da8d..ee9221d 100644 --- a/Sources/HTMLStreamer/AttributedStringConverter.swift +++ b/Sources/HTMLStreamer/AttributedStringConverter.swift @@ -19,7 +19,8 @@ private typealias PlatformFont = NSFont public class AttributedStringConverter { private let configuration: AttributedStringConverterConfiguration - private var fontCache: [FontTrait: PlatformFont] = [:] + // There are only 8 combinations of FontTraits + private var fontCache: [PlatformFont?] = Array(repeating: nil, count: 8) private var tokenizer: Tokenizer! private var str: NSMutableAttributedString! @@ -340,7 +341,7 @@ public class AttributedStringConverter { } private func getFont(traits: FontTrait) -> PlatformFont? { - if let cached = fontCache[traits] { + if let cached = fontCache[traits.rawValue] { return cached } @@ -355,14 +356,18 @@ public class AttributedStringConverter { } else if traits.contains(.italic), let italic = descriptor.withSymbolicTraits(.traitItalic) { descriptor = italic + } else { + // N.B.: this does not go through the UIFontMetrics, the configuration fonts are expected to be setup for Dynamic Type already + fontCache[traits.rawValue] = baseFont + return baseFont } let font = PlatformFont(descriptor: descriptor, size: 0) #if os(iOS) || os(visionOS) let scaled = configuration.fontMetrics.scaledFont(for: font) - fontCache[traits] = scaled + fontCache[traits.rawValue] = scaled return scaled #else - fontCache[traits] = font + fontCache[traits.rawValue] = font return font #endif }