void visit(LOTData *obj)
{
switch (obj->type()) {
- case LOTData::Type::Repeater:
case LOTData::Type::ShapeGroup:
case LOTData::Type::Layer: {
visitChildren(static_cast<LOTGroupData *>(obj));
}
};
+class LottieUpdateStatVisitor {
+ LOTModelStat *stat;
+public:
+ explicit LottieUpdateStatVisitor(LOTModelStat *s):stat(s){}
+ void visitChildren(LOTGroupData *obj)
+ {
+ for (const auto &child : obj->mChildren) {
+ if (child) visit(child.get());
+ }
+ }
+ void visitLayer(LOTLayerData *layer)
+ {
+ switch (layer->mLayerType) {
+ case LayerType::Precomp:
+ stat->precompLayerCount++;
+ break;
+ case LayerType::Null:
+ stat->nullLayerCount++;
+ break;
+ case LayerType::Shape:
+ stat->shapeLayerCount++;
+ break;
+ case LayerType::Solid:
+ stat->solidLayerCount++;
+ break;
+ case LayerType::Image:
+ stat->imageLayerCount++;
+ break;
+ default:
+ break;
+ }
+ visitChildren(layer);
+ }
+ void visit(LOTData *obj)
+ {
+ switch (obj->type()) {
+ case LOTData::Type::Layer: {
+ visitLayer(static_cast<LOTLayerData *>(obj));
+ break;
+ }
+ case LOTData::Type::Repeater: {
+ visitChildren(static_cast<LOTRepeaterData *>(obj)->content());
+ break;
+ }
+ case LOTData::Type::ShapeGroup: {
+ visitChildren(static_cast<LOTGroupData *>(obj));
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+};
+
void LOTCompositionData::processRepeaterObjects()
{
LottieRepeaterProcesser visitor;
visitor.visit(mRootLayer.get());
}
+void LOTCompositionData::updateStats()
+{
+ LottieUpdateStatVisitor visitor(&mStats);
+ visitor.visit(mRootLayer.get());
+}
+
VMatrix LOTRepeaterTransform::matrix(int frameNo, float multiplier) const
{
VPointF scale = mScale.value(frameNo) / 100.f;
class LOTPolystarData;
class LOTMaskData;
+struct LOTModelStat
+{
+ uint16_t precompLayerCount{0};
+ uint16_t solidLayerCount{0};
+ uint16_t shapeLayerCount{0};
+ uint16_t imageLayerCount{0};
+ uint16_t nullLayerCount{0};
+
+};
+
enum class MatteType: uchar
{
None = 0,
mData._hidden = false;
}
~LOTData() { if (!shortString() && mPtr) free(mPtr); }
+ LOTData(const LOTData&) = delete;
+ LOTData& operator =(const LOTData&) = delete;
void setStatic(bool value) { mData._static = value;}
bool isStatic() const {return mData._static;}
void setShortString(bool value) {mData._shortString = value;}
bool shortString() const {return mData._shortString;}
struct Data{
- char _buffer[14];
+ char _buffer[maxShortStringLength];
LOTData::Type _type;
bool _static : 1;
bool _hidden : 1;
long endFrame() const {return mEndFrame;}
VSize size() const {return mSize;}
void processRepeaterObjects();
+ void updateStats();
public:
std::string mVersion;
VSize mSize;
std::shared_ptr<LOTAsset>> mAssets;
std::vector<LayerInfo> mLayerInfoList;
-
+ LOTModelStat mStats;
};
/**