1/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkottieSlide.h"
9
10#include "SkAnimTimer.h"
11#include "SkCanvas.h"
12#include "Skottie.h"
13
14SkottieSlide::SkottieSlide(const SkString& name, const SkString& path)
15    : fPath(path) {
16    fName = name;
17}
18
19void SkottieSlide::load(SkScalar w, SkScalar h) {
20    fAnimation = skottie::Animation::MakeFromFile(fPath.c_str());
21    fWinSize   = SkSize::Make(w, h);
22    fTimeBase  = 0; // force a time reset
23
24    if (fAnimation) {
25        fAnimation->setShowInval(fShowAnimationInval);
26        SkDebugf("loaded Bodymovin animation v: %s, size: [%f %f], fr: %f\n",
27                 fAnimation->version().c_str(),
28                 fAnimation->size().width(),
29                 fAnimation->size().height(),
30                 fAnimation->frameRate());
31    } else {
32        SkDebugf("failed to load Bodymovin animation: %s\n", fPath.c_str());
33    }
34}
35
36void SkottieSlide::unload() {
37    fAnimation.reset();
38}
39
40SkISize SkottieSlide::getDimensions() const {
41    // We always scale to fill the window.
42    return fWinSize.toCeil();
43}
44
45void SkottieSlide::draw(SkCanvas* canvas) {
46    if (fAnimation) {
47        SkAutoCanvasRestore acr(canvas, true);
48        const auto dstR = SkRect::MakeSize(fWinSize);
49        fAnimation->render(canvas, &dstR);
50    }
51}
52
53bool SkottieSlide::animate(const SkAnimTimer& timer) {
54    if (fTimeBase == 0) {
55        // Reset the animation time.
56        fTimeBase = timer.msec();
57    }
58
59    if (fAnimation) {
60        auto t = timer.msec() - fTimeBase;
61        fAnimation->animationTick(t);
62    }
63    return true;
64}
65
66bool SkottieSlide::onChar(SkUnichar c) {
67    switch (c) {
68    case 'I':
69        if (fAnimation) {
70            fShowAnimationInval = !fShowAnimationInval;
71            fAnimation->setShowInval(fShowAnimationInval);
72        }
73        break;
74    default:
75        break;
76    }
77
78    return INHERITED::onChar(c);
79}
80
81bool SkottieSlide::onMouse(SkScalar x, SkScalar y, sk_app::Window::InputState state, uint32_t) {
82    switch (state) {
83    case sk_app::Window::kUp_InputState:
84        fShowAnimationInval = !fShowAnimationInval;
85        fAnimation->setShowInval(fShowAnimationInval);
86        break;
87    default:
88        break;
89    }
90
91    return false;
92}
93