blob: 99f182a7bbcbe4f631001501f14dcd58112b7a1d [file] [log] [blame]
Florin Malita094ccde2017-12-30 12:27:00 -05001/*
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 "SkottySlide.h"
9
10#include "SkAnimTimer.h"
Florin Malitaaa4dc622018-01-02 14:37:37 -050011#include "SkCanvas.h"
Florin Malita094ccde2017-12-30 12:27:00 -050012#include "Skotty.h"
Florin Malita094ccde2017-12-30 12:27:00 -050013
14SkottySlide::SkottySlide(const SkString& name, const SkString& path)
15 : fPath(path) {
16 fName = name;
17}
18
19void SkottySlide::load(SkScalar, SkScalar) {
Florin Malita49328072018-01-08 12:51:12 -050020 fAnimation = skotty::Animation::MakeFromFile(fPath.c_str());
Florin Malita094ccde2017-12-30 12:27:00 -050021 fTimeBase = 0; // force a time reset
22
23 if (fAnimation) {
Florin Malitadf2713c2018-01-09 15:51:21 -050024 fAnimation->setShowInval(fShowAnimationInval);
Florin Malita094ccde2017-12-30 12:27:00 -050025 SkDebugf("loaded Bodymovin animation v: %s, size: [%f %f], fr: %f\n",
26 fAnimation->version().c_str(),
27 fAnimation->size().width(),
28 fAnimation->size().height(),
29 fAnimation->frameRate());
30 } else {
31 SkDebugf("failed to load Bodymovin animation: %s\n", fPath.c_str());
32 }
33}
34
35void SkottySlide::unload() {
36 fAnimation.reset();
37}
38
39SkISize SkottySlide::getDimensions() const {
40 return fAnimation? fAnimation->size().toCeil() : SkISize::Make(0, 0);
41}
42
43void SkottySlide::draw(SkCanvas* canvas) {
44 if (fAnimation) {
Florin Malitaaa4dc622018-01-02 14:37:37 -050045 SkAutoCanvasRestore acr(canvas, true);
Mike Reed29859872018-01-08 08:25:27 -050046 const SkRect dstR = SkRect::Make(canvas->imageInfo().bounds());
47 fAnimation->render(canvas, &dstR);
Florin Malita094ccde2017-12-30 12:27:00 -050048 }
49}
50
51bool SkottySlide::animate(const SkAnimTimer& timer) {
52 if (fTimeBase == 0) {
53 // Reset the animation time.
54 fTimeBase = timer.msec();
55 }
56
57 if (fAnimation) {
58 auto t = timer.msec() - fTimeBase;
59 fAnimation->animationTick(t);
60 }
61 return true;
62}
63
64bool SkottySlide::onChar(SkUnichar c) {
65 switch (c) {
66 case 'I':
67 if (fAnimation) {
68 fShowAnimationInval = !fShowAnimationInval;
69 fAnimation->setShowInval(fShowAnimationInval);
70 }
71 break;
72 default:
73 break;
74 }
75
76 return INHERITED::onChar(c);
77}