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