mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-09 14:13:43 +00:00
lottie/expressions: revised exception handlings
This commit is contained in:
parent
33d7425294
commit
f7221f7f89
4 changed files with 11 additions and 24 deletions
|
@ -1326,7 +1326,7 @@ jerry_value_t LottieExpressions::evaluate(float frameNo, LottieExpression* exp)
|
||||||
auto eval = jerry_eval((jerry_char_t *) exp->code, strlen(exp->code), JERRY_PARSE_NO_OPTS);
|
auto eval = jerry_eval((jerry_char_t *) exp->code, strlen(exp->code), JERRY_PARSE_NO_OPTS);
|
||||||
|
|
||||||
if (jerry_value_is_exception(eval) || jerry_value_is_undefined(eval)) {
|
if (jerry_value_is_exception(eval) || jerry_value_is_undefined(eval)) {
|
||||||
exp->enabled = false; // The feature is experimental, it will be forcefully turned off if it's incompatible.
|
TVGERR("LOTTIE", "Failed to dispatch the expressions!");
|
||||||
return jerry_undefined();
|
return jerry_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,12 @@ public:
|
||||||
bool result(float frameNo, NumType& out, LottieExpression* exp)
|
bool result(float frameNo, NumType& out, LottieExpression* exp)
|
||||||
{
|
{
|
||||||
auto bm_rt = evaluate(frameNo, exp);
|
auto bm_rt = evaluate(frameNo, exp);
|
||||||
|
if (jerry_value_is_undefined(bm_rt)) return false;
|
||||||
|
|
||||||
if (jerry_value_is_number(bm_rt)) {
|
if (jerry_value_is_number(bm_rt)) {
|
||||||
out = (NumType) jerry_value_as_number(bm_rt);
|
out = (NumType) jerry_value_as_number(bm_rt);
|
||||||
} else if (auto prop = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
} else if (auto prop = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
||||||
out = (*prop)(frameNo);
|
out = (*prop)(frameNo);
|
||||||
} else {
|
|
||||||
TVGERR("LOTTIE", "Failed dispatching a Value!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
jerry_value_free(bm_rt);
|
jerry_value_free(bm_rt);
|
||||||
return true;
|
return true;
|
||||||
|
@ -59,6 +57,7 @@ public:
|
||||||
bool result(float frameNo, Point& out, LottieExpression* exp)
|
bool result(float frameNo, Point& out, LottieExpression* exp)
|
||||||
{
|
{
|
||||||
auto bm_rt = evaluate(frameNo, exp);
|
auto bm_rt = evaluate(frameNo, exp);
|
||||||
|
if (jerry_value_is_undefined(bm_rt)) return false;
|
||||||
|
|
||||||
if (jerry_value_is_object(bm_rt)) {
|
if (jerry_value_is_object(bm_rt)) {
|
||||||
if (auto prop = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
if (auto prop = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
||||||
|
@ -71,9 +70,6 @@ public:
|
||||||
jerry_value_free(x);
|
jerry_value_free(x);
|
||||||
jerry_value_free(y);
|
jerry_value_free(y);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
TVGERR("LOTTIE", "Failed dispatching Point!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
jerry_value_free(bm_rt);
|
jerry_value_free(bm_rt);
|
||||||
return true;
|
return true;
|
||||||
|
@ -83,12 +79,10 @@ public:
|
||||||
bool result(float frameNo, RGB24& out, LottieExpression* exp)
|
bool result(float frameNo, RGB24& out, LottieExpression* exp)
|
||||||
{
|
{
|
||||||
auto bm_rt = evaluate(frameNo, exp);
|
auto bm_rt = evaluate(frameNo, exp);
|
||||||
|
if (jerry_value_is_undefined(bm_rt)) return false;
|
||||||
|
|
||||||
if (auto color = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
if (auto color = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
||||||
out = (*color)(frameNo);
|
out = (*color)(frameNo);
|
||||||
} else {
|
|
||||||
TVGERR("LOTTIE", "Failed dispatching Color!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
jerry_value_free(bm_rt);
|
jerry_value_free(bm_rt);
|
||||||
return true;
|
return true;
|
||||||
|
@ -98,12 +92,10 @@ public:
|
||||||
bool result(float frameNo, Fill* fill, LottieExpression* exp)
|
bool result(float frameNo, Fill* fill, LottieExpression* exp)
|
||||||
{
|
{
|
||||||
auto bm_rt = evaluate(frameNo, exp);
|
auto bm_rt = evaluate(frameNo, exp);
|
||||||
|
if (jerry_value_is_undefined(bm_rt)) return false;
|
||||||
|
|
||||||
if (auto colorStop = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
if (auto colorStop = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
||||||
(*colorStop)(frameNo, fill, this);
|
(*colorStop)(frameNo, fill, this);
|
||||||
} else {
|
|
||||||
TVGERR("LOTTIE", "Failed dispatching ColorStop!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
jerry_value_free(bm_rt);
|
jerry_value_free(bm_rt);
|
||||||
return true;
|
return true;
|
||||||
|
@ -113,12 +105,10 @@ public:
|
||||||
bool result(float frameNo, Array<PathCommand>& cmds, Array<Point>& pts, Matrix* transform, float roundness, LottieExpression* exp)
|
bool result(float frameNo, Array<PathCommand>& cmds, Array<Point>& pts, Matrix* transform, float roundness, LottieExpression* exp)
|
||||||
{
|
{
|
||||||
auto bm_rt = evaluate(frameNo, exp);
|
auto bm_rt = evaluate(frameNo, exp);
|
||||||
|
if (jerry_value_is_undefined(bm_rt)) return false;
|
||||||
|
|
||||||
if (auto pathset = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
if (auto pathset = static_cast<Property*>(jerry_object_get_native_ptr(bm_rt, nullptr))) {
|
||||||
(*pathset)(frameNo, cmds, pts, transform, roundness);
|
(*pathset)(frameNo, cmds, pts, transform, roundness);
|
||||||
} else {
|
|
||||||
TVGERR("LOTTIE", "Failed dispatching PathSet!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
jerry_value_free(bm_rt);
|
jerry_value_free(bm_rt);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -44,7 +44,6 @@ static LottieExpression* _expression(char* code, LottieComposition* comp, Lottie
|
||||||
inst->layer = layer;
|
inst->layer = layer;
|
||||||
inst->object = object;
|
inst->object = object;
|
||||||
inst->property = property;
|
inst->property = property;
|
||||||
inst->enabled = true;
|
|
||||||
|
|
||||||
return inst;
|
return inst;
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,8 +199,6 @@ struct LottieExpression
|
||||||
LottieObject* object;
|
LottieObject* object;
|
||||||
LottieProperty* property;
|
LottieProperty* property;
|
||||||
|
|
||||||
bool enabled;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t key = 0; //the keyframe number repeating to
|
uint32_t key = 0; //the keyframe number repeating to
|
||||||
float in = FLT_MAX; //looping duration in frame number
|
float in = FLT_MAX; //looping duration in frame number
|
||||||
|
@ -460,7 +458,7 @@ struct LottieGenericProperty : LottieProperty
|
||||||
|
|
||||||
T operator()(float frameNo, LottieExpressions* exps)
|
T operator()(float frameNo, LottieExpressions* exps)
|
||||||
{
|
{
|
||||||
if (exps && (exp && exp->enabled)) {
|
if (exps && exp) {
|
||||||
T out{};
|
T out{};
|
||||||
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
||||||
if (exps->result<LottieGenericProperty<T>>(frameNo, out, exp)) return out;
|
if (exps->result<LottieGenericProperty<T>>(frameNo, out, exp)) return out;
|
||||||
|
@ -605,7 +603,7 @@ struct LottiePathSet : LottieProperty
|
||||||
|
|
||||||
bool operator()(float frameNo, Array<PathCommand>& cmds, Array<Point>& pts, Matrix* transform, float roundness, LottieExpressions* exps)
|
bool operator()(float frameNo, Array<PathCommand>& cmds, Array<Point>& pts, Matrix* transform, float roundness, LottieExpressions* exps)
|
||||||
{
|
{
|
||||||
if (exps && (exp && exp->enabled)) {
|
if (exps && exp) {
|
||||||
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
||||||
if (exps->result<LottiePathSet>(frameNo, cmds, pts, transform, roundness, exp)) return true;
|
if (exps->result<LottiePathSet>(frameNo, cmds, pts, transform, roundness, exp)) return true;
|
||||||
}
|
}
|
||||||
|
@ -686,7 +684,7 @@ struct LottieColorStop : LottieProperty
|
||||||
|
|
||||||
Result operator()(float frameNo, Fill* fill, LottieExpressions* exps)
|
Result operator()(float frameNo, Fill* fill, LottieExpressions* exps)
|
||||||
{
|
{
|
||||||
if (exps && (exp && exp->enabled)) {
|
if (exps && exp) {
|
||||||
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
||||||
if (exps->result<LottieColorStop>(frameNo, fill, exp)) return Result::Success;
|
if (exps->result<LottieColorStop>(frameNo, fill, exp)) return Result::Success;
|
||||||
}
|
}
|
||||||
|
@ -818,7 +816,7 @@ struct LottiePosition : LottieProperty
|
||||||
Point operator()(float frameNo, LottieExpressions* exps)
|
Point operator()(float frameNo, LottieExpressions* exps)
|
||||||
{
|
{
|
||||||
Point out{};
|
Point out{};
|
||||||
if (exps && (exp && exp->enabled)) {
|
if (exps && exp) {
|
||||||
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
|
||||||
if (exps->result<LottiePosition>(frameNo, out, exp)) return out;
|
if (exps->result<LottiePosition>(frameNo, out, exp)) return out;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue