From 3c836b1b2ad96ce0806ecc0a9625487807e28efe Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 4 Mar 2025 15:03:38 +0900 Subject: [PATCH] lottie: revise the text justify logic removed the duplicate logic, improved for neat and easy maintainance --- src/loaders/lottie/tvgLottieBuilder.cpp | 13 +++---------- src/loaders/lottie/tvgLottieData.h | 4 ++-- src/loaders/lottie/tvgLottieParser.cpp | 7 ++++++- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index dc53f591..2695f07d 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -929,13 +929,7 @@ static void _fontText(LottieText* text, Scene* scene, float frameNo, LottieExpre float width; txt->bounds(nullptr, nullptr, &width, nullptr, false); - float cursorX = 0.0f; - if (doc.justify == 1) { - cursorX = width * -1; - } else if (doc.justify == 2) { - cursorX = width * -0.5f; - } - + auto cursorX = width * doc.justify; txt->translate(cursorX, -doc.size * 100.0f); scene->push(txt); } @@ -977,9 +971,8 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) if (ascent > doc.bbox.size.y) ascent = doc.bbox.size.y; Point layout = {doc.bbox.pos.x, doc.bbox.pos.y + ascent - doc.shift}; - //adjust the layout - if (doc.justify == 1) layout.x += doc.bbox.size.x - (cursor.x * scale); //right aligned - else if (doc.justify == 2) layout.x += (doc.bbox.size.x * 0.5f) - (cursor.x * 0.5f * scale); //center aligned + //horizontal alignment + layout.x += -1.0f * doc.bbox.size.x * doc.justify + (cursor.x * scale) * doc.justify; //new text group, single scene based on text-grouping scene->push(textGroup); diff --git a/src/loaders/lottie/tvgLottieData.h b/src/loaders/lottie/tvgLottieData.h index 1419f2ab..c9438a9b 100644 --- a/src/loaders/lottie/tvgLottieData.h +++ b/src/loaders/lottie/tvgLottieData.h @@ -67,8 +67,8 @@ struct TextDocument char* name = nullptr; float size; float tracking = 0.0f; - uint8_t justify = 0; - uint8_t caps = 0; //0: Regular, 1: AllCaps, 2: SmallCaps + float justify = 0.0f; //horizontal alignment + uint8_t caps = 0; //0: Regular, 1: AllCaps, 2: SmallCaps }; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index d0235253..f64dedd7 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -126,7 +126,12 @@ bool LottieParser::getValue(TextDocument& doc) if (KEY_AS("s")) doc.size = getFloat() * 0.01f; else if (KEY_AS("f")) doc.name = getStringCopy(); else if (KEY_AS("t")) doc.text = getStringCopy(); - else if (KEY_AS("j")) doc.justify = getInt(); + else if (KEY_AS("j")) + { + auto val = getInt(); + if (val == 1) doc.justify = -1.0f; //right align + else if (val == 2) doc.justify = -0.5f; //center align + } else if (KEY_AS("ca")) doc.caps = getInt(); else if (KEY_AS("tr")) doc.tracking = getFloat() * 0.1f; else if (KEY_AS("lh")) doc.height = getFloat();