diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index 5a9ec7b3..e51e59c8 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -384,7 +384,7 @@ void LottieParser::parseKeyFrame(T& prop) Point inTangent, outTangent; const char* interpolatorKey = nullptr; auto& frame = prop.newFrame(); - bool interpolator = false; + auto interpolator = false; enterObject(); @@ -415,6 +415,8 @@ void LottieParser::parseKeyFrame(T& prop) getValue(frame2.value); } else if (parseTangent(key, frame)) { continue; + } else if (!strcmp(key, "h")) { + frame.hold = getInt(); } else skip(key); } diff --git a/src/loaders/lottie/tvgLottieProperty.h b/src/loaders/lottie/tvgLottieProperty.h index 7ada17f0..06203f2a 100644 --- a/src/loaders/lottie/tvgLottieProperty.h +++ b/src/loaders/lottie/tvgLottieProperty.h @@ -94,11 +94,17 @@ struct LottieScalarFrame T value; //keyframe value int32_t no; //frame number LottieInterpolator* interpolator; + bool hold = false; //do not interpolate. T interpolate(LottieScalarFrame* next, int32_t frameNo) { auto t = float(frameNo - no) / float(next->no - no); if (interpolator) t = interpolator->progress(t); + + if (hold) { + if (t < 1.0f) return value; + else return next->value; + } return mathLerp(value, next->value, t); } }; @@ -113,12 +119,18 @@ struct LottieVectorFrame T outTangent, inTangent; float length; bool hasTangent = false; + bool hold = false; T interpolate(LottieVectorFrame* next, int32_t frameNo) { auto t = float(frameNo - no) / float(next->no - no); if (interpolator) t = interpolator->progress(t); + if (hold) { + if (t < 1.0f) return value; + else return next->value; + } + if (hasTangent) { Bezier bz = {value, value + outTangent, next->value + inTangent, next->value}; t = bezAt(bz, t * length, length);