From d0b4ba6f7ee9dd91b3f3e031e765b2b7e4f62b0a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 29 May 2020 13:51:58 +0300 Subject: [PATCH] Video editor fixes --- .../Sources/LegacyPaintStickerView.swift | 9 +++- .../Sources/LegacyPaintStickersContext.swift | 52 +++++++++---------- .../Sources/DrawingStickersScreen.swift | 17 ++++-- 3 files changed, 47 insertions(+), 31 deletions(-) diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickerView.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickerView.swift index c840fae75a..c6c9d72dac 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickerView.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickerView.swift @@ -21,6 +21,8 @@ class LegacyPaintStickerView: UIView, TGPhotoPaintStickerRenderView { private var didSetUpAnimationNode = false private let stickerFetchedDisposable = MetaDisposable() + private let cachedDisposable = MetaDisposable() + init(context: AccountContext, file: TelegramMediaFile) { self.context = context self.file = file @@ -40,6 +42,7 @@ class LegacyPaintStickerView: UIView, TGPhotoPaintStickerRenderView { deinit { self.stickerFetchedDisposable.dispose() + self.cachedDisposable.dispose() } func image() -> UIImage! { @@ -103,7 +106,11 @@ class LegacyPaintStickerView: UIView, TGPhotoPaintStickerRenderView { self.didSetUpAnimationNode = true let dimensions = self.file.dimensions ?? PixelDimensions(width: 512, height: 512) let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 384.0, height: 384.0)) - self.animationNode?.setup(source: AnimatedStickerResourceSource(account: self.context.account, resource: self.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + let source = AnimatedStickerResourceSource(account: self.context.account, resource: self.file.resource) + self.animationNode?.setup(source: source, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + + self.cachedDisposable.set((source.cachedDataPath(width: 384, height: 384) + |> deliverOn(Queue.concurrentDefaultQueue())).start()) } } } diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift index 4a5417bdf0..81cc38e395 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift @@ -20,6 +20,30 @@ protocol LegacyPaintEntity { func image(for time: CMTime, fps: Int, completion: @escaping (CIImage?) -> Void) } +private func render(width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType) -> CIImage? { + let calculatedBytesPerRow = (4 * Int(width) + 15) & (~15) + assert(bytesPerRow == calculatedBytesPerRow) + + let image = generateImagePixel(CGSize(width: CGFloat(width), height: CGFloat(height)), scale: 1.0, pixelGenerator: { _, pixelData, bytesPerRow in + switch type { + case .yuva: + data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in + decodeYUVAToRGBA(bytes, pixelData, Int32(width), Int32(height), Int32(bytesPerRow)) + } + case .argb: + data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in + memcpy(pixelData, bytes, data.count) + } + } + }) + + if let image = image { + return CIImage(image: image) + } else { + return nil + } +} + private class LegacyPaintStickerEntity: LegacyPaintEntity { var position: CGPoint { return self.entity.position @@ -71,7 +95,7 @@ private class LegacyPaintStickerEntity: LegacyPaintEntity { self.source = AnimatedStickerResourceSource(account: account, resource: file.resource) if let source = self.source { let dimensions = self.file.dimensions ?? PixelDimensions(width: 512, height: 512) - let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 512.0, height: 512.0)) + let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 384, height: 384)) self.disposables.add((source.cachedDataPath(width: Int(fittedDimensions.width), height: Int(fittedDimensions.height)) |> deliverOn(self.queue)).start(next: { [weak self] path, complete in if let strongSelf = self, complete { @@ -118,31 +142,7 @@ private class LegacyPaintStickerEntity: LegacyPaintEntity { var duration: Signal { return self.durationPromise.get() } - - private func render(width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType) -> CIImage? { - let calculatedBytesPerRow = (4 * Int(width) + 15) & (~15) - assert(bytesPerRow == calculatedBytesPerRow) - let image = generateImagePixel(CGSize(width: CGFloat(width), height: CGFloat(height)), scale: 1.0, pixelGenerator: { _, pixelData, bytesPerRow in - switch type { - case .yuva: - data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in - decodeYUVAToRGBA(bytes, pixelData, Int32(width), Int32(height), Int32(bytesPerRow)) - } - case .argb: - data.withUnsafeBytes { (bytes: UnsafePointer) -> Void in - memcpy(pixelData, bytes, data.count) - } - } - }) - - if let image = image { - return CIImage(image: image) - } else { - return nil - } - } - var currentFrameIndex: Int? var cachedCIImage: CIImage? @@ -194,7 +194,7 @@ private class LegacyPaintStickerEntity: LegacyPaintEntity { return frame } if let maybeFrame = maybeFrame, let frame = maybeFrame { - let image = strongSelf.render(width: frame.width, height: frame.height, bytesPerRow: frame.bytesPerRow, data: frame.data, type: frame.type) + let image = render(width: frame.width, height: frame.height, bytesPerRow: frame.bytesPerRow, data: frame.data, type: frame.type) completion(image) strongSelf.cachedCIImage = image } else { diff --git a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift index 9d5bc37775..5d08105c80 100644 --- a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift +++ b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift @@ -61,6 +61,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { private let stickerListView: ListView private let maskListView: ListView + private var hiddenListView: ListView? private var searchContainerNode: PaneSearchContainerNode? private let searchContainerNodeLoadedDisposable = MetaDisposable() @@ -293,8 +294,8 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { } } } - }, openPeerSpecificSettings: { [weak self] in - }, dismissPeerSpecificSettings: { [weak self] in + }, openPeerSpecificSettings: { + }, dismissPeerSpecificSettings: { }, clearRecentlyUsedStickers: { [weak self] in if let strongSelf = self { let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: strongSelf.presentationData.theme, fontSize: strongSelf.presentationData.listsFontSize)) @@ -410,8 +411,8 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { } } } - }, openPeerSpecificSettings: { [weak self] in - }, dismissPeerSpecificSettings: { [weak self] in + }, openPeerSpecificSettings: { + }, dismissPeerSpecificSettings: { }, clearRecentlyUsedStickers: { [weak self] in if let strongSelf = self { let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: strongSelf.presentationData.theme, fontSize: strongSelf.presentationData.listsFontSize)) @@ -1274,6 +1275,11 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { if let hiddenPane = self.hiddenPane { self.insertSubnode(hiddenPane, belowSubnode: self.collectionListContainer) + self.hiddenPane = nil + } + if let hiddenListView = self.hiddenListView { + self.collectionListContainer.addSubnode(hiddenListView) + self.hiddenListView = nil } self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring, completion: { [weak self] _ in @@ -1291,10 +1297,13 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { if let strongSelf = self { if strongSelf.stickerPane.supernode != nil { strongSelf.hiddenPane = strongSelf.stickerPane + strongSelf.hiddenListView = strongSelf.stickerListView } else if strongSelf.maskPane.supernode != nil { strongSelf.hiddenPane = strongSelf.maskPane + strongSelf.hiddenListView = strongSelf.maskListView } strongSelf.hiddenPane?.removeFromSupernode() + strongSelf.hiddenListView?.removeFromSupernode() strongSelf.isHidden = true } })