mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-04-25 10:08:34 +02:00
feat: optimize photo rendering
This commit is contained in:
@@ -20,8 +20,13 @@ class Textures {
|
|||||||
if let penTexture = penTextures[textureName] {
|
if let penTexture = penTextures[textureName] {
|
||||||
return penTexture
|
return penTexture
|
||||||
}
|
}
|
||||||
|
let options: [MTKTextureLoader.Option: Any] = [
|
||||||
|
.SRGB: false,
|
||||||
|
.generateMipmaps: true,
|
||||||
|
.textureStorageMode: NSNumber(value: MTLStorageMode.private.rawValue)
|
||||||
|
]
|
||||||
let textureLoader = MTKTextureLoader(device: device)
|
let textureLoader = MTKTextureLoader(device: device)
|
||||||
let penTexture = try? textureLoader.newTexture(name: textureName, scaleFactor: 1.0, bundle: .main, options: [.SRGB: false])
|
let penTexture = try? textureLoader.newTexture(name: textureName, scaleFactor: 1.0, bundle: .main, options: options)
|
||||||
penTextures[textureName] = penTexture
|
penTextures[textureName] = penTexture
|
||||||
return penTexture
|
return penTexture
|
||||||
}
|
}
|
||||||
@@ -30,7 +35,12 @@ class Textures {
|
|||||||
static func createPhotoTexture(for url: URL, on device: MTLDevice) -> MTLTexture? {
|
static func createPhotoTexture(for url: URL, on device: MTLDevice) -> MTLTexture? {
|
||||||
let textureLoader = MTKTextureLoader(device: device)
|
let textureLoader = MTKTextureLoader(device: device)
|
||||||
do {
|
do {
|
||||||
let photoTexture = try textureLoader.newTexture(URL: url, options: [.SRGB: false])
|
let options: [MTKTextureLoader.Option: Any] = [
|
||||||
|
.SRGB: false,
|
||||||
|
.generateMipmaps: true,
|
||||||
|
.textureStorageMode: NSNumber(value: MTLStorageMode.private.rawValue)
|
||||||
|
]
|
||||||
|
let photoTexture = try textureLoader.newTexture(URL: url, options: options)
|
||||||
return photoTexture
|
return photoTexture
|
||||||
} catch {
|
} catch {
|
||||||
NSLog("[Memola] - \(error.localizedDescription)")
|
NSLog("[Memola] - \(error.localizedDescription)")
|
||||||
|
|||||||
@@ -77,7 +77,6 @@ extension Photo: Drawable {
|
|||||||
renderEncoder.setFragmentTexture(texture, index: 0)
|
renderEncoder.setFragmentTexture(texture, index: 0)
|
||||||
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
|
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
|
||||||
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices.count)
|
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices.count)
|
||||||
texture = nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -114,12 +114,32 @@ public class Tool: NSObject, ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func selectPhoto(_ image: UIImage, for canvasID: NSManagedObjectID) {
|
func selectPhoto(_ image: UIImage, for canvasID: NSManagedObjectID) {
|
||||||
let photoItem = bookmarkPhoto(of: image, with: canvasID)
|
guard let resizedImage = resizePhoto(of: image) else { return }
|
||||||
|
let photoItem = bookmarkPhoto(of: resizedImage, with: canvasID)
|
||||||
withAnimation {
|
withAnimation {
|
||||||
selectedPhotoItem = photoItem
|
selectedPhotoItem = photoItem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func resizePhoto(of image: UIImage) -> UIImage? {
|
||||||
|
let targetSize = CGSize(width: 768, height: 768)
|
||||||
|
let size = image.size
|
||||||
|
let widthRatio = targetSize.width / size.width
|
||||||
|
let heightRatio = targetSize.height / size.height
|
||||||
|
let newSize = CGSize(
|
||||||
|
width: size.width * min(widthRatio, heightRatio),
|
||||||
|
height: size.height * min(widthRatio, heightRatio)
|
||||||
|
)
|
||||||
|
let rect = CGRect(origin: .zero, size: newSize)
|
||||||
|
|
||||||
|
UIGraphicsBeginImageContextWithOptions(newSize, true, 1.0)
|
||||||
|
image.draw(in: rect)
|
||||||
|
let newImage = UIGraphicsGetImageFromCurrentImageContext()
|
||||||
|
UIGraphicsEndImageContext()
|
||||||
|
|
||||||
|
return newImage
|
||||||
|
}
|
||||||
|
|
||||||
private func bookmarkPhoto(of image: UIImage, with canvasID: NSManagedObjectID) -> PhotoItem? {
|
private func bookmarkPhoto(of image: UIImage, with canvasID: NSManagedObjectID) -> PhotoItem? {
|
||||||
guard let data = image.jpegData(compressionQuality: 1) else { return nil }
|
guard let data = image.jpegData(compressionQuality: 1) else { return nil }
|
||||||
let fileManager = FileManager.default
|
let fileManager = FileManager.default
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class DrawingView: UIView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateDrawableSize(with size: CGSize) {
|
func updateDrawableSize(with size: CGSize) {
|
||||||
renderView.drawableSize = size.multiply(by: 3)
|
renderView.drawableSize = size.multiply(by: 2.5)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
|
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ struct PhotoItem: Identifiable, Equatable {
|
|||||||
var dimension: CGSize {
|
var dimension: CGSize {
|
||||||
let size = image.size
|
let size = image.size
|
||||||
let maxSize = max(size.width, size.height)
|
let maxSize = max(size.width, size.height)
|
||||||
let width = size.width * 200 / maxSize
|
let width = size.width * 128 / maxSize
|
||||||
let height = size.height * 200 / maxSize
|
let height = size.height * 128 / maxSize
|
||||||
return CGSize(width: width, height: height)
|
return CGSize(width: width, height: height)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user