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