diff --git a/submodules/DrawingUI/Sources/DrawingScreen.swift b/submodules/DrawingUI/Sources/DrawingScreen.swift index 064a544fd8..545c690156 100644 --- a/submodules/DrawingUI/Sources/DrawingScreen.swift +++ b/submodules/DrawingUI/Sources/DrawingScreen.swift @@ -2342,10 +2342,10 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController, U return self._selectionContainerView! } - private var _contentWrapperView: PortalSourceView? - var contentWrapperView: PortalSourceView { + private var _contentWrapperView: UIView? + var contentWrapperView: UIView { if self._contentWrapperView == nil { - self._contentWrapperView = PortalSourceView() + self._contentWrapperView = UIView() } return self._contentWrapperView! } @@ -2423,6 +2423,7 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController, U context: self.context, drawingView: self.drawingView, entitiesView: self.entitiesView, + contentWrapperView: self.contentWrapperView, selectionContainerView: self.selectionContainerView, isVideo: controller.isVideo, updateSelectedEntity: { [weak self] entity in @@ -2786,7 +2787,7 @@ public class DrawingScreen: ViewController, TGPhotoDrawingInterfaceController, U return self.node.selectionContainerView } - public var contentWrapperView: PortalSourceView { + public var contentWrapperView: UIView { return self.node.contentWrapperView } @@ -2954,6 +2955,7 @@ public final class DrawingToolsInteraction { private let context: AccountContext private let drawingView: DrawingView private let entitiesView: DrawingEntitiesView + private weak var contentWrapperView: UIView? private let selectionContainerView: DrawingSelectionContainerView private let isVideo: Bool private let updateSelectedEntity: (DrawingEntity?) -> Void @@ -2983,6 +2985,7 @@ public final class DrawingToolsInteraction { context: AccountContext, drawingView: DrawingView, entitiesView: DrawingEntitiesView, + contentWrapperView: UIView, selectionContainerView: DrawingSelectionContainerView, isVideo: Bool, updateSelectedEntity: @escaping (DrawingEntity?) -> Void, @@ -2998,6 +3001,7 @@ public final class DrawingToolsInteraction { self.context = context self.drawingView = drawingView self.entitiesView = entitiesView + self.contentWrapperView = contentWrapperView self.selectionContainerView = selectionContainerView self.isVideo = isVideo self.updateSelectedEntity = updateSelectedEntity @@ -3182,50 +3186,51 @@ public final class DrawingToolsInteraction { return } - guard let currentImage = self.getCurrentImage() else { - self.entitiesView.play() - self.updateVideoPlayback(true) - return - } - + let currentImage = self.getCurrentImage() + let sourceImage = generateImage(self.drawingView.imageSize, contextGenerator: { size, context in let bounds = CGRect(origin: .zero, size: size) - if let cgImage = currentImage.cgImage { + if let cgImage = currentImage?.cgImage { context.draw(cgImage, in: bounds) } - if let cgImage = self.drawingView.drawingImage?.cgImage { - context.draw(cgImage, in: bounds) + if self.drawingView.superview !== self.entitiesView { + if let cgImage = self.drawingView.drawingImage?.cgImage { + context.draw(cgImage, in: bounds) + } } context.translateBy(x: size.width / 2.0, y: size.height / 2.0) context.scaleBy(x: 1.0, y: -1.0) context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) self.entitiesView.layer.render(in: context) }, opaque: true, scale: 1.0) - guard let sourceImage = sourceImage else { + + guard let sourceImage, var contentWrapperView = self.contentWrapperView, let controllerView = self.getControllerNode()?.view else { return } - let _ = sourceImage + if contentWrapperView.frame.width.isZero { + contentWrapperView = self.entitiesView.superview! + } + + let eyedropperView = EyedropperView(containerSize: contentWrapperView.frame.size, drawingView: self.drawingView, sourceImage: sourceImage) + eyedropperView.completed = { [weak self] color in + if let self { + self.updateColor(color) + self.entitiesView.play() + self.updateVideoPlayback(true) -// let eyedropperView = EyedropperView(containerSize: controller.contentWrapperView.frame.size, drawingView: self.drawingView, sourceImage: sourceImage) -// eyedropperView.completed = { [weak self] color in -// if let self { -// self.updateColor(color) -// self.entitiesView.play() -// self.updateVideoPlayback(true) -// -// dismissed() -// } -// } -// eyedropperView.dismissed = { [weak self] in -// if let self { -// self.entitiesView.play() -// self.updateVideoPlayback(true) -// } -// } -// eyedropperView.frame = controller.contentWrapperView.convert(controller.contentWrapperView.bounds, to: controller.view) -// self.addSubview(eyedropperView) -// self.currentEyedropperView = eyedropperView + dismissed() + } + } + eyedropperView.dismissed = { [weak self] in + if let self { + self.entitiesView.play() + self.updateVideoPlayback(true) + } + } + eyedropperView.frame = contentWrapperView.convert(contentWrapperView.bounds, to: controllerView) + self.addSubview(eyedropperView) + self.currentEyedropperView = eyedropperView } func dismissCurrentEyedropper() { diff --git a/submodules/DrawingUI/Sources/EyedropperView.swift b/submodules/DrawingUI/Sources/EyedropperView.swift index 62ebd7e774..b7732a699d 100644 --- a/submodules/DrawingUI/Sources/EyedropperView.swift +++ b/submodules/DrawingUI/Sources/EyedropperView.swift @@ -56,7 +56,7 @@ public final class EyedropperView: UIView { var completed: (DrawingColor) -> Void = { _ in } var dismissed: () -> Void = { } - + init(containerSize: CGSize, drawingView: DrawingView, sourceImage: UIImage) { self.drawingView = drawingView diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index a39d76544f..1cfefcb619 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -2005,23 +2005,11 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate if let self { switch action { case .play: - self.entitiesView.eachView({ view in - if let sticker = view.entity as? DrawingStickerEntity, case .video = sticker.content { - view.play() - } - }) + self.entitiesView.play() case .pause: - self.entitiesView.eachView({ view in - if let sticker = view.entity as? DrawingStickerEntity, case .video = sticker.content { - view.pause() - } - }) + self.entitiesView.pause() case let .seek(timestamp): - self.entitiesView.eachView({ view in - if let sticker = view.entity as? DrawingStickerEntity, case .video = sticker.content { - view.seek(to: timestamp) - } - }) + self.entitiesView.seek(to: timestamp) } } } @@ -2061,6 +2049,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate context: self.context, drawingView: self.drawingView, entitiesView: self.entitiesView, + contentWrapperView: self.previewContainerView, selectionContainerView: self.selectionContainerView, isVideo: false, updateSelectedEntity: { [weak self] _ in @@ -2904,7 +2893,60 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate self.previousDrawingEntities = self.entitiesView.entities self.interaction?.deactivate() - let controller = DrawingScreen(context: self.context, sourceHint: .storyEditor, size: self.previewContainerView.frame.size, originalSize: storyDimensions, isVideo: false, isAvatar: false, drawingView: self.drawingView, entitiesView: self.entitiesView, selectionContainerView: self.selectionContainerView, existingStickerPickerInputData: self.stickerPickerInputData) + let controller = DrawingScreen( + context: self.context, + sourceHint: .storyEditor, + size: self.previewContainerView.frame.size, + originalSize: storyDimensions, + isVideo: self.mediaEditor?.sourceIsVideo ?? false, + isAvatar: false, + drawingView: self.drawingView, + entitiesView: self.entitiesView, + selectionContainerView: self.selectionContainerView, + existingStickerPickerInputData: self.stickerPickerInputData + ) + controller.getCurrentImage = { [weak self] in + guard let self else { + return nil + } + let colorSpace = CGColorSpaceCreateDeviceRGB() + let imageSize = CGSize(width: 1080, height: 1920) + let context = DrawingContext(size: imageSize, scale: 1.0, opaque: true, colorSpace: colorSpace) + + context?.withFlippedContext { context in + if let gradientImage = self.gradientView.image?.cgImage { + context.draw(gradientImage, in: CGRect(origin: .zero, size: imageSize)) + } + if let image = self.mediaEditor?.resultImage, let values = self.mediaEditor?.values { + let initialScale: CGFloat + if image.size.height > image.size.width { + initialScale = max(imageSize.width / image.size.width, imageSize.height / image.size.height) + } else { + initialScale = imageSize.width / image.size.width + } + let scale = initialScale * values.cropScale + context.translateBy(x: imageSize.width / 2.0 + values.cropOffset.x, y: imageSize.height / 2.0 - values.cropOffset.y) + context.rotate(by: -values.cropRotation) + context.scaleBy(x: scale, y: scale) + + if let cgImage = image.cgImage { + context.draw(cgImage, in: CGRect(x: -image.size.width / 2.0, y: -image.size.height / 2.0, width: image.size.width, height: image.size.height)) + } + } + } + + return context?.generateImage(colorSpace: colorSpace) + } + controller.updateVideoPlayback = { [weak self] play in + guard let self else { + return + } + if play { + self.mediaEditor?.play() + } else { + self.mediaEditor?.stop() + } + } self.drawingScreen = controller self.drawingView.isUserInteractionEnabled = true