diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index dd19b2d1..f8cf6505 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1169,25 +1169,13 @@ void LottieBuilder::updateText(LottieLayer* layer, float 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; - else { - color.rgb[0] = lerp(color.rgb[0], rangeColor.rgb[0], f); - color.rgb[1] = lerp(color.rgb[1], rangeColor.rgb[1], f); - color.rgb[2] = lerp(color.rgb[2], rangeColor.rgb[2], f); - } + (*s)->color(frameNo, color, strokeColor, f, exps); + fillOpacity = (uint8_t)(fillOpacity - f * (fillOpacity - (*s)->style.fillOpacity(frameNo))); shape->fill(color.rgb[0], color.rgb[1], color.rgb[2], fillOpacity); - shape->stroke(f * (*s)->style.strokeWidth(frameNo) / scale); + if ((*s)->style.flags.strokeWidth) 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 { - strokeColor.rgb[0] = lerp(strokeColor.rgb[0], rangeColor.rgb[0], f); - strokeColor.rgb[1] = lerp(strokeColor.rgb[1], rangeColor.rgb[1], f); - strokeColor.rgb[2] = lerp(strokeColor.rgb[2], rangeColor.rgb[2], f); - } 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); diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index fb55425c..481ee28a 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -258,6 +258,13 @@ struct LottieTextRange enum Shape : uint8_t { Square = 1, RampUp, RampDown, Triangle, Round, Smooth }; enum Unit : uint8_t { Percent = 1, Index }; + LottieTextRange() + { + style.flags.fillColor = 0; + style.flags.strokeColor = 0; + style.flags.strokeWidth = 0; + } + ~LottieTextRange() { free(interpolator); @@ -275,6 +282,11 @@ struct LottieTextRange LottieOpacity fillOpacity = 255; LottieOpacity strokeOpacity = 255; LottieOpacity opacity = 255; + struct { + bool fillColor : 1; + bool strokeColor : 1; + bool strokeWidth : 1; + } flags; } style; LottieFloat offset = 0.0f; @@ -292,6 +304,22 @@ struct LottieTextRange bool expressible = false; float factor(float frameNo, float totalLen, float idx); + + void color(float frameNo, RGB24& fillColor, RGB24& strokeColor, float factor, LottieExpressions* exps) + { + if (style.flags.fillColor) { + auto color = style.fillColor(frameNo, exps); + fillColor.rgb[0] = tvg::lerp(fillColor.rgb[0], color.rgb[0], factor); + fillColor.rgb[1] = tvg::lerp(fillColor.rgb[1], color.rgb[1], factor); + fillColor.rgb[2] = tvg::lerp(fillColor.rgb[2], color.rgb[2], factor); + } + if (style.flags.strokeColor) { + auto color = style.strokeColor(frameNo, exps); + strokeColor.rgb[0] = tvg::lerp(strokeColor.rgb[0], color.rgb[0], factor); + strokeColor.rgb[1] = tvg::lerp(strokeColor.rgb[1], color.rgb[1], factor); + strokeColor.rgb[2] = tvg::lerp(strokeColor.rgb[2], color.rgb[2], factor); + } + } }; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index c81b4afd..f8d39b14 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -1195,11 +1195,17 @@ void LottieParser::parseTextRange(LottieText* text) 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); - else if (KEY_AS("sc")) parseProperty(selector->style.strokeColor); - else if (KEY_AS("so")) parseProperty(selector->style.strokeOpacity); + else if (KEY_AS("fc")) { + parseProperty(selector->style.fillColor); + selector->style.flags.fillColor = true; + } else if (KEY_AS("fo")) parseProperty(selector->style.fillOpacity); + else if (KEY_AS("sw")) { + parseProperty(selector->style.strokeWidth); + selector->style.flags.strokeWidth = true; + } else if (KEY_AS("sc")) { + parseProperty(selector->style.strokeColor); + selector->style.flags.strokeColor = true; + } else if (KEY_AS("so")) parseProperty(selector->style.strokeOpacity); else if (KEY_AS("o")) parseProperty(selector->style.opacity); else if (KEY_AS("p")) parseProperty(selector->style.position); else if (KEY_AS("s")) parseProperty(selector->style.scale);