rlottie: Update DirtyMatrix only when needed.

This commit is contained in:
subhransu mohanty 2019-06-26 10:53:44 +09:00 committed by Subhransu
parent 88593df18d
commit 75f9d3ff29

View File

@ -467,18 +467,20 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix,
m *= parentMatrix; m *= parentMatrix;
// 3. update the dirty flag based on the change // 3. update the dirty flag based on the change
if (!mCombinedMatrix.fuzzyCompare(m)) { if (mCombinedMatrix != m) {
mDirtyFlag |= DirtyFlagBit::Matrix; mDirtyFlag |= DirtyFlagBit::Matrix;
mCombinedMatrix = m;
} }
if (!vCompare(mCombinedAlpha, alpha)) { if (!vCompare(mCombinedAlpha, alpha)) {
mDirtyFlag |= DirtyFlagBit::Alpha; mDirtyFlag |= DirtyFlagBit::Alpha;
}
mCombinedMatrix = m;
mCombinedAlpha = alpha; mCombinedAlpha = alpha;
}
// 4. update the mask // 4. update the mask
if (mLayerMask) { if (mLayerMask) {
mLayerMask->update(frameNo(), m, alpha, mDirtyFlag); mLayerMask->update(frameNo(), mCombinedMatrix, mCombinedAlpha,
mDirtyFlag);
} }
// 5. if no parent property change and layer is static then nothing to do. // 5. if no parent property change and layer is static then nothing to do.
@ -1034,28 +1036,30 @@ void LOTContentGroupItem::addChildren(LOTGroupData *data)
void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix,
float parentAlpha, const DirtyFlag &flag) float parentAlpha, const DirtyFlag &flag)
{ {
VMatrix m = parentMatrix;
float alpha = parentAlpha; float alpha = parentAlpha;
DirtyFlag newFlag = flag; DirtyFlag newFlag = flag;
if (mData && mData->mTransform) { if (mData && mData->mTransform) {
// update the matrix and the flag VMatrix m = mData->mTransform->matrix(frameNo);
if ((flag & DirtyFlagBit::Matrix) || !mData->mTransform->isStatic()) {
newFlag |= DirtyFlagBit::Matrix;
}
m = mData->mTransform->matrix(frameNo);
m *= parentMatrix; m *= parentMatrix;
alpha *= mData->mTransform->opacity(frameNo);
if (!vCompare(alpha, parentAlpha)) { if (!(flag & DirtyFlagBit::Matrix) && !mData->mTransform->isStatic() &&
newFlag |= DirtyFlagBit::Alpha; (m != mMatrix)) {
} newFlag |= DirtyFlagBit::Matrix;
} }
mMatrix = m; mMatrix = m;
alpha *= mData->mTransform->opacity(frameNo);
if (!vCompare(alpha, parentAlpha)) {
newFlag |= DirtyFlagBit::Alpha;
}
} else {
mMatrix = parentMatrix;
}
for (const auto &content : mContents) { for (const auto &content : mContents) {
content->update(frameNo, m, alpha, newFlag); content->update(frameNo, matrix(), alpha, newFlag);
} }
} }