2023-05-27 02:29:23 +04:00

100 lines
2.6 KiB
Swift

import Foundation
import UIKit
import Metal
import MetalKit
import SwiftSignalKit
public final class MediaEditorPreviewView: MTKView, MTKViewDelegate, RenderTarget {
var renderer: MediaEditorRenderer? {
didSet {
if let renderer = self.renderer {
renderer.renderTargetDidChange(self)
}
}
}
var drawable: MTLDrawable? {
return self.currentDrawable
}
var renderPassDescriptor: MTLRenderPassDescriptor? {
return self.currentRenderPassDescriptor
}
var mtlDevice: MTLDevice? {
return self.device
}
public override init(frame frameRect: CGRect, device: MTLDevice?) {
super.init(frame: frameRect, device: device)
self.setup()
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setup() {
guard let device = MTLCreateSystemDefaultDevice() else {
return
}
self.device = device
self.delegate = self
self.colorPixelFormat = .bgra8Unorm
self.isPaused = true
self.enableSetNeedsDisplay = false
}
func scheduleFrame() {
Queue.mainQueue().justDispatch {
self.draw()
}
}
public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
Queue.mainQueue().justDispatch {
self.renderer?.renderTargetDrawableSizeDidChange(size)
}
}
public func draw(in view: MTKView) {
guard self.frame.width > 0.0 else {
return
}
self.renderer?.renderFrame()
}
private var transitionView: UIImageView?
public func setTransitionImage(_ image: UIImage) {
self.transitionView?.removeFromSuperview()
let transitionView = UIImageView(image: image)
transitionView.frame = self.bounds
self.addSubview(transitionView)
self.transitionView = transitionView
}
public func removeTransitionImage() {
if let transitionView = self.transitionView {
// transitionView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak transitionView] _ in
//
// })
transitionView.removeFromSuperview()
self.transitionView = nil
}
}
public override func layoutSubviews() {
super.layoutSubviews()
if let transitionView = self.transitionView {
transitionView.frame = self.bounds
}
}
}