63 lines
1.4 KiB
Swift
63 lines
1.4 KiB
Swift
//
|
|
// RenderNode.swift
|
|
// lottie-swift
|
|
//
|
|
// Created by Brandon Withrow on 1/17/19.
|
|
//
|
|
|
|
import CoreGraphics
|
|
import Foundation
|
|
import QuartzCore
|
|
|
|
// MARK: - RenderNode
|
|
|
|
/// A protocol that defines a node that holds render instructions
|
|
protocol RenderNode {
|
|
var renderer: Renderable & NodeOutput { get }
|
|
}
|
|
|
|
// MARK: - Renderable
|
|
|
|
/// A protocol that defines anything with render instructions
|
|
protocol Renderable {
|
|
|
|
/// The last frame in which this node was updated.
|
|
var hasUpdate: Bool { get }
|
|
|
|
func hasRenderUpdates(_ forFrame: CGFloat) -> Bool
|
|
|
|
/// Determines if the renderer requires a custom context for drawing.
|
|
/// If yes the shape layer will perform a custom drawing pass.
|
|
/// If no the shape layer will be a standard CAShapeLayer
|
|
var shouldRenderInContext: Bool { get }
|
|
|
|
/// Passes in the CAShapeLayer to update
|
|
func updateShapeLayer(layer: CAShapeLayer)
|
|
|
|
/// Asks the renderer what the renderable bounds is for the given box.
|
|
func renderBoundsFor(_ boundingBox: CGRect) -> CGRect
|
|
|
|
/// Opportunity for renderers to inject sublayers
|
|
func setupSublayers(layer: CAShapeLayer)
|
|
|
|
/// Renders the shape in a custom context
|
|
func render(_ inContext: CGContext)
|
|
}
|
|
|
|
extension RenderNode where Self: AnimatorNode {
|
|
|
|
var outputNode: NodeOutput {
|
|
renderer
|
|
}
|
|
|
|
}
|
|
|
|
extension Renderable {
|
|
|
|
func renderBoundsFor(_ boundingBox: CGRect) -> CGRect {
|
|
/// Optional
|
|
boundingBox
|
|
}
|
|
|
|
}
|