|  | /* | 
|  | * Copyright 2016 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "bench/Benchmark.h" | 
|  | #include "include/core/SkBitmap.h" | 
|  | #include "include/core/SkFontMgr.h" | 
|  | #include "include/core/SkPicture.h" | 
|  | #include "include/core/SkPictureRecorder.h" | 
|  | #include "modules/skottie/include/Skottie.h" | 
|  | #include "tools/DecodeUtils.h" | 
|  | #include "tools/Resources.h" | 
|  | #include "tools/fonts/FontToolUtils.h" | 
|  |  | 
|  | class DecodeBench : public Benchmark { | 
|  | protected: | 
|  | DecodeBench(const char* name, const char* source) | 
|  | : fName(SkStringPrintf("decode_%s", name)) | 
|  | , fSource(source) | 
|  | {} | 
|  |  | 
|  | bool isSuitableFor(Backend backend) final { | 
|  | return backend == Backend::kNonRendering; | 
|  | } | 
|  |  | 
|  | const char* onGetName() final { return fName.c_str(); } | 
|  |  | 
|  | void onDelayedSetup() override { | 
|  | fData = GetResourceAsData(fSource); | 
|  | SkASSERT(fData); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | sk_sp<SkData>  fData; | 
|  |  | 
|  | private: | 
|  | const SkString fName; | 
|  | const char*    fSource; | 
|  | }; | 
|  |  | 
|  | class BitmapDecodeBench final : public DecodeBench { | 
|  | public: | 
|  | BitmapDecodeBench(const char* name, const char* source) | 
|  | : INHERITED(name, source) | 
|  | {} | 
|  |  | 
|  | void onDraw(int loops, SkCanvas*) override { | 
|  | while (loops-- > 0) { | 
|  | SkBitmap bm; | 
|  | SkAssertResult(ToolUtils::DecodeDataToBitmap(fData, &bm)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | using INHERITED = DecodeBench; | 
|  | }; | 
|  |  | 
|  |  | 
|  | class SkottieDecodeBench final : public DecodeBench { | 
|  | public: | 
|  | SkottieDecodeBench(const char* name, const char* source) | 
|  | : INHERITED(name, source) | 
|  | {} | 
|  |  | 
|  | void onDraw(int loops, SkCanvas*) override { | 
|  | while (loops-- > 0) { | 
|  | const auto anim = skottie::Animation::Builder() | 
|  | .setFontManager(ToolUtils::TestFontMgr()) | 
|  | .make(reinterpret_cast<const char*>(fData->data()), | 
|  | fData->size()); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | using INHERITED = DecodeBench; | 
|  | }; | 
|  |  | 
|  | class SkottiePictureDecodeBench final : public DecodeBench { | 
|  | public: | 
|  | SkottiePictureDecodeBench(const char* name, const char* source) | 
|  | : INHERITED(name, source) | 
|  | {} | 
|  |  | 
|  | void onDraw(int loops, SkCanvas*) override { | 
|  | while (loops-- > 0) { | 
|  | const auto anim = skottie::Animation::Builder() | 
|  | .setFontManager(ToolUtils::TestFontMgr()) | 
|  | .make(reinterpret_cast<const char*>(fData->data()), | 
|  | fData->size()); | 
|  | SkPictureRecorder recorder; | 
|  | anim->seek(0); | 
|  | anim->render(recorder.beginRecording(anim->size().width(), anim->size().height())); | 
|  |  | 
|  | const auto pic = recorder.finishRecordingAsPicture(); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | using INHERITED = DecodeBench; | 
|  | }; | 
|  |  | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_large",  // 426593 | 
|  | "skottie/skottie-text-scale-to-fit-minmax.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_medium", //  10947 | 
|  | "skottie/skottie-sphere-effect.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_small",  //   1112 | 
|  | "skottie/skottie_sample_multiframe.json")); | 
|  | // Created from PhoneHub assets SVG source, with https://lottiefiles.com/svg-to-lottie | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_connecting.json",    // 216x216 | 
|  | "skottie/skottie-phonehub-connecting.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_generic_error.json", // 216x217 | 
|  | "skottie/skottie-phonehub-generic-error.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_onboard.json",       // 217x217 | 
|  | "skottie/skottie-phonehub-onboard.json")); | 
|  | // Created from PhoneHub assets SVG source, with https://jakearchibald.github.io/svgomg/ and then | 
|  | // https://lottiefiles.com/svg-to-lottie | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_connecting.json", | 
|  | "skottie/skottie-phonehub-svgo-connecting.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_generic_error.json", | 
|  | "skottie/skottie-phonehub-svgo-generic-error.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_onboard.json", | 
|  | "skottie/skottie-phonehub-svgo-onboard.json")); | 
|  | // Created from PhoneHub assets SVG source: | 
|  | // 1. Manually edited to have no masks (but look the same as the original) | 
|  | // 2. https://jakearchibald.github.io/svgomg/ | 
|  | // 3. https://lottiefiles.com/svg-to-lottie | 
|  | // Note: The Generic Error asset is excluded here because it has no masks in the first place. | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_masks_connecting.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-connecting.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_masks_onboard.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-onboard.json")); | 
|  | // Created from PhoneHub assets SVG source: | 
|  | // 1. Manually edited to use only the most basic functionality of SVG (but look the same as the | 
|  | //    original) | 
|  | // 2. https://jakearchibald.github.io/svgomg/ | 
|  | // 3. https://lottiefiles.com/svg-to-lottie | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_frills_connecting.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-connecting.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench( | 
|  | "skottie_phonehub_svgo_no_frills_generic_error.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-generic-error.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_frills_onboard.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-onboard.json")); | 
|  | // All of the above PhoneHub benchmarks, with https://skia-review.googlesource.com/c/skia/+/141265 | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_connecting_min.json", | 
|  | "skottie/skottie-phonehub-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_generic_error_min.json", | 
|  | "skottie/skottie-phonehub-generic-error_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_onboard_min.json", | 
|  | "skottie/skottie-phonehub-onboard_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_connecting_min.json", | 
|  | "skottie/skottie-phonehub-svgo-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_generic_error_min.json", | 
|  | "skottie/skottie-phonehub-svgo-generic-error_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_onboard_min.json", | 
|  | "skottie/skottie-phonehub-svgo-onboard_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench( | 
|  | "skottie_phonehub_svgo_no_masks_connecting_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_masks_onboard_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-onboard_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench( | 
|  | "skottie_phonehub_svgo_no_frills_connecting_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottieDecodeBench( | 
|  | "skottie_phonehub_svgo_no_frills_generic_error_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-generic-error_min.json")); | 
|  | DEF_BENCH( | 
|  | return new SkottieDecodeBench("skottie_phonehub_svgo_no_frills_onboard_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-onboard_min.json")); | 
|  |  | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_large", | 
|  | "skottie/skottie-text-scale-to-fit-minmax.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_medium", | 
|  | "skottie/skottie-sphere-effect.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_small", | 
|  | "skottie/skottie_sample_multiframe.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_connecting.json", | 
|  | "skottie/skottie-phonehub-connecting.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_generic_error.json", | 
|  | "skottie/skottie-phonehub-generic-error.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_onboard.json", | 
|  | "skottie/skottie-phonehub-onboard.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_connecting.json", | 
|  | "skottie/skottie-phonehub-svgo-connecting.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_generic_error.json", | 
|  | "skottie/skottie-phonehub-svgo-generic-error.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_onboard.json", | 
|  | "skottie/skottie-phonehub-svgo-onboard.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_masks_connecting.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-connecting.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_masks_onboard.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-onboard.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_frills_connecting.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-connecting.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_frills_generic_error.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-generic-error.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_frills_onboard.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-onboard.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_connecting_min.json", | 
|  | "skottie/skottie-phonehub-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_generic_error_min.json", | 
|  | "skottie/skottie-phonehub-generic-error_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_onboard_min.json", | 
|  | "skottie/skottie-phonehub-onboard_min.json")); | 
|  | DEF_BENCH( | 
|  | return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_connecting_min.json", | 
|  | "skottie/skottie-phonehub-svgo-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_generic_error_min.json", | 
|  | "skottie/skottie-phonehub-svgo-generic-error_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_onboard_min.json", | 
|  | "skottie/skottie-phonehub-svgo-onboard_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_masks_connecting_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_masks_onboard_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-masks-onboard_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_frills_connecting_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-connecting_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_frills_generic_error_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-generic-error_min.json")); | 
|  | DEF_BENCH(return new SkottiePictureDecodeBench( | 
|  | "skottiepic_phonehub_svgo_no_frills_onboard_min.json", | 
|  | "skottie/skottie-phonehub-svgo-no-frills-onboard_min.json")); | 
|  |  | 
|  | DEF_BENCH(return new BitmapDecodeBench("png_large"    /*1600x1600*/, "images/mandrill_1600.png")); | 
|  | DEF_BENCH(return new BitmapDecodeBench("png_medium"   /* 512x 512*/, "images/mandrill_512.png")); | 
|  | DEF_BENCH(return new BitmapDecodeBench("png_small"    /*  32x  32*/, "images/mandrill_32.png")); | 
|  | DEF_BENCH(return new BitmapDecodeBench("png_phonehub_connecting"   , "images/Connecting.png")); | 
|  | DEF_BENCH(return new BitmapDecodeBench("png_phonehub_generic_error", "images/Generic_Error.png")); | 
|  | DEF_BENCH(return new BitmapDecodeBench("png_phonehub_onboard"      , "images/Onboard.png")); |