mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
Various improvements
This commit is contained in:
@@ -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: {})
|
||||
|
||||
Reference in New Issue
Block a user