blob: b6bc98029977e486a6bae20fb2c842ded76b332e [file] [log] [blame]
Florin Malita45cd2002020-06-09 14:00:54 -04001/*
2 * Copyright 2020 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 "tools/viewer/SkRiveSlide.h"
9
10#include "include/core/SkCanvas.h"
11#include "include/core/SkStream.h"
12
13#if defined(SK_ENABLE_SKRIVE)
14
15SkRiveSlide::SkRiveSlide(const SkString& name, const SkString& path)
16 : fPath(path) {
17 fName = name;
18}
19
20SkRiveSlide::~SkRiveSlide() = default;
21
22void SkRiveSlide::load(SkScalar w, SkScalar h) {
23 fWinSize = {w , h};
24 fRive = skrive::SkRive::Builder().make(SkFILEStream::Make(fPath.c_str()));
25 fRiveBounds = SkRect::MakeEmpty();
26
27 if (fRive) {
28 SkDebugf("Loaded Rive animation: %zu artboards\n", fRive->artboards().size());
29 for (const auto& ab : fRive->artboards()) {
30 const auto& pos = ab->getTranslation();
31 const auto& size = ab->getSize();
32
33 fRiveBounds.join(SkRect::MakeXYWH(pos.x, pos.y, size.x, size.y));
34 }
35 } else {
36 SkDebugf("Failed to load Rive animation: %s\n", fPath.c_str());
37 }
38}
39
40void SkRiveSlide::unload() {
41 fRive.reset();
42}
43
44void SkRiveSlide::resize(SkScalar w, SkScalar h) {
45 fWinSize = {w , h};
46}
47
48SkISize SkRiveSlide::getDimensions() const {
49 // We always scale to fill the window.
50 return fWinSize.toCeil();
51}
52
53void SkRiveSlide::draw(SkCanvas* canvas) {
54 if (!fRive) {
55 return;
56 }
57
58 // Scale the Rive artboards to fill our window.
59 SkAutoCanvasRestore acr(canvas, true);
Mike Reed2ac6ce82021-01-15 12:26:22 -050060 canvas->concat(SkMatrix::RectToRect(fRiveBounds, SkRect::MakeSize(fWinSize),
61 SkMatrix::kCenter_ScaleToFit));
Florin Malita45cd2002020-06-09 14:00:54 -040062
63 for (const auto& ab : fRive->artboards()) {
Florin Malita45cd2002020-06-09 14:00:54 -040064 ab->render(canvas);
65 }
66}
67
68#endif // defined(SK_ENABLE_SKRIVE)