/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/viewer/SkRiveSlide.h" #include "include/core/SkCanvas.h" #include "include/core/SkStream.h" #if defined(SK_ENABLE_SKRIVE) SkRiveSlide::SkRiveSlide(const SkString& name, const SkString& path) : fPath(path) { fName = name; } SkRiveSlide::~SkRiveSlide() = default; void SkRiveSlide::load(SkScalar w, SkScalar h) { fWinSize = {w , h}; fRive = skrive::SkRive::Builder().make(SkFILEStream::Make(fPath.c_str())); fRiveBounds = SkRect::MakeEmpty(); if (fRive) { SkDebugf("Loaded Rive animation: %zu artboards\n", fRive->artboards().size()); for (const auto& ab : fRive->artboards()) { const auto& pos = ab->getTranslation(); const auto& size = ab->getSize(); fRiveBounds.join(SkRect::MakeXYWH(pos.x, pos.y, size.x, size.y)); } } else { SkDebugf("Failed to load Rive animation: %s\n", fPath.c_str()); } } void SkRiveSlide::unload() { fRive.reset(); } void SkRiveSlide::resize(SkScalar w, SkScalar h) { fWinSize = {w , h}; } SkISize SkRiveSlide::getDimensions() const { // We always scale to fill the window. return fWinSize.toCeil(); } void SkRiveSlide::draw(SkCanvas* canvas) { if (!fRive) { return; } // Scale the Rive artboards to fill our window. SkAutoCanvasRestore acr(canvas, true); canvas->concat(SkMatrix::RectToRect(fRiveBounds, SkRect::MakeSize(fWinSize), SkMatrix::kCenter_ScaleToFit)); for (const auto& ab : fRive->artboards()) { ab->render(canvas); } } #endif // defined(SK_ENABLE_SKRIVE)