From f5d16c1c8c259966338b23afd407d142f72784aa Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Fri, 28 Jul 2023 08:53:26 +0200 Subject: Separate some logic out of main app --- Captura/Data/CapturaFile.swift | 31 +++++++++++++++++++++++++++++++ Captura/Data/GifRenderer.swift | 19 +++++++++++++++++++ Captura/Data/Notification+AppEvents.swift | 9 --------- 3 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 Captura/Data/CapturaFile.swift create mode 100644 Captura/Data/GifRenderer.swift delete mode 100644 Captura/Data/Notification+AppEvents.swift (limited to 'Captura/Data') diff --git a/Captura/Data/CapturaFile.swift b/Captura/Data/CapturaFile.swift new file mode 100644 index 0000000..da1f2fb --- /dev/null +++ b/Captura/Data/CapturaFile.swift @@ -0,0 +1,31 @@ +import Foundation + +struct CapturaFile { + + let name: String + let baseDirectory: URL + let appDirectory: String = "captura" + + private var baseURL: URL { + baseDirectory.appendingPathComponent("\(appDirectory)/\(name)") + } + + var mp4URL: URL { + return baseURL.appendingPathExtension("mp4") + } + + var gifURL: URL { + return baseURL.appendingPathExtension("gif") + } + + init() { + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .medium + dateFormatter.timeStyle = .medium + dateFormatter.locale = Locale.current + let dateString = dateFormatter.string(from: Date()).replacingOccurrences(of: ":", with: ".") + + self.name = "Captura \(dateString)" + self.baseDirectory = FileManager.default.urls(for: .picturesDirectory, in: .userDomainMask).first! + } +} diff --git a/Captura/Data/GifRenderer.swift b/Captura/Data/GifRenderer.swift new file mode 100644 index 0000000..208d7db --- /dev/null +++ b/Captura/Data/GifRenderer.swift @@ -0,0 +1,19 @@ +import UniformTypeIdentifiers +import SwiftUI +import CoreGraphics + +struct GifRenderer { + static func render(_ images: [CGImage], at fps: Int, to url: URL) async { + let framedelay = String(format: "%.3f", 1.0 / Double(fps)) + let fileProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFLoopCount as String: 0]] + let gifProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFUnclampedDelayTime as String: framedelay]] + let cfURL = url as CFURL + if let destination = CGImageDestinationCreateWithURL(cfURL, UTType.gif.identifier as CFString, images.count, nil) { + CGImageDestinationSetProperties(destination, fileProperties as CFDictionary?) + for image in images { + CGImageDestinationAddImage(destination, image, gifProperties as CFDictionary?) + } + CGImageDestinationFinalize(destination) + } + } +} diff --git a/Captura/Data/Notification+AppEvents.swift b/Captura/Data/Notification+AppEvents.swift deleted file mode 100644 index 809c00e..0000000 --- a/Captura/Data/Notification+AppEvents.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -extension Notification.Name { - static let startAreaSelection = Notification.Name("startSelectingArea") - static let startRecording = Notification.Name("startRecording") - static let stopRecording = Notification.Name("stopRecording") - static let finalizeRecording = Notification.Name("finalizeRecording") - static let reset = Notification.Name("reset") -} -- cgit