xref: /aosp_15_r20/external/skia/modules/skottie/tests/Expression.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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