Merge commit '80079dba5ac3c897ecbd4f62a9925802a04d9ab0'

This commit is contained in:
Ali 2023-07-09 21:14:25 +04:00
commit 75ef8d9d7d
3 changed files with 98 additions and 51 deletions

View File

@ -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() {

View File

@ -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

View File

@ -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