From 12b9c5fc5356b4993be11bd5b0c829e1b8ed482b Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Tue, 14 Jan 2025 12:35:17 +0100 Subject: [PATCH] lottie: fix text stroke's 'of' property The text stroke's 'of' property determines whether the stroke appears above (true) or below (false) the fill. Previously, it was incorrectly used to decide whether the stroke would render. @Issue: https://github.com/thorvg/thorvg/issues/3126 --- src/loaders/lottie/tvgLottieBuilder.cpp | 8 +++++--- src/loaders/lottie/tvgLottieCommon.h | 2 +- src/loaders/lottie/tvgLottieParser.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 2e3fd07c..628a49ee 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1090,10 +1090,11 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) shape->translate(cursor.x - textGroupMatrix.e13, cursor.y - textGroupMatrix.e23); shape->opacity(255); - if (doc.stroke.render) { + if (doc.stroke.width > 0.0f) { shape->stroke(StrokeJoin::Round); shape->stroke(doc.stroke.width / scale); shape->stroke(doc.stroke.color.rgb[0], doc.stroke.color.rgb[1], doc.stroke.color.rgb[2]); + shape->order(doc.stroke.below); } auto needGroup = false; @@ -1145,8 +1146,8 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) fillOpacity = (uint8_t)(fillOpacity - f * (fillOpacity - (*s)->style.fillOpacity(frameNo))); shape->fill(color.rgb[0], color.rgb[1], color.rgb[2], fillOpacity); - if (doc.stroke.render) { - shape->stroke(f * (*s)->style.strokeWidth(frameNo) / scale); + shape->stroke(f * (*s)->style.strokeWidth(frameNo) / scale); + if (shape->strokeWidth() > 0.0f) { auto rangeColor = (*s)->style.strokeColor(frameNo); //TODO: use flag to check whether it was really set if (tvg::equal(f, 1.0f)) strokeColor = rangeColor; else { @@ -1156,6 +1157,7 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) } strokeOpacity = (uint8_t)(strokeOpacity - f * (strokeOpacity - (*s)->style.strokeOpacity(frameNo))); shape->stroke(strokeColor.rgb[0], strokeColor.rgb[1], strokeColor.rgb[2], strokeOpacity); + shape->order(doc.stroke.below); } cursor.x += f * (*s)->style.letterSpacing(frameNo); diff --git a/src/loaders/lottie/tvgLottieCommon.h b/src/loaders/lottie/tvgLottieCommon.h index 80b0718a..d1c0f28c 100644 --- a/src/loaders/lottie/tvgLottieCommon.h +++ b/src/loaders/lottie/tvgLottieCommon.h @@ -62,7 +62,7 @@ struct TextDocument struct { RGB24 color; float width; - bool render = false; + bool below = false; } stroke; char* name = nullptr; float size; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index a13fd835..c9b4597f 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -177,7 +177,7 @@ bool LottieParser::getValue(TextDocument& doc) else if (KEY_AS("sz")) getValue(doc.bbox.size); else if (KEY_AS("sc")) getValue(doc.stroke.color); else if (KEY_AS("sw")) doc.stroke.width = getFloat(); - else if (KEY_AS("of")) doc.stroke.render = getBool(); + else if (KEY_AS("of")) doc.stroke.below = !getBool(); else skip(key); } return false;