return rlottie::Color(1, 0, 0);
}
});
+ view8->player()->setValue<rlottie::Property::TrimEnd>("Shape Layer 2.Trim Paths 1",
+ [](const rlottie::FrameInfo& info) {
+ return rlottie::Point(0, 30);
+ });
}
view8->setPos(2100, 0);
view8->setSize(300, 300);
TrPosition, /*!< Transform Position property of Layer and Group object , value type is rlottie::Point */
TrScale, /*!< Transform Scale property of Layer and Group object , value type is rlottie::Size. range[0 ..100] */
TrRotation, /*!< Transform Rotation property of Layer and Group object , value type is float. range[0 .. 360] in degrees*/
- TrOpacity /*!< Transform Opacity property of Layer and Group object , value type is float [ 0 .. 100] */
+ TrOpacity, /*!< Transform Opacity property of Layer and Group object , value type is float [ 0 .. 100] */
+ TrimStart, /*!< Trim Start property of Shape object , value type is float [ 0 .. 100] */
+ TrimEnd /*!< Trim End property of Shape object , value type is rlottie::Point [ 0 .. 100] */
};
struct Color_Type{};
template<> struct MapType<std::integral_constant<Property, Property::TrAnchor>>: Point_Type{};
template<> struct MapType<std::integral_constant<Property, Property::TrPosition>>: Point_Type{};
template<> struct MapType<std::integral_constant<Property, Property::TrScale>>: Size_Type{};
-
-
+template<> struct MapType<std::integral_constant<Property, Property::TrimStart>>: Float_Type{};
+template<> struct MapType<std::integral_constant<Property, Property::TrimEnd>>: Point_Type{};
} // namespace lotplayer
#endif // _RLOTTIE_H_
LOTTIE_ANIMATION_PROPERTY_TR_POSITION, /*!< Transform Position property of Layer and Group object , value type is int */
LOTTIE_ANIMATION_PROPERTY_TR_SCALE, /*!< Transform Scale property of Layer and Group object , value type is float range[0 ..100] */
LOTTIE_ANIMATION_PROPERTY_TR_ROTATION, /*!< Transform Scale property of Layer and Group object , value type is float. range[0 .. 360] in degrees*/
- LOTTIE_ANIMATION_PROPERTY_TR_OPACITY /*!< Transform Opacity property of Layer and Group object , value type is float [ 0 .. 100] */
+ LOTTIE_ANIMATION_PROPERTY_TR_OPACITY, /*!< Transform Opacity property of Layer and Group object , value type is float [ 0 .. 100] */
+ LOTTIE_ANIMATION_PROPERTY_TRIM_PATH_START, /*!< Trim Path Start property of Shape object , value type is float [0 .. 100] */
+ LOTTIE_ANIMATION_PROPERTY_TRIM_PATH_END /*!< Trim Path End property of Shape object , value type is float [0 .. 100] */
}Lottie_Animation_Property;
typedef struct Lottie_Animation_S Lottie_Animation;
case LOTTIE_ANIMATION_PROPERTY_STROKEOPACITY:
case LOTTIE_ANIMATION_PROPERTY_STROKEWIDTH:
case LOTTIE_ANIMATION_PROPERTY_TR_ROTATION:
+ case LOTTIE_ANIMATION_PROPERTY_TRIM_PATH_START:
return 1;
case LOTTIE_ANIMATION_PROPERTY_TR_POSITION:
case LOTTIE_ANIMATION_PROPERTY_TR_SCALE:
+ case LOTTIE_ANIMATION_PROPERTY_TRIM_PATH_END:
return 2;
default:
return 0;
animation->mAnimation->setValue<rlottie::Property::TrRotation>(keypath, (float)r);
break;
}
+ case LOTTIE_ANIMATION_PROPERTY_TRIM_PATH_START: {
+ double start = v[0];
+ if (start < 0 || start > 100) break;
+ animation->mAnimation->setValue<rlottie::Property::TrimStart>(keypath, (float)start);
+ break;
+ }
+ case LOTTIE_ANIMATION_PROPERTY_TRIM_PATH_END: {
+ double start = v[0];
+ double end = v[1];
+ if (start < 0 || start > 100 || end < 0 || end > 100) break;
+ animation->mAnimation->setValue<rlottie::Property::TrimEnd>(keypath, rlottie::Point((float)start, (float)end));
+ break;
+ }
case LOTTIE_ANIMATION_PROPERTY_TR_ANCHOR:
case LOTTIE_ANIMATION_PROPERTY_TR_OPACITY:
//@TODO handle propery update.
}
};
+template <>
+class Filter<model::Trim>: public FilterBase<model::Trim>
+{
+public:
+ Filter(model::Trim* model) : FilterBase<model::Trim>(model) {}
+
+ model::Trim::Segment segment(int frameNo) const
+ {
+ if (this->hasFilter(rlottie::Property::TrimStart)) {
+ this->model_->updateTrimStartValue(this->filter()->value(rlottie::Property::TrimStart, frameNo));
+ }
+ if (this->hasFilter(rlottie::Property::TrimEnd)) {
+ this->model_->updateTrimEndValue(this->filter()->point(rlottie::Property::TrimEnd, frameNo));
+ }
+ model::Trim::Segment segment = this->model()->segment(frameNo);
+ return segment;
+ }
+};
+
} // namespace model
}
}
+static bool trimProp(rlottie::Property prop)
+{
+ switch (prop) {
+ case rlottie::Property::TrimStart:
+ case rlottie::Property::TrimEnd:
+ return true;
+ default:
+ return false;
+ }
+}
+
static renderer::Layer *createLayerItem(model::Layer *layerData,
VArenaAlloc * allocator)
{
return !vIsZero(combinedAlpha);
}
+bool renderer::Trim::resolveKeyPath(LOTKeyPath &keyPath, uint32_t depth,
+ LOTVariant &value)
+{
+ if (!keyPath.matches(mModel.name(), depth)) {
+ return false;
+ }
+
+ if (keyPath.fullyResolvesTo(mModel.name(), depth) &&
+ trimProp(value.property())) {
+ mModel.filter()->addValue(value);
+ return true;
+ }
+ return false;
+}
+
void renderer::Trim::update(int frameNo, const VMatrix & /*parentMatrix*/,
float /*parentAlpha*/, const DirtyFlag & /*flag*/)
{
if (mCache.mFrameNo == frameNo) return;
- model::Trim::Segment segment = mData->segment(frameNo);
+ model::Trim::Segment segment = mModel.segment(frameNo);
if (!(vCompare(mCache.mSegment.start, segment.start) &&
vCompare(mCache.mSegment.end, segment.end))) {
class Trim final : public Object {
public:
- explicit Trim(model::Trim *data) : mData(data) {}
+ explicit Trim(model::Trim *data) : mData(data), mModel(data) {}
void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha,
const DirtyFlag &flag) final;
Object::Type type() const final { return Object::Type::Trim; }
void update();
void addPathItems(std::vector<Shape *> &list, size_t startOffset);
+protected:
+ bool resolveKeyPath(LOTKeyPath &keyPath, uint32_t depth,
+ LOTVariant &value) final;
private:
bool pathDirty() const
{
model::Trim * mData{nullptr};
VPathMesure mPathMesure;
bool mDirty{true};
+
+ model::Filter<model::Trim> mModel;
};
class Repeater final : public Group {
};
enum class TrimType { Simultaneously, Individually };
Trim() : Object(Object::Type::Trim) {}
+
+ void updateTrimStartValue(float start)
+ {
+ mStart.value() = start;
+ }
+
+ void updateTrimEndValue(VPointF pos)
+ {
+ for (auto &keyFrame : mEnd.animation().frames_) {
+ keyFrame.value_.start_ = pos.x();
+ keyFrame.value_.end_ = pos.y();
+ }
+ }
+
/*
* if start > end vector trims the path as a loop ( 2 segment)
* if start < end vector trims the path without loop ( 1 segment).