mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
112 lines
3.3 KiB
Swift
112 lines
3.3 KiB
Swift
import Foundation
|
|
import QuartzCore
|
|
|
|
/**
|
|
The base class for a child layer of CompositionContainer
|
|
*/
|
|
class MyCompositionLayer {
|
|
var bounds: CGRect = CGRect()
|
|
|
|
let transformNode: LayerTransformNode
|
|
|
|
//let contentsLayer: CALayer = CALayer()
|
|
|
|
let maskLayer: MyMaskContainerLayer?
|
|
|
|
let matteType: MatteType?
|
|
|
|
var matteLayer: MyCompositionLayer? {
|
|
didSet {
|
|
//NOTE
|
|
/*if let matte = matteLayer {
|
|
if let type = matteType, type == .invert {
|
|
|
|
mask = InvertedMatteLayer(inputMatte: matte)
|
|
} else {
|
|
mask = matte
|
|
}
|
|
} else {
|
|
mask = nil
|
|
}*/
|
|
}
|
|
}
|
|
|
|
let inFrame: CGFloat
|
|
let outFrame: CGFloat
|
|
let startFrame: CGFloat
|
|
let timeStretch: CGFloat
|
|
|
|
init(layer: LayerModel, size: CGSize) {
|
|
self.transformNode = LayerTransformNode(transform: layer.transform)
|
|
if let masks = layer.masks {
|
|
maskLayer = MyMaskContainerLayer(masks: masks)
|
|
} else {
|
|
maskLayer = nil
|
|
}
|
|
self.matteType = layer.matte
|
|
self.inFrame = layer.inFrame.cgFloat
|
|
self.outFrame = layer.outFrame.cgFloat
|
|
self.timeStretch = layer.timeStretch.cgFloat
|
|
self.startFrame = layer.startTime.cgFloat
|
|
|
|
//NOTE
|
|
//self.anchorPoint = .zero
|
|
|
|
//NOTE
|
|
/*contentsLayer.anchorPoint = .zero
|
|
contentsLayer.bounds = CGRect(origin: .zero, size: size)
|
|
contentsLayer.actions = [
|
|
"opacity" : NSNull(),
|
|
"transform" : NSNull(),
|
|
"bounds" : NSNull(),
|
|
"anchorPoint" : NSNull(),
|
|
"sublayerTransform" : NSNull(),
|
|
"hidden" : NSNull()
|
|
]
|
|
addSublayer(contentsLayer)
|
|
|
|
if let maskLayer = maskLayer {
|
|
contentsLayer.mask = maskLayer
|
|
}*/
|
|
}
|
|
|
|
private(set) var isHidden = false
|
|
|
|
final func displayWithFrame(frame: CGFloat, forceUpdates: Bool) {
|
|
transformNode.updateTree(frame, forceUpdates: forceUpdates)
|
|
let layerVisible = frame.isInRangeOrEqual(inFrame, outFrame)
|
|
/// Only update contents if current time is within the layers time bounds.
|
|
if layerVisible {
|
|
displayContentsWithFrame(frame: frame, forceUpdates: forceUpdates)
|
|
maskLayer?.updateWithFrame(frame: frame, forceUpdates: forceUpdates)
|
|
}
|
|
self.isHidden = !layerVisible
|
|
//NOTE
|
|
/*contentsLayer.transform = transformNode.globalTransform
|
|
contentsLayer.opacity = transformNode.opacity
|
|
contentsLayer.isHidden = !layerVisible*/
|
|
}
|
|
|
|
func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
|
|
/// To be overridden by subclass
|
|
}
|
|
|
|
func captureGeometry() -> CapturedGeometryNode {
|
|
return CapturedGeometryNode(
|
|
transform: self.transformNode.globalTransform,
|
|
alpha: CGFloat(self.transformNode.opacity),
|
|
isHidden: self.isHidden,
|
|
displayItem: self.captureDisplayItem(),
|
|
subnodes: self.captureChildren()
|
|
)
|
|
}
|
|
|
|
func captureDisplayItem() -> CapturedGeometryNode.DisplayItem? {
|
|
preconditionFailure()
|
|
}
|
|
|
|
func captureChildren() -> [CapturedGeometryNode] {
|
|
preconditionFailure()
|
|
}
|
|
}
|