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