mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
103 lines
2.7 KiB
Swift
103 lines
2.7 KiB
Swift
//
|
|
// GradientFillNode.swift
|
|
// lottie-swift
|
|
//
|
|
// Created by Brandon Withrow on 1/22/19.
|
|
//
|
|
|
|
import Foundation
|
|
import QuartzCore
|
|
|
|
// MARK: - GradientFillProperties
|
|
|
|
final class GradientFillProperties: NodePropertyMap, KeypathSearchable {
|
|
|
|
// MARK: Lifecycle
|
|
|
|
init(gradientfill: GradientFill) {
|
|
keypathName = gradientfill.name
|
|
opacity = NodeProperty(provider: KeyframeInterpolator(keyframes: gradientfill.opacity.keyframes))
|
|
startPoint = NodeProperty(provider: KeyframeInterpolator(keyframes: gradientfill.startPoint.keyframes))
|
|
endPoint = NodeProperty(provider: KeyframeInterpolator(keyframes: gradientfill.endPoint.keyframes))
|
|
colors = NodeProperty(provider: KeyframeInterpolator(keyframes: gradientfill.colors.keyframes))
|
|
gradientType = gradientfill.gradientType
|
|
numberOfColors = gradientfill.numberOfColors
|
|
keypathProperties = [
|
|
"Opacity" : opacity,
|
|
"Start Point" : startPoint,
|
|
"End Point" : endPoint,
|
|
"Colors" : colors,
|
|
]
|
|
properties = Array(keypathProperties.values)
|
|
}
|
|
|
|
// MARK: Internal
|
|
|
|
var keypathName: String
|
|
|
|
let opacity: NodeProperty<Vector1D>
|
|
let startPoint: NodeProperty<Vector3D>
|
|
let endPoint: NodeProperty<Vector3D>
|
|
let colors: NodeProperty<[Double]>
|
|
|
|
let gradientType: GradientType
|
|
let numberOfColors: Int
|
|
|
|
let keypathProperties: [String: AnyNodeProperty]
|
|
let properties: [AnyNodeProperty]
|
|
|
|
}
|
|
|
|
// MARK: - GradientFillNode
|
|
|
|
final class GradientFillNode: AnimatorNode, RenderNode {
|
|
|
|
// MARK: Lifecycle
|
|
|
|
init(parentNode: AnimatorNode?, gradientFill: GradientFill) {
|
|
fillRender = GradientFillRenderer(parent: parentNode?.outputNode)
|
|
fillProperties = GradientFillProperties(gradientfill: gradientFill)
|
|
self.parentNode = parentNode
|
|
}
|
|
|
|
// MARK: Internal
|
|
|
|
let fillRender: GradientFillRenderer
|
|
|
|
let fillProperties: GradientFillProperties
|
|
|
|
let parentNode: AnimatorNode?
|
|
var hasLocalUpdates = false
|
|
var hasUpstreamUpdates = false
|
|
var lastUpdateFrame: CGFloat? = nil
|
|
|
|
var renderer: NodeOutput & Renderable {
|
|
fillRender
|
|
}
|
|
|
|
// MARK: Animator Node Protocol
|
|
|
|
var propertyMap: NodePropertyMap & KeypathSearchable {
|
|
fillProperties
|
|
}
|
|
|
|
var isEnabled = true {
|
|
didSet {
|
|
fillRender.isEnabled = isEnabled
|
|
}
|
|
}
|
|
|
|
func localUpdatesPermeateDownstream() -> Bool {
|
|
false
|
|
}
|
|
|
|
func rebuildOutputs(frame _: CGFloat) {
|
|
fillRender.start = fillProperties.startPoint.value.pointValue
|
|
fillRender.end = fillProperties.endPoint.value.pointValue
|
|
fillRender.opacity = fillProperties.opacity.value.cgFloatValue * 0.01
|
|
fillRender.colors = fillProperties.colors.value.map { CGFloat($0) }
|
|
fillRender.type = fillProperties.gradientType
|
|
fillRender.numberOfColors = fillProperties.numberOfColors
|
|
}
|
|
}
|