for (auto &i : data->mChildren) {
auto content = LOTShapeLayerItem::createContentItem(i.get());
- if (content) mContents.push_back(std::move(content));
+ if (content) {
+ content->setParent(this);
+ mContents.push_back(std::move(content));
+ }
}
}
}
}
+ mMatrix = m;
+
for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) {
(*i)->update(frameNo, m, alpha, newFlag);
}
}
}
-void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix,
+void LOTPathDataItem::update(int frameNo, const VMatrix &,
float, const DirtyFlag &flag)
{
mPathChanged = false;
// 3. compute the final path with parentMatrix
if ((flag & DirtyFlagBit::Matrix) || mPathChanged) {
- mMatrix = parentMatrix;
mPathChanged = true;
}
}
{
if (mPathChanged || mNeedUpdate) {
mFinalPath.clone(mTemp);
- mFinalPath.transform(mMatrix);
+ mFinalPath.transform(static_cast<LOTContentGroupItem *>(parent())->matrix());
mNeedUpdate = false;
}
return mFinalPath;
{
mRenderNodeUpdate = true;
mParentAlpha = parentAlpha;
- mParentMatrix = parentMatrix;
mFlag = flag;
mFrameNo = frameNo;
void LOTGFillItem::updateContent(int frameNo)
{
mData->update(mGradient, frameNo);
- mGradient->mMatrix = mParentMatrix;
+ mGradient->mMatrix = static_cast<LOTContentGroupItem *>(parent())->matrix();
mFillRule = mData->fillRule();
}
color.setAlpha(color.a * parentAlpha());
VBrush brush(color);
mDrawable->setBrush(brush);
- float scale = getScale(mParentMatrix);
+ float scale = getScale(static_cast<LOTContentGroupItem *>(parent())->matrix());
mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit,
mWidth * scale);
if (mDashArraySize) {
void LOTGStrokeItem::updateContent(int frameNo)
{
mData->update(mGradient, frameNo);
- mGradient->mMatrix = mParentMatrix;
+ mGradient->mMatrix = static_cast<LOTContentGroupItem *>(parent())->matrix();
mCap = mData->capStyle();
mJoin = mData->joinStyle();
mMiterLimit = mData->meterLimit();
void LOTGStrokeItem::updateRenderNode()
{
- float scale = getScale(mParentMatrix);
+ float scale = getScale(mGradient->mMatrix);
mDrawable->setBrush(VBrush(mGradient.get()));
mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit,
mWidth * scale);
virtual ~LOTContentItem(){}
virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0;
virtual void renderList(std::vector<VDrawable *> &){}
+ void setParent(LOTContentItem *parent) {mParent = parent;}
+ LOTContentItem *parent() const {return mParent;}
+private:
+ LOTContentItem *mParent{nullptr};
};
class LOTContentGroupItem: public LOTContentItem
void processTrimItems(std::vector<LOTPathDataItem *> &list);
void processPaintItems(std::vector<LOTPathDataItem *> &list);
void renderList(std::vector<VDrawable *> &list) final;
+ const VMatrix & matrix() const { return mMatrix;}
private:
LOTShapeGroupData *mData;
std::vector<std::unique_ptr<LOTContentItem>> mContents;
+ VMatrix mMatrix;
};
class LOTPathDataItem : public LOTContentItem
const VPath &finalPath();
void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true; mNeedUpdate = true;}
bool staticPath() const { return mStaticPath; }
+protected:
+ virtual void updatePath(VPath& path, int frameNo) = 0;
+ virtual bool hasChanged(int frameNo) = 0;
private:
- bool mStaticPath;
VPath mLocalPath;
VPath mTemp;
VPath mFinalPath;
- VMatrix mMatrix;
bool mPathChanged{true};
bool mNeedUpdate{true};
-protected:
- virtual void updatePath(VPath& path, int frameNo) = 0;
- virtual bool hasChanged(int frameNo) = 0;
+ bool mStaticPath;
};
class LOTRectItem: public LOTPathDataItem
struct Cache {
int mFrameNo{-1};
+ float mRoundness;
VPointF mPos;
VPointF mSize;
- float mRoundness;
};
Cache mCache;
inline float parentAlpha() const {return mParentAlpha;}
public:
float mParentAlpha;
- VMatrix mParentMatrix;
VPath mPath;
DirtyFlag mFlag;
int mFrameNo;