diff options
Diffstat (limited to 'experimental/skottie/SkottieProperties.cpp')
-rw-r--r-- | experimental/skottie/SkottieProperties.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/experimental/skottie/SkottieProperties.cpp b/experimental/skottie/SkottieProperties.cpp index 0816e15bca..a774217a8c 100644 --- a/experimental/skottie/SkottieProperties.cpp +++ b/experimental/skottie/SkottieProperties.cpp @@ -15,6 +15,7 @@ #include "SkSGPath.h" #include "SkSGRect.h" #include "SkSGTransform.h" +#include "SkSGTrimEffect.h" #include <cmath> @@ -190,4 +191,37 @@ void CompositeRadialGradient::onApply() { grad->setEndRadius(SkPoint::Distance(this->startPoint(), this->endPoint())); } +CompositeTrimEffect::CompositeTrimEffect(sk_sp<sksg::TrimEffect> trimEffect) + : fTrimEffect(std::move(trimEffect)) { + SkASSERT(fTrimEffect); +} + +void CompositeTrimEffect::apply() { + // BM semantics: start/end are percentages, offset is "degrees" (?!). + const auto start = fStart / 100, + end = fEnd / 100, + offset = fOffset / 360; + + auto startT = SkTMin(start, end) + offset, + stopT = SkTMax(start, end) + offset; + auto mode = SkTrimPathEffect::Mode::kNormal; + + if (stopT - startT < 1) { + startT -= SkScalarFloorToScalar(startT); + stopT -= SkScalarFloorToScalar(stopT); + + if (startT > stopT) { + SkTSwap(startT, stopT); + mode = SkTrimPathEffect::Mode::kInverted; + } + } else { + startT = 0; + stopT = 1; + } + + fTrimEffect->setStart(startT); + fTrimEffect->setStop(stopT); + fTrimEffect->setMode(mode); +} + } // namespace skottie |