1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2013 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 "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 13cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 14cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 15cb93a386Sopenharmony_ci#include "include/core/SkString.h" 16cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 17cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 18cb93a386Sopenharmony_ci#include "tools/timer/TimeUtils.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci// Reproduces https://code.google.com/p/chromium/issues/detail?id=279014 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciconstexpr int kWidth = 440; 23cb93a386Sopenharmony_ciconstexpr int kHeight = 440; 24cb93a386Sopenharmony_ciconstexpr SkScalar kAngle = 0.305f; 25cb93a386Sopenharmony_ciconstexpr int kMaxNumSteps = 140; 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci// Renders a string art shape. 28cb93a386Sopenharmony_ci// The particular shape rendered can be controlled by adjusting kAngle, from 0 to 1 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciclass StringArtGM : public skiagm::GM { 31cb93a386Sopenharmony_cipublic: 32cb93a386Sopenharmony_ci StringArtGM() : fNumSteps(kMaxNumSteps) {} 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciprotected: 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci SkString onShortName() override { 37cb93a386Sopenharmony_ci return SkString("stringart"); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci SkISize onISize() override { 41cb93a386Sopenharmony_ci return SkISize::Make(kWidth, kHeight); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 45cb93a386Sopenharmony_ci SkScalar angle = kAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI); 46cb93a386Sopenharmony_ci SkScalar size = SkIntToScalar(std::min(kWidth, kHeight)); 47cb93a386Sopenharmony_ci SkPoint center = SkPoint::Make(SkScalarHalf(kWidth), SkScalarHalf(kHeight)); 48cb93a386Sopenharmony_ci SkScalar length = 5; 49cb93a386Sopenharmony_ci SkScalar step = angle; 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci SkPath path; 52cb93a386Sopenharmony_ci path.moveTo(center); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci for (int i = 0; i < fNumSteps && length < (SkScalarHalf(size) - 10.f); ++i) { 55cb93a386Sopenharmony_ci SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX, 56cb93a386Sopenharmony_ci length*SkScalarSin(step) + center.fY); 57cb93a386Sopenharmony_ci path.lineTo(rp); 58cb93a386Sopenharmony_ci length += angle / SkScalarHalf(SK_ScalarPI); 59cb93a386Sopenharmony_ci step += angle; 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci SkPaint paint; 63cb93a386Sopenharmony_ci paint.setAntiAlias(true); 64cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 65cb93a386Sopenharmony_ci paint.setColor(ToolUtils::color_to_565(0xFF007700)); 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci bool onAnimate(double nanos) override { 71cb93a386Sopenharmony_ci constexpr SkScalar kDesiredDurationSecs = 3.0f; 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci // Make the animation ping-pong back and forth but start in the fully drawn state 74cb93a386Sopenharmony_ci SkScalar fraction = 1.0f - TimeUtils::Scaled(1e-9 * nanos, 2.0f/kDesiredDurationSecs, 2.0f); 75cb93a386Sopenharmony_ci if (fraction <= 0.0f) { 76cb93a386Sopenharmony_ci fraction = -fraction; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci SkASSERT(fraction >= 0.0f && fraction <= 1.0f); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci fNumSteps = (int) (fraction * kMaxNumSteps); 82cb93a386Sopenharmony_ci return true; 83cb93a386Sopenharmony_ci } 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ciprivate: 86cb93a386Sopenharmony_ci int fNumSteps; 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci using INHERITED = GM; 89cb93a386Sopenharmony_ci}; 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ciDEF_GM( return new StringArtGM; ) 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////////// 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci#if 0 96cb93a386Sopenharmony_ci#include "modules/skottie/include/Skottie.h" 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ciclass SkottieGM : public skiagm::GM { 99cb93a386Sopenharmony_ci enum { 100cb93a386Sopenharmony_ci kWidth = 800, 101cb93a386Sopenharmony_ci kHeight = 600, 102cb93a386Sopenharmony_ci }; 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci enum { 105cb93a386Sopenharmony_ci N = 100, 106cb93a386Sopenharmony_ci }; 107cb93a386Sopenharmony_ci skottie::Animation* fAnims[N]; 108cb93a386Sopenharmony_ci SkRect fRects[N]; 109cb93a386Sopenharmony_ci SkScalar fDur; 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_cipublic: 112cb93a386Sopenharmony_ci SkottieGM() { 113cb93a386Sopenharmony_ci sk_bzero(fAnims, sizeof(fAnims)); 114cb93a386Sopenharmony_ci } 115cb93a386Sopenharmony_ci ~SkottieGM() override { 116cb93a386Sopenharmony_ci for (auto anim : fAnims) { 117cb93a386Sopenharmony_ci SkSafeUnref(anim); 118cb93a386Sopenharmony_ci } 119cb93a386Sopenharmony_ci } 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ciprotected: 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("skottie"); } 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci void init() { 128cb93a386Sopenharmony_ci SkRandom rand; 129cb93a386Sopenharmony_ci auto data = SkData::MakeFromFileName("/Users/reed/Downloads/maps_pinlet.json"); 130cb93a386Sopenharmony_ci // for (;;) skottie::Animation::Make((const char*)data->data(), data->size()); 131cb93a386Sopenharmony_ci for (int i = 0; i < N; ++i) { 132cb93a386Sopenharmony_ci fAnims[i] = skottie::Animation::Make((const char*)data->data(), data->size()).release(); 133cb93a386Sopenharmony_ci SkScalar x = rand.nextF() * kWidth; 134cb93a386Sopenharmony_ci SkScalar y = rand.nextF() * kHeight; 135cb93a386Sopenharmony_ci fRects[i].setXYWH(x, y, 400, 400); 136cb93a386Sopenharmony_ci } 137cb93a386Sopenharmony_ci fDur = fAnims[0]->duration(); 138cb93a386Sopenharmony_ci } 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 141cb93a386Sopenharmony_ci if (!fAnims[0]) { 142cb93a386Sopenharmony_ci this->init(); 143cb93a386Sopenharmony_ci } 144cb93a386Sopenharmony_ci canvas->drawColor(0xFFBBBBBB); 145cb93a386Sopenharmony_ci for (int i = 0; i < N; ++i) { 146cb93a386Sopenharmony_ci fAnims[0]->render(canvas, &fRects[i]); 147cb93a386Sopenharmony_ci } 148cb93a386Sopenharmony_ci } 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci bool onAnimate(double nanos) override { 151cb93a386Sopenharmony_ci SkScalar time = (float)(fmod(1e-9 * nanos, fDur) / fDur); 152cb93a386Sopenharmony_ci for (auto anim : fAnims) { 153cb93a386Sopenharmony_ci anim->seek(time); 154cb93a386Sopenharmony_ci } 155cb93a386Sopenharmony_ci return true; 156cb93a386Sopenharmony_ci } 157cb93a386Sopenharmony_ci 158cb93a386Sopenharmony_ciprivate: 159cb93a386Sopenharmony_ci using INHERITED = GM; 160cb93a386Sopenharmony_ci}; 161cb93a386Sopenharmony_ciDEF_GM( return new SkottieGM; ) 162cb93a386Sopenharmony_ci#endif 163cb93a386Sopenharmony_ci 164