This commit is contained in:
Isaac
2024-05-18 11:22:53 +04:00
parent 5545bdd978
commit 8b20aea99b
12 changed files with 50 additions and 91 deletions

View File

@@ -7,7 +7,6 @@ namespace lottie {
InvertedMatteLayer::InvertedMatteLayer(std::shared_ptr<CompositionLayer> inputMatte) :
_inputMatte(inputMatte) {
setBounds(inputMatte->bounds());
setNeedsDisplay(true);
addSublayer(_inputMatte);
}

View File

@@ -83,13 +83,15 @@ public:
}
void displayWithFrame(double frame, bool forceUpdates, BezierPathsBoundingBoxContext &boundingBoxContext) {
_transformNode->updateTree(frame, forceUpdates);
bool layerVisible = isInRangeOrEqual(frame, _inFrame, _outFrame);
_contentsLayer->setTransform(_transformNode->globalTransform());
_contentsLayer->setOpacity(_transformNode->opacity());
_contentsLayer->setIsHidden(!layerVisible);
if (_transformNode->updateTree(frame, forceUpdates) || _contentsLayer->isHidden() != !layerVisible) {
_contentsLayer->setTransform(_transformNode->globalTransform());
_contentsLayer->setOpacity(_transformNode->opacity());
_contentsLayer->setIsHidden(!layerVisible);
updateContentsLayerParameters();
}
/// Only update contents if current time is within the layers time bounds.
if (layerVisible) {
@@ -100,6 +102,9 @@ public:
}
}
virtual void updateContentsLayerParameters() {
}
virtual void displayContentsWithFrame(double frame, bool forceUpdates, BezierPathsBoundingBoxContext &boundingBoxContext) {
/// To be overridden by subclass
}
@@ -155,9 +160,6 @@ public:
return nullptr;
}
virtual void updateRenderTree(BezierPathsBoundingBoxContext &boundingBoxContext) {
}
public:
std::shared_ptr<LayerTransformNode> const transformNode() const {
return _transformNode;

View File

@@ -174,39 +174,9 @@ public:
_contentsTreeNode->_subnodes = renderTreeValue;
}
return _renderTreeNode;
}
virtual void updateRenderTree(BezierPathsBoundingBoxContext &boundingBoxContext) override {
if (_matteLayer) {
_matteLayer->updateRenderTree(boundingBoxContext);
}
for (const auto &animationLayer : _animationLayers) {
bool found = false;
for (const auto &sublayer : contentsLayer()->sublayers()) {
if (animationLayer == sublayer) {
found = true;
break;
}
}
if (found) {
animationLayer->updateRenderTree(boundingBoxContext);
}
}
assert(opacity() == 1.0);
assert(!isHidden());
assert(!masksToBounds());
assert(transform().isIdentity());
assert(position() == Vector2D::Zero());
_contentsTreeNode->_bounds = _contentsLayer->bounds();
_contentsTreeNode->_position = _contentsLayer->position();
_contentsTreeNode->_transform = _contentsLayer->transform();
_contentsTreeNode->_alpha = _contentsLayer->opacity();
_contentsTreeNode->_masksToBounds = _contentsLayer->masksToBounds();
_contentsTreeNode->_isHidden = _contentsLayer->isHidden();
_renderTreeNode->_bounds = bounds();
_renderTreeNode->_position = position();
@@ -214,6 +184,14 @@ public:
_renderTreeNode->_alpha = opacity();
_renderTreeNode->_masksToBounds = masksToBounds();
_renderTreeNode->_isHidden = isHidden();
return _renderTreeNode;
}
virtual void updateContentsLayerParameters() override {
_contentsTreeNode->_transform = _contentsLayer->transform();
_contentsTreeNode->_alpha = _contentsLayer->opacity();
_contentsTreeNode->_isHidden = _contentsLayer->isHidden();
}
private:

View File

