Don't reuse drawing context

This commit is contained in:
Ali 2021-06-17 00:05:40 +04:00
parent 2ad4228493
commit 9761eb5a57
2 changed files with 12 additions and 12 deletions

View File

@ -422,6 +422,9 @@ public class DrawingContext {
public let length: Int
private let imageBuffer: ASCGImageBuffer
public var bytes: UnsafeMutableRawPointer {
if self.hasGeneratedImage {
preconditionFailure()
}
return self.imageBuffer.mutableBytes
}
private let context: CGContext
@ -491,9 +494,7 @@ public class DrawingContext {
return nil
}
if self.hasGeneratedImage {
#if DEBUG
assert(false)
#endif
preconditionFailure()
return nil
}
self.hasGeneratedImage = true

View File

@ -12,6 +12,8 @@ import SwiftSignalKit
public final class ManagedAnimationState {
public let item: ManagedAnimationItem
private let instance: LottieInstance
private let displaySize: CGSize
let frameCount: Int
let fps: Double
@ -21,15 +23,11 @@ public final class ManagedAnimationState {
public var executedCallbacks = Set<Int>()
private let renderContext: DrawingContext
public init?(displaySize: CGSize, item: ManagedAnimationItem, current: ManagedAnimationState?) {
let resolvedInstance: LottieInstance
let renderContext: DrawingContext
if let current = current {
resolvedInstance = current.instance
renderContext = current.renderContext
} else {
guard let path = item.source.path else {
return nil
@ -44,20 +42,21 @@ public final class ManagedAnimationState {
return nil
}
resolvedInstance = instance
renderContext = DrawingContext(size: displaySize, scale: UIScreenScale, clear: true)
}
self.displaySize = displaySize
self.item = item
self.instance = resolvedInstance
self.renderContext = renderContext
self.frameCount = Int(self.instance.frameCount)
self.fps = Double(self.instance.frameRate)
}
func draw() -> UIImage? {
self.instance.renderFrame(with: Int32(self.frameIndex ?? 0), into: self.renderContext.bytes.assumingMemoryBound(to: UInt8.self), width: Int32(self.renderContext.size.width * self.renderContext.scale), height: Int32(self.renderContext.size.height * self.renderContext.scale), bytesPerRow: Int32(self.renderContext.bytesPerRow))
return self.renderContext.generateImage()
let renderContext = DrawingContext(size: self.displaySize, scale: UIScreenScale, clear: true)
self.instance.renderFrame(with: Int32(self.frameIndex ?? 0), into: renderContext.bytes.assumingMemoryBound(to: UInt8.self), width: Int32(renderContext.size.width * renderContext.scale), height: Int32(renderContext.size.height * renderContext.scale), bytesPerRow: Int32(renderContext.bytesPerRow))
return renderContext.generateImage()
}
}