lottie/expressions: tiny optimization

reuse the user callback data by the reference count.
This commit is contained in:
Hermet Park 2025-04-10 14:59:00 +09:00
parent 08fa801461
commit 126265feb9

View file

@ -37,6 +37,7 @@ struct ExpContent
LottieExpression* exp; LottieExpression* exp;
LottieObject* obj; LottieObject* obj;
float frameNo; float frameNo;
size_t refCnt;
}; };
static jerry_value_t _content(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt); static jerry_value_t _content(const jerry_call_info_t* info, const jerry_value_t args[], const jerry_length_t argsCnt);
@ -58,12 +59,20 @@ static const char* EXP_EFFECT= "effect";
static LottieExpressions* exps = nullptr; //singleton instance engine static LottieExpressions* exps = nullptr; //singleton instance engine
static ExpContent* _expcontent(LottieExpression* exp, float frameNo, LottieObject* obj) static ExpContent* _expcontent(LottieExpression* exp, float frameNo, void* obj, size_t refCnt = 1)
{ {
auto data = (ExpContent*)malloc(sizeof(ExpContent)); auto data = (ExpContent*)malloc(sizeof(ExpContent));
data->exp = exp; data->exp = exp;
data->frameNo = frameNo; data->frameNo = frameNo;
data->obj = obj; data->obj = (LottieObject*)obj;
data->refCnt = refCnt;
return data;
}
static inline ExpContent* _expcontent(ExpContent* data)
{
++data->refCnt;
return data; return data;
} }
@ -89,7 +98,9 @@ static jerry_value_t _point2d(const Point& pt)
static void contentFree(void *native_p, struct jerry_object_native_info_t *info_p) static void contentFree(void *native_p, struct jerry_object_native_info_t *info_p)
{ {
free(native_p); if (--static_cast<ExpContent*>(native_p)->refCnt == 0) {
free(native_p);
}
} }
static jerry_object_native_info_t freeCb {contentFree, 0, 0}; static jerry_object_native_info_t freeCb {contentFree, 0, 0};
@ -346,9 +357,11 @@ static void _buildLayer(jerry_value_t context, float frameNo, LottieLayer* layer
jerry_value_free(toComp); jerry_value_free(toComp);
//content("name"), #look for the named property from a layer //content("name"), #look for the named property from a layer
auto data = _expcontent(exp, frameNo, layer, 1);
auto content = jerry_function_external(_content); auto content = jerry_function_external(_content);
jerry_object_set_sz(context, EXP_CONTENT, content); jerry_object_set_sz(context, EXP_CONTENT, content);
jerry_object_set_native_ptr(content, &freeCb, _expcontent(exp, frameNo, layer)); jerry_object_set_native_ptr(content, &freeCb, data);
jerry_value_free(content); jerry_value_free(content);
} }
@ -735,7 +748,7 @@ static jerry_value_t _propertyGroup(const jerry_call_info_t* info, const jerry_v
//intermediate group //intermediate group
if (level == 1) { if (level == 1) {
auto group = jerry_function_external(_property); auto group = jerry_function_external(_property);
jerry_object_set_native_ptr(group, &freeCb, _expcontent(data->exp, data->frameNo, data->obj)); jerry_object_set_native_ptr(group, &freeCb, _expcontent(data));
jerry_object_set_sz(group, "", group); jerry_object_set_sz(group, "", group);
return group; return group;
} }
@ -1088,12 +1101,23 @@ static void _buildProperty(float frameNo, jerry_value_t context, LottieExpressio
jerry_object_set_native_ptr(speedAtTime, nullptr, exp); jerry_object_set_native_ptr(speedAtTime, nullptr, exp);
jerry_value_free(speedAtTime); jerry_value_free(speedAtTime);
auto wiggle = jerry_function_external(_wiggle); {
jerry_object_set_sz(context, "wiggle", wiggle); auto data = _expcontent(exp, frameNo, exp->object, 2);
jerry_object_set_native_ptr(wiggle, &freeCb, _expcontent(exp, frameNo, exp->object));
jerry_value_free(wiggle);
//temporalWiggle(freq, amp, octaves=1, amp_mult=.5, t=time) auto wiggle = jerry_function_external(_wiggle);
jerry_object_set_sz(context, "wiggle", wiggle);
jerry_object_set_native_ptr(wiggle, &freeCb, data);
jerry_value_free(wiggle);
//temporalWiggle(freq, amp, octaves=1, amp_mult=.5, t=time)
auto propertyGroup = jerry_function_external(_propertyGroup);
jerry_object_set_native_ptr(propertyGroup, &freeCb, data);
jerry_object_set_sz(context, "propertyGroup", propertyGroup);
jerry_value_free(propertyGroup);
//propertyIndex
}
//smooth(width=.2, samples=5, t=time) //smooth(width=.2, samples=5, t=time)
auto loopIn = jerry_function_external(_loopIn); auto loopIn = jerry_function_external(_loopIn);
@ -1132,20 +1156,17 @@ static void _buildProperty(float frameNo, jerry_value_t context, LottieExpressio
jerry_object_set_sz(context, "numKeys", numKeys); jerry_object_set_sz(context, "numKeys", numKeys);
jerry_value_free(numKeys); jerry_value_free(numKeys);
auto propertyGroup = jerry_function_external(_propertyGroup);
jerry_object_set_native_ptr(propertyGroup, &freeCb, _expcontent(exp, frameNo, exp->object));
jerry_object_set_sz(context, "propertyGroup", propertyGroup);
jerry_value_free(propertyGroup);
//propertyIndex
//name //name
//content("name"), #look for the named property from a layer {
auto content = jerry_function_external(_content); auto data = _expcontent(exp, frameNo, exp->layer, 1);
jerry_object_set_sz(context, EXP_CONTENT, content);
jerry_object_set_native_ptr(content, &freeCb, _expcontent(exp, frameNo, exp->layer)); //content("name"), #look for the named property from a layer
jerry_value_free(content); auto content = jerry_function_external(_content);
jerry_object_set_sz(context, EXP_CONTENT, content);
jerry_object_set_native_ptr(content, &freeCb, data);
jerry_value_free(content);
}
//expansions per types //expansions per types
if (exp->property->type == LottieProperty::Type::PathSet) _buildPath(context, exp); if (exp->property->type == LottieProperty::Type::PathSet) _buildPath(context, exp);
@ -1272,11 +1293,6 @@ void LottieExpressions::buildGlobal(LottieExpression* exp)
void LottieExpressions::buildComp(jerry_value_t context, float frameNo, LottieLayer* comp, LottieExpression* exp) void LottieExpressions::buildComp(jerry_value_t context, float frameNo, LottieLayer* comp, LottieExpression* exp)
{ {
auto data = static_cast<ExpContent*>(jerry_object_get_native_ptr(context, &freeCb));
data->exp = exp;
data->frameNo = frameNo;
data->obj = comp;
//layer(index) / layer(name) / layer(otherLayer, reIndex) //layer(index) / layer(name) / layer(otherLayer, reIndex)
auto layer = jerry_function_external(_layer); auto layer = jerry_function_external(_layer);
jerry_object_set_sz(context, "layer", layer); jerry_object_set_sz(context, "layer", layer);
@ -1340,13 +1356,11 @@ jerry_value_t LottieExpressions::buildGlobal()
//comp(name) //comp(name)
comp = jerry_function_external(_comp); comp = jerry_function_external(_comp);
jerry_object_set_native_ptr(comp, &freeCb, _expcontent(nullptr, 0.0f, nullptr));
jerry_object_set_sz(global, "comp", comp); jerry_object_set_sz(global, "comp", comp);
//footage(name) //footage(name)
thisComp = jerry_object(); thisComp = jerry_object();
jerry_object_set_native_ptr(thisComp, &freeCb, _expcontent(nullptr, 0.0f, nullptr));
jerry_object_set_sz(global, "thisComp", thisComp); jerry_object_set_sz(global, "thisComp", thisComp);
thisLayer = jerry_object(); thisLayer = jerry_object();