From 4afc8c1af36f1718678efe14e2aba765fd7ef76a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 25 Dec 2022 21:16:27 +0400 Subject: [PATCH] Various fixes --- .../DrawingUI/Sources/DrawingMetalView.swift | 129 ++++++------------ .../DrawingUI/Sources/DrawingNeonTool.swift | 4 +- .../Sources/TGPhotoCaptionInputMixin.m | 4 +- .../Sources/TGPhotoDrawingController.m | 5 + .../Sources/TGPhotoEditorController.m | 3 +- 5 files changed, 56 insertions(+), 89 deletions(-) diff --git a/submodules/DrawingUI/Sources/DrawingMetalView.swift b/submodules/DrawingUI/Sources/DrawingMetalView.swift index e386379f03..34c7e6742c 100644 --- a/submodules/DrawingUI/Sources/DrawingMetalView.swift +++ b/submodules/DrawingUI/Sources/DrawingMetalView.swift @@ -59,7 +59,13 @@ final class DrawingMetalView: MTKView { override var isHidden: Bool { didSet { - self.isPaused = self.isHidden + if self.isHidden { + Queue.mainQueue().after(0.2) { + self.isPaused = true + } + } else { + self.isPaused = self.isHidden + } } } @@ -138,7 +144,6 @@ final class DrawingMetalView: MTKView { } } - override var frame: CGRect { get { return super.frame @@ -157,7 +162,7 @@ final class DrawingMetalView: MTKView { let renderPassDescriptor = MTLRenderPassDescriptor() let attachment = renderPassDescriptor.colorAttachments[0] - attachment?.clearColor = clearColor + attachment?.clearColor = self.clearColor attachment?.texture = self.currentDrawable?.texture attachment?.loadAction = .clear attachment?.storeAction = .store @@ -185,7 +190,7 @@ final class DrawingMetalView: MTKView { func reset() { let renderPassDescriptor = MTLRenderPassDescriptor() let attachment = renderPassDescriptor.colorAttachments[0] - attachment?.clearColor = clearColor + attachment?.clearColor = self.clearColor attachment?.texture = self.currentDrawable?.texture attachment?.loadAction = .clear attachment?.storeAction = .store @@ -250,6 +255,15 @@ private class Drawable { func clear() { self.texture?.clear() + } + + func reset() { + self.prepareForDraw() + + if let commandEncoder = self.makeCommandEncoder() { + commandEncoder.endEncoding() + } + self.commit(wait: true) } @@ -273,6 +287,7 @@ private class Drawable { return commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor) } + internal func commit(wait: Bool = false) { self.commandBuffer?.commit() if wait { @@ -632,57 +647,23 @@ final class Texture { self.width = width self.height = height self.bytesPerRow = bytesPerRow + + self.buffer = nil -// if #available(iOS 12.0, *) { -//#if targetEnvironment(simulator) -// self.buffer = nil -// let textureDescriptor = MTLTextureDescriptor() -// textureDescriptor.textureType = .type2D -// textureDescriptor.pixelFormat = .bgra8Unorm -// textureDescriptor.width = width -// textureDescriptor.height = height -// textureDescriptor.usage = [.renderTarget, .shaderRead] -// textureDescriptor.storageMode = .shared -// -// guard let texture = device.makeTexture(descriptor: textureDescriptor) else { -// return nil -// } -//#else -// guard let buffer = device.makeBuffer(length: bytesPerRow * height, options: MTLResourceOptions.storageModeShared) else { -// return nil -// } -// self.buffer = buffer -// -// let textureDescriptor = MTLTextureDescriptor() -// textureDescriptor.textureType = .type2D -// textureDescriptor.pixelFormat = .bgra8Unorm -// textureDescriptor.width = width -// textureDescriptor.height = height -// textureDescriptor.usage = [.renderTarget, .shaderRead] -// textureDescriptor.storageMode = buffer.storageMode -// -// guard let texture = buffer.makeTexture(descriptor: textureDescriptor, offset: 0, bytesPerRow: bytesPerRow) else { -// return nil -// } -//#endif -// self.texture = texture -// } else { - self.buffer = nil - - let textureDescriptor = MTLTextureDescriptor() - textureDescriptor.textureType = .type2D - textureDescriptor.pixelFormat = .bgra8Unorm - textureDescriptor.width = width - textureDescriptor.height = height - textureDescriptor.usage = [.renderTarget, .shaderRead] - textureDescriptor.storageMode = .shared + let textureDescriptor = MTLTextureDescriptor() + textureDescriptor.textureType = .type2D + textureDescriptor.pixelFormat = .bgra8Unorm + textureDescriptor.width = width + textureDescriptor.height = height + textureDescriptor.usage = [.renderTarget, .shaderRead] + textureDescriptor.storageMode = .shared + + guard let texture = device.makeTexture(descriptor: textureDescriptor) else { + return nil + } - guard let texture = device.makeTexture(descriptor: textureDescriptor) else { - return nil - } - - self.texture = texture -// } + self.texture = texture + self.clear() } @@ -699,37 +680,17 @@ final class Texture { func createCGImage() -> CGImage? { let dataProvider: CGDataProvider -// if #available(iOS 12.0, *) { -//#if targetEnvironment(simulator) -// guard let data = NSMutableData(capacity: self.bytesPerRow * self.height) else { -// return nil -// } -// data.length = self.bytesPerRow * self.height -// self.texture.getBytes(data.mutableBytes, bytesPerRow: self.bytesPerRow, bytesPerImage: self.bytesPerRow * self.height, from: MTLRegion(origin: MTLOrigin(), size: MTLSize(width: self.width, height: self.height, depth: 1)), mipmapLevel: 0, slice: 0) -// -// guard let provider = CGDataProvider(data: data as CFData) else { -// return nil -// } -// dataProvider = provider -//#else -// guard let buffer = self.buffer, let provider = CGDataProvider(data: Data(bytesNoCopy: buffer.contents(), count: buffer.length, deallocator: .custom { _, _ in -// }) as CFData) else { -// return nil -// } -// dataProvider = provider -//#endif -// } else { - guard let data = NSMutableData(capacity: self.bytesPerRow * self.height) else { - return nil - } - data.length = self.bytesPerRow * self.height - self.texture.getBytes(data.mutableBytes, bytesPerRow: self.bytesPerRow, bytesPerImage: self.bytesPerRow * self.height, from: MTLRegion(origin: MTLOrigin(), size: MTLSize(width: self.width, height: self.height, depth: 1)), mipmapLevel: 0, slice: 0) - - guard let provider = CGDataProvider(data: data as CFData) else { - return nil - } - dataProvider = provider -// } + + guard let data = NSMutableData(capacity: self.bytesPerRow * self.height) else { + return nil + } + data.length = self.bytesPerRow * self.height + self.texture.getBytes(data.mutableBytes, bytesPerRow: self.bytesPerRow, bytesPerImage: self.bytesPerRow * self.height, from: MTLRegion(origin: MTLOrigin(), size: MTLSize(width: self.width, height: self.height, depth: 1)), mipmapLevel: 0, slice: 0) + + guard let provider = CGDataProvider(data: data as CFData) else { + return nil + } + dataProvider = provider guard let image = CGImage( width: Int(self.width), diff --git a/submodules/DrawingUI/Sources/DrawingNeonTool.swift b/submodules/DrawingUI/Sources/DrawingNeonTool.swift index be7fb2ba83..4a3f5aaad3 100644 --- a/submodules/DrawingUI/Sources/DrawingNeonTool.swift +++ b/submodules/DrawingUI/Sources/DrawingNeonTool.swift @@ -76,8 +76,8 @@ final class NeonTool: DrawingElement { let renderColor: UIColor private var pathStarted = false - private let path = UIBezierPath() - private var activePath: UIBezierPath? + private let path = UIBezierPath() + private var activePath: UIBezierPath? private var addedPaths = 0 fileprivate var renderPath: CGPath? diff --git a/submodules/LegacyComponents/Sources/TGPhotoCaptionInputMixin.m b/submodules/LegacyComponents/Sources/TGPhotoCaptionInputMixin.m index 55f00986cf..d9cd29dbd7 100644 --- a/submodules/LegacyComponents/Sources/TGPhotoCaptionInputMixin.m +++ b/submodules/LegacyComponents/Sources/TGPhotoCaptionInputMixin.m @@ -241,11 +241,11 @@ if (animated) { [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ _inputPanelView.frame = CGRectMake(edgeInsets.left, y, frame.size.width, panelHeight); - _backgroundView.frame = CGRectMake(edgeInsets.left, y, frame.size.width, backgroundHeight + 1.0); + _backgroundView.frame = CGRectMake(edgeInsets.left, y, frame.size.width, backgroundHeight); } completion:nil]; } else { _inputPanelView.frame = CGRectMake(edgeInsets.left, y, frame.size.width, panelHeight); - _backgroundView.frame = CGRectMake(edgeInsets.left, y, frame.size.width, backgroundHeight + 1.0); + _backgroundView.frame = CGRectMake(edgeInsets.left, y, frame.size.width, backgroundHeight); } } diff --git a/submodules/LegacyComponents/Sources/TGPhotoDrawingController.m b/submodules/LegacyComponents/Sources/TGPhotoDrawingController.m index 7cc71c0a59..a74d4d2316 100644 --- a/submodules/LegacyComponents/Sources/TGPhotoDrawingController.m +++ b/submodules/LegacyComponents/Sources/TGPhotoDrawingController.m @@ -81,6 +81,11 @@ const CGSize TGPhotoPaintingMaxSize = { 1920.0f, 1920.0f }; _context = context; _stickersContext = stickersContext; + if (entitiesView != nil) { + _skipEntitiesSetup = true; + entitiesView.userInteractionEnabled = true; + } + CGSize size = TGScaleToSize(photoEditor.originalSize, [TGPhotoDrawingController maximumPaintingSize]); _drawingAdapter = [_stickersContext drawingAdapter:size originalSize:photoEditor.originalSize isVideo:photoEditor.forVideo isAvatar:isAvatar entitiesView:entitiesView]; _interfaceController = (UIViewController *)_drawingAdapter.interfaceController; diff --git a/submodules/LegacyComponents/Sources/TGPhotoEditorController.m b/submodules/LegacyComponents/Sources/TGPhotoEditorController.m index 8d2382620e..0ca5fa708b 100644 --- a/submodules/LegacyComponents/Sources/TGPhotoEditorController.m +++ b/submodules/LegacyComponents/Sources/TGPhotoEditorController.m @@ -336,7 +336,8 @@ _fullPaintingView = [[UIImageView alloc] init]; _fullPaintingView.frame = _fullPreviewView.frame; - _fullEntitiesView = [_stickersContext drawingEntitiesViewWithSize:_photoEditor.originalSize]; + CGSize size = TGScaleToSize(_photoEditor.originalSize, [TGPhotoDrawingController maximumPaintingSize]); + _fullEntitiesView = [_stickersContext drawingEntitiesViewWithSize:size]; _fullEntitiesView.userInteractionEnabled = false; CGRect rect = [TGPhotoDrawingController fittedCropRect:_photoEditor.cropRect originalSize:_photoEditor.originalSize keepOriginalSize:true]; _fullEntitiesView.frame = CGRectMake(0, 0, rect.size.width, rect.size.height);