74 lines
2.3 KiB
Swift
74 lines
2.3 KiB
Swift
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
|
|
import SDWebImage
|
|
import SDWebImageWebPCoder
|
|
|
|
internal let imageCoderOptionUseAppleWebpCodec = SDImageCoderOption(rawValue: "useAppleWebpCodec")
|
|
|
|
/**
|
|
A composite WebP coder that uses either `SDImageAWebPCoder` or `SDImageWebPCoder`
|
|
based on the passed `imageCoderOptionUseAppleWebpCodec` option.
|
|
*/
|
|
internal final class WebPCoder: NSObject, SDAnimatedImageCoder {
|
|
nonisolated(unsafe) static let shared = WebPCoder()
|
|
|
|
private var useAppleWebpCodec: Bool = true
|
|
private var instantiatedCoder: SDAnimatedImageCoder?
|
|
private var coder: SDAnimatedImageCoder {
|
|
if let instantiatedCoder {
|
|
return instantiatedCoder
|
|
}
|
|
return self.useAppleWebpCodec ? SDImageAWebPCoder.shared : SDImageWebPCoder.shared
|
|
}
|
|
|
|
override init() {
|
|
super.init()
|
|
}
|
|
|
|
// MARK: - SDAnimatedImageCoder implementations
|
|
|
|
convenience init(animatedImageData data: Data?, options: [SDImageCoderOption: Any]? = nil) {
|
|
self.init()
|
|
self.useAppleWebpCodec = options?[imageCoderOptionUseAppleWebpCodec] as? Bool ?? true
|
|
self.instantiatedCoder = self.useAppleWebpCodec
|
|
? SDImageAWebPCoder.init(animatedImageData: data, options: options)
|
|
: SDImageWebPCoder.init(animatedImageData: data, options: options)
|
|
}
|
|
|
|
func canDecode(from data: Data?) -> Bool {
|
|
return self.coder.canDecode(from: data)
|
|
}
|
|
|
|
func decodedImage(with data: Data?, options: [SDImageCoderOption: Any]? = nil) -> UIImage? {
|
|
return self.coder.decodedImage(with: data, options: options)
|
|
}
|
|
|
|
func canEncode(to format: SDImageFormat) -> Bool {
|
|
return self.coder.canEncode(to: format)
|
|
}
|
|
|
|
func encodedData(with image: UIImage?, format: SDImageFormat, options: [SDImageCoderOption: Any]? = nil) -> Data? {
|
|
return self.coder.encodedData(with: image, format: format, options: options)
|
|
}
|
|
|
|
var animatedImageData: Data? {
|
|
return self.coder.animatedImageData
|
|
}
|
|
|
|
var animatedImageFrameCount: UInt {
|
|
return self.coder.animatedImageFrameCount
|
|
}
|
|
|
|
var animatedImageLoopCount: UInt {
|
|
return self.coder.animatedImageLoopCount
|
|
}
|
|
|
|
func animatedImageFrame(at index: UInt) -> UIImage? {
|
|
return self.coder.animatedImageFrame(at: index)
|
|
}
|
|
|
|
func animatedImageDuration(at index: UInt) -> TimeInterval {
|
|
return self.coder.animatedImageDuration(at: index)
|
|
}
|
|
}
|