Various fixes

This commit is contained in:
Ilya Laktyushin 2022-12-25 21:16:27 +04:00
parent c98abdd025
commit 4afc8c1af3
5 changed files with 56 additions and 89 deletions

View File

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

View File

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

View File

@ -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);
}
}

View File

@ -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<TGPhotoDrawingInterfaceController> *)_drawingAdapter.interfaceController;

View File

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