blob: c8a4a2790fab9b944191e5c5b4b89e25fe122f93 [file] [log] [blame]
Florin Malita26870722018-09-20 14:35:30 -04001/*
2 * Copyright 2017 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 "gm.h"
9#include "Resources.h"
Florin Malita62c6bd92018-10-03 14:39:56 -040010#include "SkAnimCodecPlayer.h"
Florin Malita26870722018-09-20 14:35:30 -040011#include "SkAnimTimer.h"
Florin Malita17282da2018-09-25 13:10:12 -040012#include "SkColor.h"
Florin Malita62c6bd92018-10-03 14:39:56 -040013#include "SkMakeUnique.h"
Florin Malita26870722018-09-20 14:35:30 -040014#include "Skottie.h"
Florin Malita17282da2018-09-25 13:10:12 -040015#include "SkottieProperty.h"
Florin Malitaa8316552018-11-09 16:19:44 -050016#include "SkottieUtils.h"
Florin Malita26870722018-09-20 14:35:30 -040017
18#include <cmath>
Florin Malita17282da2018-09-25 13:10:12 -040019#include <vector>
20
21using namespace skottie;
Florin Malita26870722018-09-20 14:35:30 -040022
23namespace {
24
25static constexpr char kWebFontResource[] = "fonts/Roboto-Regular.ttf";
26static constexpr char kSkottieResource[] = "skottie/skottie_sample_webfont.json";
27
28// Dummy web font loader which serves a single local font (checked in under resources/).
Florin Malita17282da2018-09-25 13:10:12 -040029class FakeWebFontProvider final : public ResourceProvider {
Florin Malita26870722018-09-20 14:35:30 -040030public:
31 FakeWebFontProvider() : fFontData(GetResourceAsData(kWebFontResource)) {}
32
Florin Malita97b150e2018-09-27 10:59:52 -040033 sk_sp<SkData> loadFont(const char[], const char[]) const override {
Florin Malita26870722018-09-20 14:35:30 -040034 return fFontData;
35 }
36
37private:
38 sk_sp<SkData> fFontData;
39
Florin Malita17282da2018-09-25 13:10:12 -040040 using INHERITED = ResourceProvider;
Florin Malita26870722018-09-20 14:35:30 -040041};
42
43} // namespace
44
45class SkottieWebFontGM : public skiagm::GM {
46public:
47protected:
48 SkString onShortName() override {
49 return SkString("skottie_webfont");
50 }
51
52 SkISize onISize() override {
53 return SkISize::Make(kSize, kSize);
54 }
55
56 void onOnceBeforeDraw() override {
57 if (auto stream = GetResourceAsStream(kSkottieResource)) {
Florin Malita17282da2018-09-25 13:10:12 -040058 fAnimation = Animation::Builder()
Florin Malita26870722018-09-20 14:35:30 -040059 .setResourceProvider(sk_make_sp<FakeWebFontProvider>())
60 .make(stream.get());
61 }
62 }
63
64 void onDraw(SkCanvas* canvas) override {
65 if (!fAnimation) {
66 return;
67 }
68
69 auto dest = SkRect::MakeWH(kSize, kSize);
70 fAnimation->render(canvas, &dest);
71 }
72
73 bool onAnimate(const SkAnimTimer& timer) override {
74 if (!fAnimation) {
75 return false;
76 }
77
78 const auto duration = fAnimation->duration();
79 fAnimation->seek(std::fmod(timer.secs(), duration) / duration);
80 return true;
81 }
82
83private:
84 static constexpr SkScalar kSize = 800;
85
Florin Malita17282da2018-09-25 13:10:12 -040086 sk_sp<Animation> fAnimation;
Florin Malita26870722018-09-20 14:35:30 -040087
88 using INHERITED = skiagm::GM;
89};
90
91DEF_GM(return new SkottieWebFontGM;)
Florin Malita17282da2018-09-25 13:10:12 -040092
Florin Malita8ac81b72018-11-28 11:39:39 -050093using namespace skottie_utils;
94
Florin Malita17282da2018-09-25 13:10:12 -040095class SkottieColorizeGM : public skiagm::GM {
Florin Malita17282da2018-09-25 13:10:12 -040096protected:
97 SkString onShortName() override {
98 return SkString("skottie_colorize");
99 }
100
101 SkISize onISize() override {
102 return SkISize::Make(kSize, kSize);
103 }
104
105 void onOnceBeforeDraw() override {
106 if (auto stream = GetResourceAsStream("skottie/skottie_sample_search.json")) {
Florin Malita91af8d82018-11-30 16:46:45 -0500107 fPropManager = skstd::make_unique<CustomPropertyManager>();
Florin Malita8ac81b72018-11-28 11:39:39 -0500108 fAnimation = Animation::Builder()
Florin Malita91af8d82018-11-30 16:46:45 -0500109 .setPropertyObserver(fPropManager->getPropertyObserver())
Florin Malita8ac81b72018-11-28 11:39:39 -0500110 .make(stream.get());
Florin Malita8ac81b72018-11-28 11:39:39 -0500111 fColors = fPropManager->getColorProps();
Florin Malita17282da2018-09-25 13:10:12 -0400112 }
113 }
114
115 void onDraw(SkCanvas* canvas) override {
116 if (!fAnimation) {
117 return;
118 }
119
120 auto dest = SkRect::MakeWH(kSize, kSize);
121 fAnimation->render(canvas, &dest);
122 }
123
124 bool onAnimate(const SkAnimTimer& timer) override {
125 if (!fAnimation) {
126 return false;
127 }
128
129 const auto duration = fAnimation->duration();
130 fAnimation->seek(std::fmod(timer.secs(), duration) / duration);
131 return true;
132 }
133
Florin Malita17282da2018-09-25 13:10:12 -0400134 bool onHandleKey(SkUnichar uni) override {
135 static constexpr SkColor kColors[] = {
136 SK_ColorBLACK,
137 SK_ColorRED,
138 SK_ColorGREEN,
139 SK_ColorYELLOW,
140 SK_ColorCYAN,
141 };
142
143 if (uni == 'c') {
144 fColorIndex = (fColorIndex + 1) % SK_ARRAY_COUNT(kColors);
Florin Malita8ac81b72018-11-28 11:39:39 -0500145 for (const auto& prop : fColors) {
146 fPropManager->setColor(prop, kColors[fColorIndex]);
147 }
Florin Malita17282da2018-09-25 13:10:12 -0400148 return true;
149 }
150
151 return false;
152 }
153
154private:
Florin Malita17282da2018-09-25 13:10:12 -0400155 static constexpr SkScalar kSize = 800;
156
Florin Malita8ac81b72018-11-28 11:39:39 -0500157 sk_sp<Animation> fAnimation;
158 std::unique_ptr<CustomPropertyManager> fPropManager;
159 std::vector<CustomPropertyManager::PropKey> fColors;
160 size_t fColorIndex = 0;
Florin Malita17282da2018-09-25 13:10:12 -0400161
162 using INHERITED = skiagm::GM;
163};
164
165DEF_GM(return new SkottieColorizeGM;)
Florin Malita62c6bd92018-10-03 14:39:56 -0400166
167class SkottieMultiFrameGM : public skiagm::GM {
168public:
169protected:
170 SkString onShortName() override {
171 return SkString("skottie_multiframe");
172 }
173
174 SkISize onISize() override {
175 return SkISize::Make(kSize, kSize);
176 }
177
178 void onOnceBeforeDraw() override {
179 if (auto stream = GetResourceAsStream("skottie/skottie_sample_multiframe.json")) {
180 fAnimation = Animation::Builder()
181 .setResourceProvider(sk_make_sp<MultiFrameResourceProvider>())
182 .make(stream.get());
183 }
184 }
185
186 void onDraw(SkCanvas* canvas) override {
187 if (!fAnimation) {
188 return;
189 }
190
191 auto dest = SkRect::MakeWH(kSize, kSize);
192 fAnimation->render(canvas, &dest);
193 }
194
195 bool onAnimate(const SkAnimTimer& timer) override {
196 if (!fAnimation) {
197 return false;
198 }
199
200 const auto duration = fAnimation->duration();
201 fAnimation->seek(std::fmod(timer.secs(), duration) / duration);
202 return true;
203 }
204
205private:
Florin Malita62c6bd92018-10-03 14:39:56 -0400206 class MultiFrameResourceProvider final : public skottie::ResourceProvider {
207 public:
208 sk_sp<ImageAsset> loadImageAsset(const char[], const char[]) const override {
Florin Malitaa8316552018-11-09 16:19:44 -0500209 return skottie_utils::MultiFrameImageAsset::Make(
210 GetResourceAsData("images/flightAnim.gif"));
Florin Malita62c6bd92018-10-03 14:39:56 -0400211 }
212 };
213
214 static constexpr SkScalar kSize = 800;
215
216 sk_sp<Animation> fAnimation;
217
218 using INHERITED = skiagm::GM;
219};
220
221DEF_GM(return new SkottieMultiFrameGM;)