1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include <iostream>
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/Skottie.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/SkottieProperty.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker using namespace skottie;
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker namespace {
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker class FakeScalarExpressionEvaluator : public ExpressionEvaluator<float> {
21*c8dee2aaSAndroid Build Coastguard Worker public:
evaluate(float t)22*c8dee2aaSAndroid Build Coastguard Worker float evaluate(float t) override { return 7.0f; }
23*c8dee2aaSAndroid Build Coastguard Worker };
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker class FakeVectorExpressionEvaluator : public ExpressionEvaluator<std::vector<float>> {
26*c8dee2aaSAndroid Build Coastguard Worker public:
evaluate(float t)27*c8dee2aaSAndroid Build Coastguard Worker std::vector<float> evaluate(float t) override { return {0.1f, 0.2f, 0.3f, 1.0f}; }
28*c8dee2aaSAndroid Build Coastguard Worker };
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker class FakeStringExpressionEvaluator : public ExpressionEvaluator<SkString> {
31*c8dee2aaSAndroid Build Coastguard Worker public:
evaluate(float t)32*c8dee2aaSAndroid Build Coastguard Worker SkString evaluate(float t) override { return SkString("Hello, world!"); }
33*c8dee2aaSAndroid Build Coastguard Worker };
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker class FakeExpressionManager : public ExpressionManager {
36*c8dee2aaSAndroid Build Coastguard Worker public:
createNumberExpressionEvaluator(const char expression[])37*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ExpressionEvaluator<float>> createNumberExpressionEvaluator(
38*c8dee2aaSAndroid Build Coastguard Worker const char expression[]) override {
39*c8dee2aaSAndroid Build Coastguard Worker return sk_make_sp<FakeScalarExpressionEvaluator>();
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker
createStringExpressionEvaluator(const char expression[])42*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ExpressionEvaluator<SkString>> createStringExpressionEvaluator(
43*c8dee2aaSAndroid Build Coastguard Worker const char expression[]) override {
44*c8dee2aaSAndroid Build Coastguard Worker return sk_make_sp<FakeStringExpressionEvaluator>();
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker
createArrayExpressionEvaluator(const char expression[])47*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ExpressionEvaluator<std::vector<float>>> createArrayExpressionEvaluator(
48*c8dee2aaSAndroid Build Coastguard Worker const char expression[]) override {
49*c8dee2aaSAndroid Build Coastguard Worker return sk_make_sp<FakeVectorExpressionEvaluator>();
50*c8dee2aaSAndroid Build Coastguard Worker }
51*c8dee2aaSAndroid Build Coastguard Worker };
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker class FakePropertyObserver : public PropertyObserver {
54*c8dee2aaSAndroid Build Coastguard Worker public:
onOpacityProperty(const char node_name[],const LazyHandle<OpacityPropertyHandle> & opacity_handle)55*c8dee2aaSAndroid Build Coastguard Worker void onOpacityProperty(const char node_name[],
56*c8dee2aaSAndroid Build Coastguard Worker const LazyHandle<OpacityPropertyHandle>& opacity_handle) override {
57*c8dee2aaSAndroid Build Coastguard Worker opacity_handle_ = opacity_handle();
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker
onTransformProperty(const char node_name[],const LazyHandle<TransformPropertyHandle> & transform_handle)60*c8dee2aaSAndroid Build Coastguard Worker void onTransformProperty(const char node_name[],
61*c8dee2aaSAndroid Build Coastguard Worker const LazyHandle<TransformPropertyHandle>& transform_handle) override {
62*c8dee2aaSAndroid Build Coastguard Worker transform_handle_ = transform_handle();
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker
onColorProperty(const char node_name[],const LazyHandle<ColorPropertyHandle> & color_handle)65*c8dee2aaSAndroid Build Coastguard Worker void onColorProperty(const char node_name[],
66*c8dee2aaSAndroid Build Coastguard Worker const LazyHandle<ColorPropertyHandle>& color_handle) override {
67*c8dee2aaSAndroid Build Coastguard Worker color_handle_ = color_handle();
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
onTextProperty(const char node_name[],const LazyHandle<TextPropertyHandle> & text_handle)70*c8dee2aaSAndroid Build Coastguard Worker void onTextProperty(const char node_name[],
71*c8dee2aaSAndroid Build Coastguard Worker const LazyHandle<TextPropertyHandle>& text_handle) override {
72*c8dee2aaSAndroid Build Coastguard Worker text_handle_ = text_handle();
73*c8dee2aaSAndroid Build Coastguard Worker }
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<OpacityPropertyHandle> opacity_handle_;
76*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<TransformPropertyHandle> transform_handle_;
77*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ColorPropertyHandle> color_handle_;
78*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<TextPropertyHandle> text_handle_;
79*c8dee2aaSAndroid Build Coastguard Worker };
80*c8dee2aaSAndroid Build Coastguard Worker } // namespace
81*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(Skottie_Expression,r)82*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(Skottie_Expression, r) {
83*c8dee2aaSAndroid Build Coastguard Worker static constexpr char json[] =
84*c8dee2aaSAndroid Build Coastguard Worker R"({
85*c8dee2aaSAndroid Build Coastguard Worker "v": "5.2.1",
86*c8dee2aaSAndroid Build Coastguard Worker "w": 100,
87*c8dee2aaSAndroid Build Coastguard Worker "h": 100,
88*c8dee2aaSAndroid Build Coastguard Worker "fr": 10,
89*c8dee2aaSAndroid Build Coastguard Worker "ip": 0,
90*c8dee2aaSAndroid Build Coastguard Worker "op": 100,
91*c8dee2aaSAndroid Build Coastguard Worker "layers": [
92*c8dee2aaSAndroid Build Coastguard Worker {
93*c8dee2aaSAndroid Build Coastguard Worker "ip": 0,
94*c8dee2aaSAndroid Build Coastguard Worker "op": 100,
95*c8dee2aaSAndroid Build Coastguard Worker "ty": 1,
96*c8dee2aaSAndroid Build Coastguard Worker "nm": "My Layer",
97*c8dee2aaSAndroid Build Coastguard Worker "sr": 1,
98*c8dee2aaSAndroid Build Coastguard Worker "ks": {
99*c8dee2aaSAndroid Build Coastguard Worker "o": {
100*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
101*c8dee2aaSAndroid Build Coastguard Worker "k": 100,
102*c8dee2aaSAndroid Build Coastguard Worker "ix": 11,
103*c8dee2aaSAndroid Build Coastguard Worker "x": "fake; return value is specified by the FakeScalarExpressionEvaluator."
104*c8dee2aaSAndroid Build Coastguard Worker },
105*c8dee2aaSAndroid Build Coastguard Worker "r": {
106*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
107*c8dee2aaSAndroid Build Coastguard Worker "k": 0,
108*c8dee2aaSAndroid Build Coastguard Worker "ix": 10
109*c8dee2aaSAndroid Build Coastguard Worker },
110*c8dee2aaSAndroid Build Coastguard Worker "p": {
111*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
112*c8dee2aaSAndroid Build Coastguard Worker "k": [
113*c8dee2aaSAndroid Build Coastguard Worker 50,
114*c8dee2aaSAndroid Build Coastguard Worker 50,
115*c8dee2aaSAndroid Build Coastguard Worker 0
116*c8dee2aaSAndroid Build Coastguard Worker ],
117*c8dee2aaSAndroid Build Coastguard Worker "ix": 2,
118*c8dee2aaSAndroid Build Coastguard Worker "l": 2
119*c8dee2aaSAndroid Build Coastguard Worker },
120*c8dee2aaSAndroid Build Coastguard Worker "a": {
121*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
122*c8dee2aaSAndroid Build Coastguard Worker "k": [
123*c8dee2aaSAndroid Build Coastguard Worker 50,
124*c8dee2aaSAndroid Build Coastguard Worker 50,
125*c8dee2aaSAndroid Build Coastguard Worker 0
126*c8dee2aaSAndroid Build Coastguard Worker ],
127*c8dee2aaSAndroid Build Coastguard Worker "ix": 1,
128*c8dee2aaSAndroid Build Coastguard Worker "l": 2,
129*c8dee2aaSAndroid Build Coastguard Worker "x": "fake; return value is specified by the FakeArrayExpressionEvaluator."
130*c8dee2aaSAndroid Build Coastguard Worker },
131*c8dee2aaSAndroid Build Coastguard Worker "s": {
132*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
133*c8dee2aaSAndroid Build Coastguard Worker "k": [
134*c8dee2aaSAndroid Build Coastguard Worker 100,
135*c8dee2aaSAndroid Build Coastguard Worker 100,
136*c8dee2aaSAndroid Build Coastguard Worker 100
137*c8dee2aaSAndroid Build Coastguard Worker ],
138*c8dee2aaSAndroid Build Coastguard Worker "ix": 6,
139*c8dee2aaSAndroid Build Coastguard Worker "l": 2
140*c8dee2aaSAndroid Build Coastguard Worker }
141*c8dee2aaSAndroid Build Coastguard Worker },
142*c8dee2aaSAndroid Build Coastguard Worker "ef": [
143*c8dee2aaSAndroid Build Coastguard Worker {
144*c8dee2aaSAndroid Build Coastguard Worker "ty": 21,
145*c8dee2aaSAndroid Build Coastguard Worker "nm": "Fill",
146*c8dee2aaSAndroid Build Coastguard Worker "np": 9,
147*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill",
148*c8dee2aaSAndroid Build Coastguard Worker "ix": 1,
149*c8dee2aaSAndroid Build Coastguard Worker "en": 1,
150*c8dee2aaSAndroid Build Coastguard Worker "ef": [
151*c8dee2aaSAndroid Build Coastguard Worker {
152*c8dee2aaSAndroid Build Coastguard Worker "ty": 10,
153*c8dee2aaSAndroid Build Coastguard Worker "nm": "Fill Mask",
154*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0001",
155*c8dee2aaSAndroid Build Coastguard Worker "ix": 1,
156*c8dee2aaSAndroid Build Coastguard Worker "v": {
157*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
158*c8dee2aaSAndroid Build Coastguard Worker "k": 0,
159*c8dee2aaSAndroid Build Coastguard Worker "ix": 1
160*c8dee2aaSAndroid Build Coastguard Worker }
161*c8dee2aaSAndroid Build Coastguard Worker },
162*c8dee2aaSAndroid Build Coastguard Worker {
163*c8dee2aaSAndroid Build Coastguard Worker "ty": 7,
164*c8dee2aaSAndroid Build Coastguard Worker "nm": "All Masks",
165*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0007",
166*c8dee2aaSAndroid Build Coastguard Worker "ix": 2,
167*c8dee2aaSAndroid Build Coastguard Worker "v": {
168*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
169*c8dee2aaSAndroid Build Coastguard Worker "k": 0,
170*c8dee2aaSAndroid Build Coastguard Worker "ix": 2
171*c8dee2aaSAndroid Build Coastguard Worker }
172*c8dee2aaSAndroid Build Coastguard Worker },
173*c8dee2aaSAndroid Build Coastguard Worker {
174*c8dee2aaSAndroid Build Coastguard Worker "ty": 2,
175*c8dee2aaSAndroid Build Coastguard Worker "nm": "Color",
176*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0002",
177*c8dee2aaSAndroid Build Coastguard Worker "ix": 3,
178*c8dee2aaSAndroid Build Coastguard Worker "v": {
179*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
180*c8dee2aaSAndroid Build Coastguard Worker "k": [
181*c8dee2aaSAndroid Build Coastguard Worker 1,
182*c8dee2aaSAndroid Build Coastguard Worker 0,
183*c8dee2aaSAndroid Build Coastguard Worker 0,
184*c8dee2aaSAndroid Build Coastguard Worker 1
185*c8dee2aaSAndroid Build Coastguard Worker ],
186*c8dee2aaSAndroid Build Coastguard Worker "ix": 3,
187*c8dee2aaSAndroid Build Coastguard Worker "x": "fake; return value is specified by the FakeArrayExpressionEvaluator."
188*c8dee2aaSAndroid Build Coastguard Worker }
189*c8dee2aaSAndroid Build Coastguard Worker },
190*c8dee2aaSAndroid Build Coastguard Worker {
191*c8dee2aaSAndroid Build Coastguard Worker "ty": 7,
192*c8dee2aaSAndroid Build Coastguard Worker "nm": "Invert",
193*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0006",
194*c8dee2aaSAndroid Build Coastguard Worker "ix": 4,
195*c8dee2aaSAndroid Build Coastguard Worker "v": {
196*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
197*c8dee2aaSAndroid Build Coastguard Worker "k": 0,
198*c8dee2aaSAndroid Build Coastguard Worker "ix": 4
199*c8dee2aaSAndroid Build Coastguard Worker }
200*c8dee2aaSAndroid Build Coastguard Worker },
201*c8dee2aaSAndroid Build Coastguard Worker {
202*c8dee2aaSAndroid Build Coastguard Worker "ty": 0,
203*c8dee2aaSAndroid Build Coastguard Worker "nm": "Horizontal Feather",
204*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0003",
205*c8dee2aaSAndroid Build Coastguard Worker "ix": 5,
206*c8dee2aaSAndroid Build Coastguard Worker "v": {
207*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
208*c8dee2aaSAndroid Build Coastguard Worker "k": 0,
209*c8dee2aaSAndroid Build Coastguard Worker "ix": 5
210*c8dee2aaSAndroid Build Coastguard Worker }
211*c8dee2aaSAndroid Build Coastguard Worker },
212*c8dee2aaSAndroid Build Coastguard Worker {
213*c8dee2aaSAndroid Build Coastguard Worker "ty": 0,
214*c8dee2aaSAndroid Build Coastguard Worker "nm": "Vertical Feather",
215*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0004",
216*c8dee2aaSAndroid Build Coastguard Worker "ix": 6,
217*c8dee2aaSAndroid Build Coastguard Worker "v": {
218*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
219*c8dee2aaSAndroid Build Coastguard Worker "k": 0,
220*c8dee2aaSAndroid Build Coastguard Worker "ix": 6
221*c8dee2aaSAndroid Build Coastguard Worker }
222*c8dee2aaSAndroid Build Coastguard Worker },
223*c8dee2aaSAndroid Build Coastguard Worker {
224*c8dee2aaSAndroid Build Coastguard Worker "ty": 0,
225*c8dee2aaSAndroid Build Coastguard Worker "nm": "Opacity",
226*c8dee2aaSAndroid Build Coastguard Worker "mn": "ADBE Fill-0005",
227*c8dee2aaSAndroid Build Coastguard Worker "ix": 7,
228*c8dee2aaSAndroid Build Coastguard Worker "v": {
229*c8dee2aaSAndroid Build Coastguard Worker "a": 0,
230*c8dee2aaSAndroid Build Coastguard Worker "k": 1,
231*c8dee2aaSAndroid Build Coastguard Worker "ix": 7
232*c8dee2aaSAndroid Build Coastguard Worker }
233*c8dee2aaSAndroid Build Coastguard Worker }
234*c8dee2aaSAndroid Build Coastguard Worker ]
235*c8dee2aaSAndroid Build Coastguard Worker }
236*c8dee2aaSAndroid Build Coastguard Worker ],
237*c8dee2aaSAndroid Build Coastguard Worker "ao": 0,
238*c8dee2aaSAndroid Build Coastguard Worker "sw": 100,
239*c8dee2aaSAndroid Build Coastguard Worker "sh": 100,
240*c8dee2aaSAndroid Build Coastguard Worker "sc": "#000000",
241*c8dee2aaSAndroid Build Coastguard Worker "st": 0,
242*c8dee2aaSAndroid Build Coastguard Worker "bm": 0
243*c8dee2aaSAndroid Build Coastguard Worker }
244*c8dee2aaSAndroid Build Coastguard Worker ]
245*c8dee2aaSAndroid Build Coastguard Worker })";
246*c8dee2aaSAndroid Build Coastguard Worker
247*c8dee2aaSAndroid Build Coastguard Worker SkMemoryStream stream(json, strlen(json));
248*c8dee2aaSAndroid Build Coastguard Worker
249*c8dee2aaSAndroid Build Coastguard Worker auto em = sk_make_sp<FakeExpressionManager>();
250*c8dee2aaSAndroid Build Coastguard Worker auto observer = sk_make_sp<FakePropertyObserver>();
251*c8dee2aaSAndroid Build Coastguard Worker
252*c8dee2aaSAndroid Build Coastguard Worker auto anim = Animation::Builder()
253*c8dee2aaSAndroid Build Coastguard Worker .setExpressionManager(em)
254*c8dee2aaSAndroid Build Coastguard Worker .setFontManager(ToolUtils::TestFontMgr())
255*c8dee2aaSAndroid Build Coastguard Worker .setPropertyObserver(observer)
256*c8dee2aaSAndroid Build Coastguard Worker .make(&stream);
257*c8dee2aaSAndroid Build Coastguard Worker
258*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, anim);
259*c8dee2aaSAndroid Build Coastguard Worker
260*c8dee2aaSAndroid Build Coastguard Worker anim->seekFrameTime(0);
261*c8dee2aaSAndroid Build Coastguard Worker
262*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkScalarNearlyEqual(observer->opacity_handle_->get(), 7.0f));
263*c8dee2aaSAndroid Build Coastguard Worker SkPoint anchor_point = observer->transform_handle_->get().fAnchorPoint;
264*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkScalarNearlyEqual(anchor_point.fX, 0.1f));
265*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkScalarNearlyEqual(anchor_point.fY, 0.2f));
266*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (observer->color_handle_->get() == SkColor4f{0.1f, 0.2f, 0.3f, 1.0f}.toSkColor()));
267*c8dee2aaSAndroid Build Coastguard Worker }
268*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(Skottie_ExpressionText,r)269*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(Skottie_ExpressionText, r) {
270*c8dee2aaSAndroid Build Coastguard Worker static constexpr char text_json[] =
271*c8dee2aaSAndroid Build Coastguard Worker R"({
272*c8dee2aaSAndroid Build Coastguard Worker "layers":[
273*c8dee2aaSAndroid Build Coastguard Worker {
274*c8dee2aaSAndroid Build Coastguard Worker "ty":5,
275*c8dee2aaSAndroid Build Coastguard Worker "ks":{
276*c8dee2aaSAndroid Build Coastguard Worker "a":{
277*c8dee2aaSAndroid Build Coastguard Worker "k":[
278*c8dee2aaSAndroid Build Coastguard Worker 0,
279*c8dee2aaSAndroid Build Coastguard Worker 0
280*c8dee2aaSAndroid Build Coastguard Worker ]
281*c8dee2aaSAndroid Build Coastguard Worker },
282*c8dee2aaSAndroid Build Coastguard Worker "p":{
283*c8dee2aaSAndroid Build Coastguard Worker "k":[
284*c8dee2aaSAndroid Build Coastguard Worker 128,
285*c8dee2aaSAndroid Build Coastguard Worker 144
286*c8dee2aaSAndroid Build Coastguard Worker ]
287*c8dee2aaSAndroid Build Coastguard Worker },
288*c8dee2aaSAndroid Build Coastguard Worker "o":{
289*c8dee2aaSAndroid Build Coastguard Worker "k":100
290*c8dee2aaSAndroid Build Coastguard Worker }
291*c8dee2aaSAndroid Build Coastguard Worker },
292*c8dee2aaSAndroid Build Coastguard Worker "ind":0,
293*c8dee2aaSAndroid Build Coastguard Worker "ip":0,
294*c8dee2aaSAndroid Build Coastguard Worker "op":2,
295*c8dee2aaSAndroid Build Coastguard Worker "nm":"TextLayer_0",
296*c8dee2aaSAndroid Build Coastguard Worker "t":{
297*c8dee2aaSAndroid Build Coastguard Worker "d":{
298*c8dee2aaSAndroid Build Coastguard Worker "k":[
299*c8dee2aaSAndroid Build Coastguard Worker {
300*c8dee2aaSAndroid Build Coastguard Worker "t":0,
301*c8dee2aaSAndroid Build Coastguard Worker "s":{
302*c8dee2aaSAndroid Build Coastguard Worker "f": "Helvetica",
303*c8dee2aaSAndroid Build Coastguard Worker "s":14,
304*c8dee2aaSAndroid Build Coastguard Worker "t":"will be replaced.",
305*c8dee2aaSAndroid Build Coastguard Worker "j":0,
306*c8dee2aaSAndroid Build Coastguard Worker "ps":[
307*c8dee2aaSAndroid Build Coastguard Worker 0,
308*c8dee2aaSAndroid Build Coastguard Worker 0
309*c8dee2aaSAndroid Build Coastguard Worker ],
310*c8dee2aaSAndroid Build Coastguard Worker "sz":[
311*c8dee2aaSAndroid Build Coastguard Worker 384,
312*c8dee2aaSAndroid Build Coastguard Worker 360
313*c8dee2aaSAndroid Build Coastguard Worker ],
314*c8dee2aaSAndroid Build Coastguard Worker "fc":[
315*c8dee2aaSAndroid Build Coastguard Worker 0.95686274766921997,
316*c8dee2aaSAndroid Build Coastguard Worker 0.37254902720451355,
317*c8dee2aaSAndroid Build Coastguard Worker 0.25490197539329529,
318*c8dee2aaSAndroid Build Coastguard Worker 1
319*c8dee2aaSAndroid Build Coastguard Worker ],
320*c8dee2aaSAndroid Build Coastguard Worker "lh":16
321*c8dee2aaSAndroid Build Coastguard Worker }
322*c8dee2aaSAndroid Build Coastguard Worker }
323*c8dee2aaSAndroid Build Coastguard Worker ],
324*c8dee2aaSAndroid Build Coastguard Worker "x": "fake; return value is specified by the FakeStringExpressionEvaluator."
325*c8dee2aaSAndroid Build Coastguard Worker }
326*c8dee2aaSAndroid Build Coastguard Worker }
327*c8dee2aaSAndroid Build Coastguard Worker }
328*c8dee2aaSAndroid Build Coastguard Worker ],
329*c8dee2aaSAndroid Build Coastguard Worker "ip":0,
330*c8dee2aaSAndroid Build Coastguard Worker "op":2,
331*c8dee2aaSAndroid Build Coastguard Worker "fr":25,
332*c8dee2aaSAndroid Build Coastguard Worker "w":1280,
333*c8dee2aaSAndroid Build Coastguard Worker "h":720,
334*c8dee2aaSAndroid Build Coastguard Worker "ddd":false,
335*c8dee2aaSAndroid Build Coastguard Worker "v":"5.2.2",
336*c8dee2aaSAndroid Build Coastguard Worker "nm":"skottie_animation",
337*c8dee2aaSAndroid Build Coastguard Worker "fonts":{
338*c8dee2aaSAndroid Build Coastguard Worker "list":[
339*c8dee2aaSAndroid Build Coastguard Worker {
340*c8dee2aaSAndroid Build Coastguard Worker "fName": "Helvetica",
341*c8dee2aaSAndroid Build Coastguard Worker "fFamily":"external_font_family",
342*c8dee2aaSAndroid Build Coastguard Worker "fStyle":"Regular"
343*c8dee2aaSAndroid Build Coastguard Worker }
344*c8dee2aaSAndroid Build Coastguard Worker ]
345*c8dee2aaSAndroid Build Coastguard Worker }
346*c8dee2aaSAndroid Build Coastguard Worker })";
347*c8dee2aaSAndroid Build Coastguard Worker
348*c8dee2aaSAndroid Build Coastguard Worker SkMemoryStream stream(text_json, strlen(text_json));
349*c8dee2aaSAndroid Build Coastguard Worker
350*c8dee2aaSAndroid Build Coastguard Worker auto em = sk_make_sp<FakeExpressionManager>();
351*c8dee2aaSAndroid Build Coastguard Worker auto observer = sk_make_sp<FakePropertyObserver>();
352*c8dee2aaSAndroid Build Coastguard Worker
353*c8dee2aaSAndroid Build Coastguard Worker auto anim = Animation::Builder()
354*c8dee2aaSAndroid Build Coastguard Worker .setExpressionManager(em)
355*c8dee2aaSAndroid Build Coastguard Worker .setFontManager(ToolUtils::TestFontMgr())
356*c8dee2aaSAndroid Build Coastguard Worker .setPropertyObserver(observer)
357*c8dee2aaSAndroid Build Coastguard Worker .make(&stream);
358*c8dee2aaSAndroid Build Coastguard Worker
359*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, anim);
360*c8dee2aaSAndroid Build Coastguard Worker
361*c8dee2aaSAndroid Build Coastguard Worker anim->seekFrameTime(0);
362*c8dee2aaSAndroid Build Coastguard Worker
363*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, observer->text_handle_->get().fText == SkString("Hello, world!"));
364*c8dee2aaSAndroid Build Coastguard Worker }
365