[canvaskit] Refactor skottie into own file
Just to clean things up a bit.
Bug: skia:
Change-Id: I0e34c148a92817084348fcf62d9f513887933cb3
Reviewed-on: https://skia-review.googlesource.com/c/180768
Reviewed-by: Florin Malita <fmalita@chromium.org>
diff --git a/experimental/canvaskit/skottie_bindings.cpp b/experimental/canvaskit/skottie_bindings.cpp
new file mode 100644
index 0000000..66be7e0
--- /dev/null
+++ b/experimental/canvaskit/skottie_bindings.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkCanvas.h"
+#include "SkMakeUnique.h"
+#include "SkTypes.h"
+#include "Skottie.h"
+
+#include <string>
+
+#include <emscripten.h>
+#include <emscripten/bind.h>
+#include "WasmAliases.h"
+
+#if SK_INCLUDE_MANAGED_SKOTTIE
+#include "SkottieProperty.h"
+#include "SkottieUtils.h"
+#endif // SK_INCLUDE_MANAGED_SKOTTIE
+
+using namespace emscripten;
+
+#if SK_INCLUDE_MANAGED_SKOTTIE
+namespace {
+
+class ManagedAnimation final : public SkRefCnt {
+public:
+ static sk_sp<ManagedAnimation> Make(const std::string& json) {
+ auto mgr = skstd::make_unique<skottie_utils::CustomPropertyManager>();
+ auto animation = skottie::Animation::Builder()
+ .setMarkerObserver(mgr->getMarkerObserver())
+ .setPropertyObserver(mgr->getPropertyObserver())
+ .make(json.c_str(), json.size());
+
+ return animation
+ ? sk_sp<ManagedAnimation>(new ManagedAnimation(std::move(animation), std::move(mgr)))
+ : nullptr;
+ }
+
+ // skottie::Animation API
+ void render(SkCanvas* canvas) const { fAnimation->render(canvas, nullptr); }
+ void render(SkCanvas* canvas, const SkRect& dst) const { fAnimation->render(canvas, &dst); }
+ void seek(SkScalar t) { fAnimation->seek(t); }
+ SkScalar duration() const { return fAnimation->duration(); }
+ const SkSize& size() const { return fAnimation->size(); }
+ std::string version() const { return std::string(fAnimation->version().c_str()); }
+
+ // CustomPropertyManager API
+ JSArray getColorProps() const {
+ JSArray props = emscripten::val::array();
+
+ for (const auto& cp : fPropMgr->getColorProps()) {
+ JSObject prop = emscripten::val::object();
+ prop.set("key", cp);
+ prop.set("value", fPropMgr->getColor(cp));
+ props.call<void>("push", prop);
+ }
+
+ return props;
+ }
+
+ JSArray getOpacityProps() const {
+ JSArray props = emscripten::val::array();
+
+ for (const auto& op : fPropMgr->getOpacityProps()) {
+ JSObject prop = emscripten::val::object();
+ prop.set("key", op);
+ prop.set("value", fPropMgr->getOpacity(op));
+ props.call<void>("push", prop);
+ }
+
+ return props;
+ }
+
+ bool setColor(const std::string& key, JSColor c) {
+ return fPropMgr->setColor(key, static_cast<SkColor>(c));
+ }
+
+ bool setOpacity(const std::string& key, float o) {
+ return fPropMgr->setOpacity(key, o);
+ }
+
+ JSArray getMarkers() const {
+ JSArray markers = emscripten::val::array();
+ for (const auto& m : fPropMgr->markers()) {
+ JSObject marker = emscripten::val::object();
+ marker.set("name", m.name);
+ marker.set("t0" , m.t0);
+ marker.set("t1" , m.t1);
+ markers.call<void>("push", marker);
+ }
+ return markers;
+ }
+
+private:
+ ManagedAnimation(sk_sp<skottie::Animation> animation,
+ std::unique_ptr<skottie_utils::CustomPropertyManager> propMgr)
+ : fAnimation(std::move(animation))
+ , fPropMgr(std::move(propMgr)) {}
+
+ sk_sp<skottie::Animation> fAnimation;
+ std::unique_ptr<skottie_utils::CustomPropertyManager> fPropMgr;
+};
+
+} // anonymous ns
+#endif // SK_INCLUDE_MANAGED_SKOTTIE
+
+EMSCRIPTEN_BINDINGS(Skottie) {
+ // Animation things (may eventually go in own library)
+ class_<skottie::Animation>("Animation")
+ .smart_ptr<sk_sp<skottie::Animation>>("sk_sp<Animation>")
+ .function("version", optional_override([](skottie::Animation& self)->std::string {
+ return std::string(self.version().c_str());
+ }))
+ .function("size", &skottie::Animation::size)
+ .function("duration", &skottie::Animation::duration)
+ .function("seek", &skottie::Animation::seek)
+ .function("render", optional_override([](skottie::Animation& self, SkCanvas* canvas)->void {
+ self.render(canvas, nullptr);
+ }), allow_raw_pointers())
+ .function("render", optional_override([](skottie::Animation& self, SkCanvas* canvas,
+ const SkRect r)->void {
+ self.render(canvas, &r);
+ }), allow_raw_pointers());
+
+ function("MakeAnimation", optional_override([](std::string json)->sk_sp<skottie::Animation> {
+ return skottie::Animation::Make(json.c_str(), json.length());
+ }));
+ constant("skottie", true);
+
+#if SK_INCLUDE_MANAGED_SKOTTIE
+ class_<ManagedAnimation>("ManagedAnimation")
+ .smart_ptr<sk_sp<ManagedAnimation>>("sk_sp<ManagedAnimation>")
+ .function("version" , &ManagedAnimation::version)
+ .function("size" , &ManagedAnimation::size)
+ .function("duration" , &ManagedAnimation::duration)
+ .function("seek" , &ManagedAnimation::seek)
+ .function("render" , select_overload<void(SkCanvas*) const>(&ManagedAnimation::render), allow_raw_pointers())
+ .function("render" , select_overload<void(SkCanvas*, const SkRect&) const>
+ (&ManagedAnimation::render), allow_raw_pointers())
+ .function("setColor" , &ManagedAnimation::setColor)
+ .function("setOpacity", &ManagedAnimation::setOpacity)
+ .function("getMarkers", &ManagedAnimation::getMarkers)
+ .function("getColorProps" , &ManagedAnimation::getColorProps)
+ .function("getOpacityProps", &ManagedAnimation::getOpacityProps);
+
+ function("MakeManagedAnimation", &ManagedAnimation::Make);
+ constant("managed_skottie", true);
+#endif // SK_INCLUDE_MANAGED_SKOTTIE
+}