float parentAlpha, const DirtyFlag &/*flag*/)
{
mRenderNodeUpdate = true;
- updateContent(frameNo, parentMatrix, parentAlpha);
+ mContentToRender = updateContent(frameNo, parentMatrix, parentAlpha);
}
void LOTPaintDataItem::updateRenderNode()
}
}
- if (dirty) {
+ if (dirty || mPath.empty()) {
mPath.reset();
for (auto &i : mPathItems) {
void LOTPaintDataItem::renderList(std::vector<VDrawable *> &list)
{
+ if (!mContentToRender) return;
+
if (mRenderNodeUpdate) {
updateRenderNode();
mRenderNodeUpdate = false;
{
}
-void LOTFillItem::updateContent(int frameNo, const VMatrix &, float alpha)
+bool LOTFillItem::updateContent(int frameNo, const VMatrix &, float alpha)
{
- auto color = mModel.color(frameNo).toColor(mModel.opacity(frameNo));
- color.setAlpha(uchar(color.a * alpha));
+ auto combinedAlpha = alpha * mModel.opacity(frameNo);
+ auto color = mModel.color(frameNo).toColor(combinedAlpha);
+
+ if (color.isTransparent()) return false;
+
VBrush brush(color);
mDrawable.setBrush(brush);
mDrawable.setFillRule(mModel.fillRule());
+
+ return true;
}
LOTGFillItem::LOTGFillItem(LOTGFillData *data)
{
}
-void LOTGFillItem::updateContent(int frameNo, const VMatrix &matrix, float alpha)
+bool LOTGFillItem::updateContent(int frameNo, const VMatrix &matrix, float alpha)
{
+ float combinedAlpha = alpha * mData->opacity(frameNo);
+ if (vIsZero(combinedAlpha)) return false;
+
mData->update(mGradient, frameNo);
- mGradient->setAlpha(mData->opacity(frameNo) * alpha);
+ mGradient->setAlpha(combinedAlpha);
mGradient->mMatrix = matrix;
mDrawable.setBrush(VBrush(mGradient.get()));
mDrawable.setFillRule(mData->fillRule());
+
+ return true;
}
LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data)
static thread_local std::vector<float> Dash_Vector;
-void LOTStrokeItem::updateContent(int frameNo, const VMatrix &matrix, float alpha)
+bool LOTStrokeItem::updateContent(int frameNo, const VMatrix &matrix, float alpha)
{
- VColor color = mModel.color(frameNo).toColor(mModel.opacity(frameNo));;
- color.setAlpha(uchar(color.a * alpha));
+ auto combinedAlpha = alpha * mModel.opacity(frameNo);
+ auto color = mModel.color(frameNo).toColor(combinedAlpha);
+
+ if (color.isTransparent()) return false;
+
VBrush brush(color);
mDrawable.setBrush(brush);
float scale = matrix.scale();
mDrawable.setDashInfo(Dash_Vector);
}
}
+
+ return true;
}
LOTGStrokeItem::LOTGStrokeItem(LOTGStrokeData *data)
: LOTPaintDataItem(data->isStatic()), mData(data){}
-void LOTGStrokeItem::updateContent(int frameNo, const VMatrix &matrix, float alpha)
+bool LOTGStrokeItem::updateContent(int frameNo, const VMatrix &matrix, float alpha)
{
+ float combinedAlpha = alpha * mData->opacity(frameNo);
+ if (vIsZero(combinedAlpha)) return false;
+
mData->update(mGradient, frameNo);
- mGradient->setAlpha(mData->opacity(frameNo) * alpha);
+ mGradient->setAlpha(combinedAlpha);
mGradient->mMatrix = matrix;
auto scale = mGradient->mMatrix.scale();
mDrawable.setBrush(VBrush(mGradient.get()));
mDrawable.setDashInfo(Dash_Vector);
}
}
+
+ return true;
}
LOTTrimItem::LOTTrimItem(LOTTrimData *data)
void renderList(std::vector<VDrawable *> &list) final;
ContentType type() const final {return ContentType::Paint;}
protected:
- virtual void updateContent(int frameNo, const VMatrix &matrix, float alpha) = 0;
+ virtual bool updateContent(int frameNo, const VMatrix &matrix, float alpha) = 0;
private:
void updateRenderNode();
protected:
DirtyFlag mFlag;
bool mStaticContent;
bool mRenderNodeUpdate{true};
+ bool mContentToRender{true};
};
class LOTFillItem : public LOTPaintDataItem
public:
explicit LOTFillItem(LOTFillData *data);
protected:
- void updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
+ bool updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) final;
private:
LOTProxyModel<LOTFillData> mModel;
public:
explicit LOTGFillItem(LOTGFillData *data);
protected:
- void updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
+ bool updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
private:
LOTGFillData *mData;
std::unique_ptr<VGradient> mGradient;
public:
explicit LOTStrokeItem(LOTStrokeData *data);
protected:
- void updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
+ bool updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) final;
private:
LOTProxyModel<LOTStrokeData> mModel;
public:
explicit LOTGStrokeItem(LOTGStrokeData *data);
protected:
- void updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
+ bool updateContent(int frameNo, const VMatrix &matrix, float alpha) final;
private:
LOTGStrokeData *mData;
std::unique_ptr<VGradient> mGradient;