Various improvements

This commit is contained in:
Ilya Laktyushin
2020-02-11 10:34:00 +04:00
parent fd867a92c7
commit f2ca7b00ef
178 changed files with 16610 additions and 4271 deletions

View File

@@ -42,9 +42,15 @@ public enum AnimatedStickerMode {
case direct
}
public enum AnimatedStickerPlaybackPosition {
case start
case end
}
public enum AnimatedStickerPlaybackMode {
case once
case loop
case still(AnimatedStickerPlaybackPosition)
}
private final class AnimatedStickerFrame {
@@ -72,6 +78,7 @@ private protocol AnimatedStickerFrameSource: class {
var frameCount: Int { get }
func takeFrame() -> AnimatedStickerFrame?
func skipToEnd()
}
private final class AnimatedStickerFrameSourceWrapper {
@@ -244,6 +251,9 @@ private final class AnimatedStickerCachedFrameSource: AnimatedStickerFrameSource
self.data = data
self.dataComplete = complete
}
func skipToEnd() {
}
}
private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource {
@@ -289,6 +299,10 @@ private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource
}
return AnimatedStickerFrame(data: frameData, type: .argb, width: self.width, height: self.height, bytesPerRow: self.bytesPerRow, index: frameIndex, isLastFrame: frameIndex == self.frameCount - 1)
}
func skipToEnd() {
self.currentFrame = self.frameCount - 1
}
}
private final class AnimatedStickerFrameQueue {
@@ -383,7 +397,7 @@ public final class AnimatedStickerNode: ASDisplayNode {
private var renderer: (AnimationRenderer & ASDisplayNode)?
private var isPlaying: Bool = false
public var isPlaying: Bool = false
private var canDisplayFirstFrame: Bool = false
private var playbackMode: AnimatedStickerPlaybackMode = .loop
@@ -456,7 +470,9 @@ public final class AnimatedStickerNode: ASDisplayNode {
if let directData = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) {
strongSelf.directData = (directData, path, width, height)
}
if strongSelf.isPlaying {
if case let .still(position) = playbackMode {
strongSelf.seekTo(position)
} else if strongSelf.isPlaying {
strongSelf.play()
} else if strongSelf.canDisplayFirstFrame {
strongSelf.play(firstFrame: true)
@@ -597,11 +613,11 @@ public final class AnimatedStickerNode: ASDisplayNode {
self.reportedStarted = false
self.timer.swap(nil)?.invalidate()
if self.playToCompletionOnStop {
self.seekToStart()
self.seekTo(.start)
}
}
public func seekToStart() {
public func seekTo(_ position: AnimatedStickerPlaybackPosition) {
self.isPlaying = false
let directData = self.directData
@@ -612,6 +628,9 @@ public final class AnimatedStickerNode: ASDisplayNode {
var maybeFrameSource: AnimatedStickerFrameSource?
if let directData = directData {
maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3)
if position == .end {
maybeFrameSource?.skipToEnd()
}
} else if let (cachedData, cachedDataComplete) = cachedData {
if #available(iOS 9.0, *) {
maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData, complete: cachedDataComplete, notifyUpdated: {})