Swiftgram/submodules/lottie-ios/Sources/Public/macOS/FilepathImageProvider.macOS.swift
2022-06-06 18:25:58 +04:00

70 lines
1.8 KiB
Swift

//
// FilepathImageProvider.swift
// lottie-swift
//
// Created by Brandon Withrow on 2/1/19.
//
#if os(macOS)
import AppKit
/// An `AnimationImageProvider` that provides images by name from a specific filepath.
public class FilepathImageProvider: AnimationImageProvider {
// MARK: Lifecycle
/// Initializes an image provider with a specific filepath.
///
/// - Parameter filepath: The absolute filepath containing the images.
///
public init(filepath: String) {
self.filepath = URL(fileURLWithPath: filepath)
}
public init(filepath: URL) {
self.filepath = filepath
}
// MARK: Public
public func imageForAsset(asset: ImageAsset) -> CGImage? {
if
asset.name.hasPrefix("data:"),
let url = URL(string: asset.name),
let data = try? Data(contentsOf: url),
let image = NSImage(data: data)
{
return image.CGImage
}
let directPath = filepath.appendingPathComponent(asset.name).path
if FileManager.default.fileExists(atPath: directPath) {
return NSImage(contentsOfFile: directPath)?.CGImage
}
let pathWithDirectory = filepath.appendingPathComponent(asset.directory).appendingPathComponent(asset.name).path
if FileManager.default.fileExists(atPath: pathWithDirectory) {
return NSImage(contentsOfFile: pathWithDirectory)?.CGImage
}
LottieLogger.shared.assertionFailure("Could not find image \"\(asset.name)\" in bundle")
return nil
}
// MARK: Internal
let filepath: URL
}
extension NSImage {
@nonobjc
var CGImage: CGImage? {
guard let imageData = tiffRepresentation else { return nil }
guard let sourceData = CGImageSourceCreateWithData(imageData as CFData, nil) else { return nil }
return CGImageSourceCreateImageAtIndex(sourceData, 0, nil)
}
}
#endif