1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 10cb93a386Sopenharmony_ci#include "include/utils/SkAnimCodecPlayer.h" 11cb93a386Sopenharmony_ci#include "modules/skottie/include/Skottie.h" 12cb93a386Sopenharmony_ci#include "modules/skottie/include/SkottieProperty.h" 13cb93a386Sopenharmony_ci#include "modules/skottie/utils/SkottieUtils.h" 14cb93a386Sopenharmony_ci#include "modules/skresources/include/SkResources.h" 15cb93a386Sopenharmony_ci#include "tools/Resources.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#include <cmath> 18cb93a386Sopenharmony_ci#include <vector> 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cinamespace { 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cistatic constexpr char kWebFontResource[] = "fonts/Roboto-Regular.ttf"; 23cb93a386Sopenharmony_cistatic constexpr char kSkottieResource[] = "skottie/skottie_sample_webfont.json"; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci// Mock web font loader which serves a single local font (checked in under resources/). 26cb93a386Sopenharmony_ciclass FakeWebFontProvider final : public skresources::ResourceProvider { 27cb93a386Sopenharmony_cipublic: 28cb93a386Sopenharmony_ci FakeWebFontProvider() 29cb93a386Sopenharmony_ci : fTypeface(SkTypeface::MakeFromData(GetResourceAsData(kWebFontResource))) {} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci sk_sp<SkTypeface> loadTypeface(const char[], const char[]) const override { 32cb93a386Sopenharmony_ci return fTypeface; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ciprivate: 36cb93a386Sopenharmony_ci sk_sp<SkTypeface> fTypeface; 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci using INHERITED = skresources::ResourceProvider; 39cb93a386Sopenharmony_ci}; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci} // namespace 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ciclass SkottieExternalPropsGM : public skiagm::GM { 44cb93a386Sopenharmony_cipublic: 45cb93a386Sopenharmony_ciprotected: 46cb93a386Sopenharmony_ci SkString onShortName() override { 47cb93a386Sopenharmony_ci return SkString("skottie_external_props"); 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci SkISize onISize() override { 51cb93a386Sopenharmony_ci return SkISize::Make(kSize, kSize); 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 55cb93a386Sopenharmony_ci if (auto stream = GetResourceAsStream(kSkottieResource)) { 56cb93a386Sopenharmony_ci fPropManager = std::make_unique<skottie_utils::CustomPropertyManager>(); 57cb93a386Sopenharmony_ci fAnimation = skottie::Animation::Builder() 58cb93a386Sopenharmony_ci .setResourceProvider(sk_make_sp<FakeWebFontProvider>()) 59cb93a386Sopenharmony_ci .setPropertyObserver(fPropManager->getPropertyObserver()) 60cb93a386Sopenharmony_ci .make(stream.get()); 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override { 65cb93a386Sopenharmony_ci if (!fAnimation) { 66cb93a386Sopenharmony_ci *errorMsg = "No animation"; 67cb93a386Sopenharmony_ci return DrawResult::kFail; 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci for (size_t i = 0; i < 4; ++i) { 71cb93a386Sopenharmony_ci this->update_props(i); 72cb93a386Sopenharmony_ci auto dest = SkRect::MakeWH(kSize/2, kSize/2).makeOffset(kSize * (i & 1) / 2, 73cb93a386Sopenharmony_ci kSize * (i & 2) / 4); 74cb93a386Sopenharmony_ci fAnimation->render(canvas, &dest); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci return DrawResult::kOk; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci bool onAnimate(double nanos) override { 80cb93a386Sopenharmony_ci if (!fAnimation) { 81cb93a386Sopenharmony_ci return false; 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci const auto duration = fAnimation->duration(); 85cb93a386Sopenharmony_ci fAnimation->seek(std::fmod(1e-9 * nanos, duration) / duration); 86cb93a386Sopenharmony_ci return true; 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ciprivate: 90cb93a386Sopenharmony_ci void update_props(size_t i) { 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci SkASSERT(i < 4); 93cb93a386Sopenharmony_ci if (!i) { 94cb93a386Sopenharmony_ci return; 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci static constexpr struct { 98cb93a386Sopenharmony_ci const char* txt_string; 99cb93a386Sopenharmony_ci SkColor txt_color, 100cb93a386Sopenharmony_ci solid_color; 101cb93a386Sopenharmony_ci float transform_scale; 102cb93a386Sopenharmony_ci } gTests[] = { 103cb93a386Sopenharmony_ci { "update #1", SK_ColorRED , SK_ColorYELLOW, 100.f }, 104cb93a386Sopenharmony_ci { "update #2", SK_ColorGREEN , SK_ColorBLUE , 50.f }, 105cb93a386Sopenharmony_ci { "update #3", SK_ColorMAGENTA, SK_ColorCYAN , 150.f }, 106cb93a386Sopenharmony_ci }; 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ci SkASSERT(i - 1 < SK_ARRAY_COUNT(gTests)); 109cb93a386Sopenharmony_ci const auto& tst = gTests[i - 1]; 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci for (const auto& prop : fPropManager->getColorProps()) { 112cb93a386Sopenharmony_ci SkAssertResult(fPropManager->setColor(prop, tst.solid_color)); 113cb93a386Sopenharmony_ci } 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci for (const auto& prop : fPropManager->getTransformProps()) { 116cb93a386Sopenharmony_ci auto t = fPropManager->getTransform(prop); 117cb93a386Sopenharmony_ci t.fScale = {tst.transform_scale, tst.transform_scale}; 118cb93a386Sopenharmony_ci SkAssertResult(fPropManager->setTransform(prop, t)); 119cb93a386Sopenharmony_ci } 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci for (const auto& prop : fPropManager->getTextProps()) { 122cb93a386Sopenharmony_ci auto txt = fPropManager->getText(prop); 123cb93a386Sopenharmony_ci txt.fText.set(tst.txt_string); 124cb93a386Sopenharmony_ci txt.fFillColor = tst.txt_color; 125cb93a386Sopenharmony_ci SkAssertResult(fPropManager->setText(prop, txt)); 126cb93a386Sopenharmony_ci } 127cb93a386Sopenharmony_ci } 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci inline static constexpr SkScalar kSize = 800; 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ci sk_sp<skottie::Animation> fAnimation; 132cb93a386Sopenharmony_ci std::unique_ptr<skottie_utils::CustomPropertyManager> fPropManager; 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci using INHERITED = skiagm::GM; 135cb93a386Sopenharmony_ci}; 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ciDEF_GM(return new SkottieExternalPropsGM;) 138