@@ -1388,27 +1388,22 @@ std::shared_ptr<RenderTreeNode> ShapeCompositionLayer::renderTreeNode(BezierPath
);
}
return _renderTreeNode;
}
void ShapeCompositionLayer::updateRenderTree(BezierPathsBoundingBoxContext &boundingBoxContext) {
if (_matteLayer) {
_matteLayer->updateRenderTree(boundingBoxContext);
}
_contentRenderTreeNode->_bounds = _contentsLayer->bounds();
_contentRenderTreeNode->_position = _contentsLayer->position();
_contentRenderTreeNode->_transform = _contentsLayer->transform();
_contentRenderTreeNode->_alpha = _contentsLayer->opacity();
_contentRenderTreeNode->_masksToBounds = _contentsLayer->masksToBounds();
_contentRenderTreeNode->_isHidden = _contentsLayer->isHidden();
_renderTreeNode->_masksToBounds = masksToBounds();
_renderTreeNode->_bounds = bounds();
_renderTreeNode->_position = position();
_renderTreeNode->_transform = transform();
_renderTreeNode->_alpha = opacity();
_renderTreeNode->_masksToBounds = masksToBounds();
_renderTreeNode->_isHidden = isHidden();
return _renderTreeNode;
}
void ShapeCompositionLayer::updateContentsLayerParameters() {
_contentRenderTreeNode->_transform = _contentsLayer->transform();
_contentRenderTreeNode->_alpha = _contentsLayer->opacity();
_contentRenderTreeNode->_isHidden = _contentsLayer->isHidden();
}
}

View File

@@ -18,7 +18,8 @@ public:
virtual void displayContentsWithFrame(double frame, bool forceUpdates, BezierPathsBoundingBoxContext &boundingBoxContext) override;
virtual std::shared_ptr<RenderTreeNode> renderTreeNode(BezierPathsBoundingBoxContext &boundingBoxContext) override;
virtual void updateRenderTree(BezierPathsBoundingBoxContext &boundingBoxContext) override;
void initializeContentsLayerParameters();
virtual void updateContentsLayerParameters() override;
private:
std::shared_ptr<ShapeLayerPresentationTree> _contentTree;

View File

@@ -90,7 +90,7 @@ public:
_layerFontProvider->addTextLayers(textLayers);
_layerFontProvider->reloadTexts();
setNeedsDisplay(true);
renderTreeNode();
}
void setRespectAnimationFrameRate(bool respectAnimationFrameRate) {
@@ -249,26 +249,9 @@ public:
);
}
updateRenderTree();
return _renderTreeNode;
}
void updateRenderTree() {
for (const auto &animationLayer : _animationLayers) {
bool found = false;
for (const auto &sublayer : sublayers()) {
if (animationLayer == sublayer) {
found = true;
break;
}
}
if (found) {
animationLayer->updateRenderTree(_boundingBoxContext);
}
}
}
private:
// MARK: Internal

View File

@@ -185,9 +185,12 @@ public:
return localUpdatesPermeateDownstream() ? hasUpstreamUpdates() || hasLocalUpdates() : hasUpstreamUpdates();
}
virtual void updateTree(double frame, bool forceUpdates) {
updateContents(frame, forceUpdates);
updateOutputs(frame, forceUpdates);
bool updateTree(double frame, bool forceUpdates) {
if (updateContents(frame, forceUpdates)) {
return updateOutputs(frame, forceUpdates);
} else {
return false;
}
}
/// The name of the Keypath

View File

@@ -45,13 +45,6 @@ public:
}
}
bool needsDisplay() const {
return _needsDisplay;
}
void setNeedsDisplay(bool needsDisplay) {
_needsDisplay = true;
}
virtual bool implementsDraw() const {
return false;
}
@@ -148,7 +141,6 @@ private:
private:
CALayer *_superlayer = nullptr;
std::vector<std::shared_ptr<CALayer>> _sublayers;
bool _needsDisplay = false;
bool _isHidden = false;
float _opacity = 1.0;
Vector2D _position = Vector2D(0.0, 0.0);