iOS/WAStickersThirdParty/WebPManager.swift (51 lines of code) (raw):
//
// Copyright (c) WhatsApp Inc. and its affiliates.
// All rights reserved.
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.
//
import UIKit
class WebPManager {
static let shared: WebPManager = WebPManager()
func isAnimated(webPData data: Data) -> Bool {
guard let decoder = YYImageDecoder(data: data, scale: 1.0) else { return false }
return decoder.frameCount > 1
}
func minFrameDuration(webPData data: Data) -> TimeInterval {
guard let decoder = YYImageDecoder(data: data, scale: 1.0) else { return -1 }
guard decoder.frameCount > 1 else { return -1 }
var minFrameDuration = decoder.frameDuration(at: 0)
for index in 1..<decoder.frameCount {
let frameDuration = decoder.frameDuration(at: index)
if frameDuration < minFrameDuration {
minFrameDuration = frameDuration
}
}
return minFrameDuration
}
func totalAnimationDuration(webPData data: Data) -> TimeInterval {
guard let decoder = YYImageDecoder(data: data, scale: 1.0) else { return -1 }
guard decoder.frameCount > 1 else { return -1 }
var totalAnimationDuration = decoder.frameDuration(at: 0)
for index in 1..<decoder.frameCount {
totalAnimationDuration += decoder.frameDuration(at: index)
}
return totalAnimationDuration
}
func decode(webPData data: Data) -> [UIImage]? {
guard let decoder = YYImageDecoder(data: data, scale: 1.0) else { return nil }
var images: [UIImage] = []
for index in 0..<decoder.frameCount {
guard let frame = decoder.frame(at: index, decodeForDisplay: true) else {
continue
}
guard let image = frame.image else {
continue
}
images.append(image)
}
if images.count == 0 {
return nil
}
return images
}
func encode(pngData data: Data) -> Data? {
guard let encoder = YYImageEncoder(type: YYImageType.webP) else { return nil }
encoder.addImage(with: data, duration: 0.0)
return encoder.encode()
}
}