diff options
| author | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2023-07-28 08:53:26 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <ruben@unlimited.pizza> | 2023-07-28 08:53:26 +0200 |
| commit | f5d16c1c8c259966338b23afd407d142f72784aa (patch) | |
| tree | d8ef63436af5c954dac262b4766ece363ac10ac9 /Captura/Data | |
| parent | a4e804275517af683afa1733e2db7c383c306f2b (diff) | |
Separate some logic out of main app
Diffstat (limited to 'Captura/Data')
| -rw-r--r-- | Captura/Data/CapturaFile.swift | 31 | ||||
| -rw-r--r-- | Captura/Data/GifRenderer.swift | 19 | ||||
| -rw-r--r-- | Captura/Data/Notification+AppEvents.swift | 9 |
3 files changed, 50 insertions, 9 deletions
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") -} |