1/*
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);
60    canvas->concat(SkMatrix::RectToRect(fRiveBounds, SkRect::MakeSize(fWinSize),
61                                        SkMatrix::kCenter_ScaleToFit));
62
63    for (const auto& ab : fRive->artboards()) {
64        ab->render(canvas);
65    }
66}
67
68#endif // defined(SK_ENABLE_SKRIVE)
69