From a15b9a1072749253567fc0cf6f2b46df2ebb4f0b Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 25 Nov 2023 21:34:48 +0400 Subject: [PATCH] Various fixes --- .../MediaEditor/Sources/MediaEditor.swift | 2 +- .../Sources/MediaEditorComposer.swift | 3 +-- .../Sources/MediaEditorVideoExport.swift | 6 ----- .../MediaEditor/Sources/VideoFinishPass.swift | 13 ++++----- .../Sources/StoryChatContent.swift | 27 +++++++++++++++---- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift index 470ebd5559..b1b9579fa5 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift @@ -1504,7 +1504,7 @@ public final class MediaEditor { private func updateRenderChain() { self.renderer.skipEditingPasses = self.previewUnedited self.renderChain.update(values: self.values) - self.renderer.videoFinishPass.update(values: self.values, startOffset: nil, videoDuration: self.mainVideoDuration, additionalVideoDuration: self.additionalVideoDuration) + self.renderer.videoFinishPass.update(values: self.values, videoDuration: self.mainVideoDuration, additionalVideoDuration: self.additionalVideoDuration) if let player = self.player, player.rate > 0.0 && !self.forceRendering { } else { diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorComposer.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorComposer.swift index ab4451296a..73ac5d0cfd 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorComposer.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorComposer.swift @@ -86,7 +86,6 @@ final class MediaEditorComposer { dimensions: CGSize, outputDimensions: CGSize, textScale: CGFloat, - startOffset: Double?, videoDuration: Double?, additionalVideoDuration: Double? ) { @@ -123,7 +122,7 @@ final class MediaEditorComposer { self.renderer.setupForComposer(composer: self) self.renderChain.update(values: self.values) - self.renderer.videoFinishPass.update(values: self.values, startOffset: startOffset, videoDuration: videoDuration, additionalVideoDuration: additionalVideoDuration) + self.renderer.videoFinishPass.update(values: self.values, videoDuration: videoDuration, additionalVideoDuration: additionalVideoDuration) } var previousAdditionalInput: Input? diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorVideoExport.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorVideoExport.swift index e87898076d..deb0112cc6 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorVideoExport.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditorVideoExport.swift @@ -463,22 +463,16 @@ public final class MediaEditorVideoExport { } var duration = self.durationValue?.seconds - var startOffset: Double? if case .image = self.subject { duration = nil } - if let trimRange = self.configuration.timeRange?.start { - startOffset = trimRange.seconds - } - self.composer = MediaEditorComposer( postbox: self.postbox, values: self.configuration.values, dimensions: self.configuration.composerDimensions, outputDimensions: self.configuration.dimensions, textScale: self.textScale, - startOffset: startOffset, videoDuration: duration, additionalVideoDuration: self.additionalVideoDuration ) diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/VideoFinishPass.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/VideoFinishPass.swift index c5396144b5..1c83237ba9 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/VideoFinishPass.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/VideoFinishPass.swift @@ -235,12 +235,13 @@ final class VideoFinishPass: RenderPass { private let canvasSize = CGSize(width: 1080.0, height: 1920.0) private var gradientColors = GradientColors(topColor: simd_float3(0.0, 0.0, 0.0), bottomColor: simd_float3(0.0, 0.0, 0.0)) - func update(values: MediaEditorValues, startOffset: Double?, videoDuration: Double?, additionalVideoDuration: Double?) { + func update(values: MediaEditorValues, videoDuration: Double?, additionalVideoDuration: Double?) { let position = CGPoint( x: canvasSize.width / 2.0 + values.cropOffset.x, y: canvasSize.height / 2.0 + values.cropOffset.y ) + self.isStory = values.isStory self.mainPosition = VideoFinishPass.VideoPosition(position: position, size: self.mainPosition.size, scale: values.cropScale, rotation: values.cropRotation, baseScale: self.mainPosition.baseScale) if let position = values.additionalVideoPosition, let scale = values.additionalVideoScale, let rotation = values.additionalVideoRotation { @@ -249,7 +250,6 @@ final class VideoFinishPass: RenderPass { if !values.additionalVideoPositionChanges.isEmpty { self.videoPositionChanges = values.additionalVideoPositionChanges } - self.videoStartOffset = startOffset self.videoDuration = videoDuration self.additionalVideoDuration = additionalVideoDuration if let videoTrimRange = values.videoTrimRange { @@ -289,8 +289,8 @@ final class VideoFinishPass: RenderPass { baseScale: 1.0 ) + private var isStory = true private var videoPositionChanges: [VideoPositionChange] = [] - private var videoStartOffset: Double? private var videoDuration: Double? private var additionalVideoDuration: Double? private var videoRange: Range? @@ -356,9 +356,6 @@ final class VideoFinishPass: RenderPass { func transitionState(for time: CMTime, mainInput: MTLTexture, additionalInput: MTLTexture?) -> (VideoState, VideoState?, VideoState?) { let timestamp = time.seconds -// if let videoStartOffset = self.videoStartOffset { -// timestamp += videoStartOffset -// } var backgroundTexture = mainInput var backgroundTextureRotation = self.mainTextureRotation @@ -482,6 +479,10 @@ final class VideoFinishPass: RenderPass { } func process(input: MTLTexture, secondInput: MTLTexture?, timestamp: CMTime, device: MTLDevice, commandBuffer: MTLCommandBuffer) -> MTLTexture? { + if !self.isStory { + return input + } + let baseScale: CGFloat if input.height > input.width { baseScale = max(canvasSize.width / CGFloat(input.width), canvasSize.height / CGFloat(input.height)) diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift index f77a52cbc3..3c1abd9c36 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift @@ -1072,10 +1072,10 @@ public final class SingleStoryContentContextImpl: StoryContentContext { TelegramEngine.EngineData.Item.Peer.NotificationSettings(id: storyId.peerId), TelegramEngine.EngineData.Item.NotificationSettings.Global() ), - item |> mapToSignal { item -> Signal<(Stories.StoredItem?, [PeerId: Peer], [MediaId: TelegramMediaFile]), NoError> in - return context.account.postbox.transaction { transaction -> (Stories.StoredItem?, [PeerId: Peer], [MediaId: TelegramMediaFile]) in + item |> mapToSignal { item -> Signal<(Stories.StoredItem?, [PeerId: Peer], [MediaId: TelegramMediaFile], [StoryId: EngineStoryItem?]), NoError> in + return context.account.postbox.transaction { transaction -> (Stories.StoredItem?, [PeerId: Peer], [MediaId: TelegramMediaFile], [StoryId: EngineStoryItem?]) in guard let item else { - return (nil, [:], [:]) + return (nil, [:], [:], [:]) } var peers: [PeerId: Peer] = [:] var stories: [StoryId: EngineStoryItem?] = [:] @@ -1122,7 +1122,7 @@ public final class SingleStoryContentContextImpl: StoryContentContext { } } } - return (item, peers, allEntityFiles) + return (item, peers, allEntityFiles, stories) } } ) @@ -1132,7 +1132,7 @@ public final class SingleStoryContentContextImpl: StoryContentContext { } let (peer, presence, areVoiceMessagesAvailable, canViewStats, notificationSettings, globalNotificationSettings) = data - let (item, peers, allEntityFiles) = itemAndPeers + let (item, peers, allEntityFiles, forwardInfoStories) = itemAndPeers guard let peer else { return @@ -1147,6 +1147,23 @@ public final class SingleStoryContentContextImpl: StoryContentContext { canViewStats: canViewStats ) + for (storyId, story) in forwardInfoStories { + let promise: Promise + var added = false + if let current = self.currentForwardInfoStories[storyId] { + promise = current + } else { + promise = Promise() + self.currentForwardInfoStories[storyId] = promise + added = true + } + if let story { + promise.set(.single(story)) + } else if added { + promise.set(self.context.engine.messages.getStory(peerId: storyId.peerId, id: storyId.id)) + } + } + if item == nil { let storyKey = StoryKey(peerId: storyId.peerId, id: storyId.id) if !self.requestedStoryKeys.contains(storyKey) {