aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--experimental/skottie/Skottie.cpp18
-rw-r--r--experimental/skottie/SkottieProperties.cpp34
-rw-r--r--experimental/skottie/SkottieProperties.h17
-rw-r--r--experimental/sksg/geometry/SkSGTrimEffect.cpp17
-rw-r--r--experimental/sksg/geometry/SkSGTrimEffect.h13
5 files changed, 69 insertions, 30 deletions
diff --git a/experimental/skottie/Skottie.cpp b/experimental/skottie/Skottie.cpp
index a7b6b23817..5a04e5a719 100644
--- a/experimental/skottie/Skottie.cpp
+++ b/experimental/skottie/Skottie.cpp
@@ -427,19 +427,21 @@ std::vector<sk_sp<sksg::GeometryNode>> AttachTrimGeometryEffect(
std::vector<sk_sp<sksg::GeometryNode>> trimmed;
trimmed.reserve(inputs.size());
for (const auto& i : inputs) {
- const auto trim = sksg::TrimEffect::Make(i);
- trimmed.push_back(trim);
+ const auto trimEffect = sksg::TrimEffect::Make(i);
+ trimmed.push_back(trimEffect);
+
+ const auto trimComposite = sk_make_sp<CompositeTrimEffect>(std::move(trimEffect));
BindProperty<ScalarValue>(jtrim["s"], &ctx->fAnimators,
- [trim](const ScalarValue& s) {
- trim->setStart(s * 0.01f);
+ [trimComposite](const ScalarValue& s) {
+ trimComposite->setStart(s);
});
BindProperty<ScalarValue>(jtrim["e"], &ctx->fAnimators,
- [trim](const ScalarValue& e) {
- trim->setEnd(e * 0.01f);
+ [trimComposite](const ScalarValue& e) {
+ trimComposite->setEnd(e);
});
BindProperty<ScalarValue>(jtrim["o"], &ctx->fAnimators,
- [trim](const ScalarValue& o) {
- trim->setOffset(o / 360);
+ [trimComposite](const ScalarValue& o) {
+ trimComposite->setOffset(o);
});
}
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
diff --git a/experimental/skottie/SkottieProperties.h b/experimental/skottie/SkottieProperties.h
index 8ca026eaeb..5e3fad0d9a 100644
--- a/experimental/skottie/SkottieProperties.h
+++ b/experimental/skottie/SkottieProperties.h
@@ -28,6 +28,7 @@ class Path;
class RadialGradient;
class RRect;
class RenderNode;;
+class TrimEffect;
}
namespace Json { class Value; }
@@ -161,6 +162,22 @@ private:
using INHERITED = CompositeGradient;
};
+class CompositeTrimEffect final : public SkRefCnt {
+public:
+ explicit CompositeTrimEffect(sk_sp<sksg::TrimEffect>);
+
+ COMPOSITE_PROPERTY(Start , SkScalar, 0)
+ COMPOSITE_PROPERTY(End , SkScalar, 100)
+ COMPOSITE_PROPERTY(Offset, SkScalar, 0)
+
+private:
+ void apply();
+
+ sk_sp<sksg::TrimEffect> fTrimEffect;
+
+ using INHERITED = SkRefCnt;
+};
+
#undef COMPOSITE_PROPERTY
} // namespace skottie
diff --git a/experimental/sksg/geometry/SkSGTrimEffect.cpp b/experimental/sksg/geometry/SkSGTrimEffect.cpp
index fea8249161..b8c59bcfe8 100644
--- a/experimental/sksg/geometry/SkSGTrimEffect.cpp
+++ b/experimental/sksg/geometry/SkSGTrimEffect.cpp
@@ -42,22 +42,7 @@ SkRect TrimEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm)
const auto childbounds = fChild->revalidate(ic, ctm);
const auto path = fChild->asPath();
- // TODO: relocate these funky semantics to a Skottie composite helper,
- // and refactor TrimEffect as a thin SkTrimpPathEffect wrapper.
- auto start = SkTMin(fStart, fEnd) + fOffset,
- stop = SkTMax(fStart, fEnd) + fOffset;
-
- sk_sp<SkPathEffect> trim;
- if (stop - start < 1) {
- start -= SkScalarFloorToScalar(start);
- stop -= SkScalarFloorToScalar(stop);
-
- trim = start <= stop
- ? SkTrimPathEffect::Make(start, stop, SkTrimPathEffect::Mode::kNormal)
- : SkTrimPathEffect::Make(stop, start, SkTrimPathEffect::Mode::kInverted);
- }
-
- if (trim) {
+ if (auto trim = SkTrimPathEffect::Make(fStart, fStop, fMode)) {
fTrimmedPath.reset();
SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle);
SkAssertResult(trim->filterPath(&fTrimmedPath, path, &rec, &childbounds));
diff --git a/experimental/sksg/geometry/SkSGTrimEffect.h b/experimental/sksg/geometry/SkSGTrimEffect.h
index 4e950a7ade..18f15921e7 100644
--- a/experimental/sksg/geometry/SkSGTrimEffect.h
+++ b/experimental/sksg/geometry/SkSGTrimEffect.h
@@ -11,6 +11,7 @@
#include "SkSGGeometryNode.h"
#include "SkPath.h"
+#include "SkTrimPathEffect.h"
class SkCanvas;
class SkPaint;
@@ -28,9 +29,9 @@ public:
~TrimEffect() override;
- SG_ATTRIBUTE(Start , SkScalar, fStart )
- SG_ATTRIBUTE(End , SkScalar, fEnd )
- SG_ATTRIBUTE(Offset, SkScalar, fOffset)
+ SG_ATTRIBUTE(Start , SkScalar , fStart )
+ SG_ATTRIBUTE(Stop , SkScalar , fStop )
+ SG_ATTRIBUTE(Mode , SkTrimPathEffect::Mode, fMode )
protected:
void onClip(SkCanvas*, bool antiAlias) const override;
@@ -45,9 +46,9 @@ private:
const sk_sp<GeometryNode> fChild;
SkPath fTrimmedPath;
- SkScalar fStart = 0, // starting t
- fEnd = 1, // ending t
- fOffset = 0; // t offset
+ SkScalar fStart = 0,
+ fStop = 1;
+ SkTrimPathEffect::Mode fMode = SkTrimPathEffect::Mode::kNormal;
using INHERITED = GeometryNode;
};