aboutsummaryrefslogtreecommitdiff
path: root/Captura/Data
diff options
context:
space:
mode:
authorRuben Beltran del Rio <ruben@unlimited.pizza>2023-07-28 08:53:26 +0200
committerRuben Beltran del Rio <ruben@unlimited.pizza>2023-07-28 08:53:26 +0200
commitf5d16c1c8c259966338b23afd407d142f72784aa (patch)
treed8ef63436af5c954dac262b4766ece363ac10ac9 /Captura/Data
parenta4e804275517af683afa1733e2db7c383c306f2b (diff)
Separate some logic out of main app
Diffstat (limited to 'Captura/Data')
-rw-r--r--Captura/Data/CapturaFile.swift31
-rw-r--r--Captura/Data/GifRenderer.swift19
-rw-r--r--Captura/Data/Notification+AppEvents.swift9
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")
-}