From bf3e861b5a7d90b97b7527f595da57a03f84e868 Mon Sep 17 00:00:00 2001 From: Jinny You Date: Tue, 10 Sep 2024 11:44:32 +0900 Subject: [PATCH] lottie/text: Support line spacing Compute line spacing based on the text range selector, applying the maximum spacing value for each line. issue: https://github.com/thorvg/thorvg/issues/2178 --- src/loaders/lottie/tvgLottieBuilder.cpp | 10 +++++++++- src/loaders/lottie/tvgLottieModel.h | 1 + src/loaders/lottie/tvgLottieParser.cpp | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index a3aca455..a4b7659a 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1003,6 +1003,8 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) auto scene = Scene::gen(); int line = 0; int space = 0; + auto lineSpacing = 0.0f; + auto totalLineSpacing = 0.0f; //text string int idx = 0; @@ -1028,10 +1030,13 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) if (*p == '\0') break; ++p; + totalLineSpacing += lineSpacing; + lineSpacing = 0.0f; + //new text group, single scene for each line scene = Scene::gen(); cursor.x = 0.0f; - cursor.y = ++line * (doc.height / scale); + cursor.y = (++line * doc.height + totalLineSpacing) / scale; continue; } @@ -1100,6 +1105,9 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) shape->stroke(strokeColor.rgb[0], strokeColor.rgb[1], strokeColor.rgb[2], (*s)->style.strokeOpacity(frameNo)); } cursor.x += (*s)->style.letterSpacing(frameNo); + + auto spacing = (*s)->style.lineSpacing(frameNo); + if (spacing > lineSpacing) lineSpacing = spacing; } scene->push(cast(shape)); diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 8ba5fb3b..c1848cdd 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -158,6 +158,7 @@ struct LottieTextStyle LottiePosition position = Point{0, 0}; LottiePoint scale = Point{100, 100}; LottieFloat letterSpacing = 0.0f; + LottieFloat lineSpacing = 0.0f; LottieFloat strokeWidth = 0.0f; LottieFloat rotation = 0.0f; LottieOpacity fillOpacity = 255; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index 6bdfd6a6..eda65ddc 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -1136,6 +1136,7 @@ void LottieParser::parseTextRange(LottieText* text) enterObject(); while (auto key = nextObjectKey()) { if (KEY_AS("t")) parseProperty(selector->style.letterSpacing); + else if (KEY_AS("ls")) parseProperty(selector->style.lineSpacing); else if (KEY_AS("fc")) parseProperty(selector->style.fillColor); else if (KEY_AS("fo")) parseProperty(selector->style.fillOpacity); else if (KEY_AS("sw")) parseProperty(selector->style.strokeWidth);