void renderer::Mask::update(int frameNo, const VMatrix &parentMatrix,
float /*parentAlpha*/, const DirtyFlag &flag)
{
+ bool dirtyPath = false;
+
if (flag.testFlag(DirtyFlagBit::None) && mData->isStatic()) return;
if (mData->mShape.isStatic()) {
if (mLocalPath.empty()) {
+ dirtyPath = true;
mData->mShape.value(frameNo, mLocalPath);
}
} else {
+ dirtyPath = true;
mData->mShape.value(frameNo, mLocalPath);
}
/* mask item dosen't inherit opacity */
mCombinedAlpha = mData->opacity(frameNo);
- mFinalPath.clone(mLocalPath);
- mFinalPath.transform(parentMatrix);
-
- mRasterRequest = true;
+ if ( flag.testFlag(DirtyFlagBit::Matrix) || dirtyPath ) {
+ mFinalPath.clone(mLocalPath);
+ mFinalPath.transform(parentMatrix);
+ mRasterRequest = true;
+ }
}
VRle renderer::Mask::rle()
{
- if (mRasterRequest) {
- mRasterRequest = false;
- if (!vCompare(mCombinedAlpha, 1.0f))
- mRasterizer.rle() *= uchar(mCombinedAlpha * 255);
+ if (!vCompare(mCombinedAlpha, 1.0f)) {
+ VRle obj = mRasterizer.rle();
+ obj *= uchar(mCombinedAlpha * 255);
+ return obj;
+ } else {
+ return mRasterizer.rle();
}
- return mRasterizer.rle();
}
void renderer::Mask::preprocess(const VRect &clip)