From ce3bee7a3f61c8c293ea99463641333591dca745 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Mon, 11 Nov 2024 12:32:36 +0100 Subject: [PATCH] lottie: fix text range opacity --- src/loaders/lottie/tvgLottieBuilder.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 930553f8..63f5b6fd 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1091,6 +1091,9 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) Point translation = {0.0f, 0.0f}; auto color = doc.color; auto strokeColor = doc.stroke.color; + uint8_t opacity = 255; + uint8_t fillOpacity = 255; + uint8_t strokeOpacity = 255; for (auto s = text->ranges.begin(); s < text->ranges.end(); ++s) { auto basedIdx = idx; @@ -1116,7 +1119,8 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) scaling.y *= temp.y; rotation += f * (*s)->style.rotation(frameNo); - shape->opacity((*s)->style.opacity(frameNo)); + opacity = (uint8_t)(opacity - f * (opacity - (*s)->style.opacity(frameNo))); + shape->opacity(opacity); auto rangeColor = (*s)->style.fillColor(frameNo); //TODO: use flag to check whether it was really set if (tvg::equal(f, 1.0f)) color = rangeColor; @@ -1125,7 +1129,8 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) color.rgb[1] = lerp(color.rgb[1], rangeColor.rgb[1], f); color.rgb[2] = lerp(color.rgb[2], rangeColor.rgb[2], f); } - shape->fill(color.rgb[0], color.rgb[1], color.rgb[2], (*s)->style.fillOpacity(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); @@ -1136,7 +1141,8 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo) strokeColor.rgb[1] = lerp(strokeColor.rgb[1], rangeColor.rgb[1], f); strokeColor.rgb[2] = lerp(strokeColor.rgb[2], rangeColor.rgb[2], f); } - shape->stroke(strokeColor.rgb[0], strokeColor.rgb[1], strokeColor.rgb[2], (*s)->style.strokeOpacity(frameNo)); + strokeOpacity = (uint8_t)(strokeOpacity - f * (strokeOpacity - (*s)->style.strokeOpacity(frameNo))); + shape->stroke(strokeColor.rgb[0], strokeColor.rgb[1], strokeColor.rgb[2], strokeOpacity); } cursor.x += f * (*s)->style.letterSpacing(frameNo);