aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/skottie/SkottieProperties.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/skottie/SkottieProperties.cpp')
-rw-r--r--experimental/skottie/SkottieProperties.cpp34
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