Skip to content

Commit 7a2e13e

Browse files
authored
Cache image list markers (#303)
1 parent ce9c876 commit 7a2e13e

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

Diff for: Proton/Sources/Swift/Core/LayoutManager.swift

+19-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class LayoutManager: NSLayoutManager {
4343

4444
private let defaultBulletColor = UIColor.black
4545
private var counters = [Int: Int]()
46+
private var imagecache = [UIImage: NSCache<NSString, UIImage>]()
4647

4748
weak var layoutManagerDelegate: LayoutManagerDelegate?
4849

@@ -226,7 +227,7 @@ class LayoutManager: NSLayoutManager {
226227
listMarkerImage = self.generateBitmap(string: text, rect: markerRect)
227228
case let .image(image, size):
228229
markerRect = rectForBullet(markerSize: size, rect: rect, indent: paraStyle.firstLineHeadIndent, yOffset: paraStyle.paragraphSpacingBefore)
229-
listMarkerImage = image.resizeImage(to: markerRect.size)
230+
listMarkerImage = resizedImage(image: image, size: markerRect.size)
230231
}
231232

232233
// let lineSpacing = paraStyle.lineSpacing
@@ -243,6 +244,22 @@ class LayoutManager: NSLayoutManager {
243244
return image
244245
}
245246

247+
private func resizedImage(image: UIImage, size: CGSize) -> UIImage {
248+
let result: UIImage
249+
250+
let sizeCache = imagecache[image, default: .init()]
251+
imagecache.updateValue(sizeCache, forKey: image)
252+
253+
let key = size.debugDescription as NSString
254+
if let cachedImage = sizeCache.object(forKey: key) {
255+
result = cachedImage
256+
} else {
257+
result = image.resizeImage(to: size)
258+
sizeCache.setObject(result, forKey: key)
259+
}
260+
return result
261+
}
262+
246263
private func rectForBullet(markerSize: CGSize, rect: CGRect, indent: CGFloat, yOffset: CGFloat) -> CGRect {
247264
let topInset = layoutManagerDelegate?.textContainerInset.top ?? 0
248265
let leftInset = layoutManagerDelegate?.textContainerInset.left ?? 0
@@ -410,7 +427,7 @@ class LayoutManager: NSLayoutManager {
410427
let attributes = lineNumberAttributes(lineNumberFormatting: lineNumberFormatting)
411428
let text = NSAttributedString(string: "\(lineNumber)", attributes: attributes)
412429
let markerSize = text.boundingRect(with: .zero, options: [], context: nil).integral.size
413-
var markerRect = self.rectForLineNumbers(markerSize: markerSize, rect: rect, width: gutterWidth)
430+
let markerRect = self.rectForLineNumbers(markerSize: markerSize, rect: rect, width: gutterWidth)
414431
let listMarkerImage = self.generateBitmap(string: text, rect: markerRect)
415432
listMarkerImage.draw(at: markerRect.origin)
416433
}

0 commit comments

Comments
 (0)