lottie: ++scene rendering optimization

Apply LottieRenderPooler to texts.
This commit is contained in:
Hermet Park 2024-07-15 00:29:11 +09:00
parent de72161087
commit 3181ea660f
3 changed files with 8 additions and 8 deletions

View file

@ -1082,7 +1082,7 @@ static void _updateText(LottieLayer* layer, float frameNo)
if (!p || !text->font) return; if (!p || !text->font) return;
auto scale = doc.size * 0.01f; auto scale = doc.size;
Point cursor = {0.0f, 0.0f}; Point cursor = {0.0f, 0.0f};
auto scene = Scene::gen(); auto scene = Scene::gen();
int line = 0; int line = 0;
@ -1122,8 +1122,8 @@ static void _updateText(LottieLayer* layer, float frameNo)
auto glyph = *g; auto glyph = *g;
//draw matched glyphs //draw matched glyphs
if (!strncmp(glyph->code, p, glyph->len)) { if (!strncmp(glyph->code, p, glyph->len)) {
//TODO: caching? auto shape = text->pooling();
auto shape = Shape::gen(); shape->reset();
for (auto g = glyph->children.begin(); g < glyph->children.end(); ++g) { for (auto g = glyph->children.begin(); g < glyph->children.end(); ++g) {
auto group = static_cast<LottieGroup*>(*g); auto group = static_cast<LottieGroup*>(*g);
for (auto p = group->children.begin(); p < group->children.end(); ++p) { for (auto p = group->children.begin(); p < group->children.end(); ++p) {
@ -1145,8 +1145,8 @@ static void _updateText(LottieLayer* layer, float frameNo)
for (auto s = text->ranges.begin(); s < text->ranges.end(); ++s) { for (auto s = text->ranges.begin(); s < text->ranges.end(); ++s) {
float divisor = (*s)->rangeUnit == LottieTextRange::Unit::Percent ? (100.0f / totalChars) : 1; float divisor = (*s)->rangeUnit == LottieTextRange::Unit::Percent ? (100.0f / totalChars) : 1;
auto offset = (*s)->offset(frameNo) / divisor; auto offset = (*s)->offset(frameNo) / divisor;
auto start = round((*s)->start(frameNo) / divisor) + offset; auto start = nearbyintf((*s)->start(frameNo) / divisor) + offset;
auto end = round((*s)->end(frameNo) / divisor) + offset; auto end = nearbyintf((*s)->end(frameNo) / divisor) + offset;
if (start > end) std::swap(start, end); if (start > end) std::swap(start, end);
@ -1176,7 +1176,7 @@ static void _updateText(LottieLayer* layer, float frameNo)
cursor.x += (*s)->style.letterSpacing(frameNo); cursor.x += (*s)->style.letterSpacing(frameNo);
} }
scene->push(std::move(shape)); scene->push(cast(shape));
p += glyph->len; p += glyph->len;
idx += glyph->len; idx += glyph->len;

View file

@ -218,7 +218,7 @@ struct LottieMarker
} }
}; };
struct LottieText : LottieObject struct LottieText : LottieObject, LottieRenderPooler<tvg::Shape>
{ {
void prepare() void prepare()
{ {

View file

@ -187,7 +187,7 @@ void LottieParser::getValue(TextDocument& doc)
{ {
enterObject(); enterObject();
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("s")) doc.size = getFloat(); if (KEY_AS("s")) doc.size = getFloat() * 0.01f;
else if (KEY_AS("f")) doc.name = getStringCopy(); else if (KEY_AS("f")) doc.name = getStringCopy();
else if (KEY_AS("t")) doc.text = getStringCopy(); else if (KEY_AS("t")) doc.text = getStringCopy();
else if (KEY_AS("j")) doc.justify = getInt(); else if (KEY_AS("j")) doc.justify = getInt();