1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 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 "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorFilter.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorPriv.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTime.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/timer/Timer.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/Slide.h" 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker // Create an animation of a bunch of letters that rotate in place. This is intended to stress 22*c8dee2aaSAndroid Build Coastguard Worker // the glyph atlas and test that we don't see corruption or bad slowdowns. 23*c8dee2aaSAndroid Build Coastguard Worker class FlutterAnimateView : public Slide { 24*c8dee2aaSAndroid Build Coastguard Worker public: FlutterAnimateView()25*c8dee2aaSAndroid Build Coastguard Worker FlutterAnimateView() : fCurrTime(0), fResetTime(0) { fName = "FlutterAnimate"; } 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker public: load(SkScalar w,SkScalar h)28*c8dee2aaSAndroid Build Coastguard Worker void load(SkScalar w, SkScalar h) override { 29*c8dee2aaSAndroid Build Coastguard Worker fTypeface = ToolUtils::TestFontMgr()->makeFromFile("/skimages/samplefont.ttf"); 30*c8dee2aaSAndroid Build Coastguard Worker initChars(); 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)33*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 34*c8dee2aaSAndroid Build Coastguard Worker SkFont font(fTypeface, 50); 35*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker // rough center of each glyph 38*c8dee2aaSAndroid Build Coastguard Worker static constexpr auto kMidX = 35; 39*c8dee2aaSAndroid Build Coastguard Worker static constexpr auto kMidY = 50; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SK_ColorWHITE); 42*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumChars; ++i) { 43*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 44*c8dee2aaSAndroid Build Coastguard Worker double rot = SkScalarInterp(fChars[i].fStartRotation, fChars[i].fEndRotation, 45*c8dee2aaSAndroid Build Coastguard Worker fCurrTime/kDuration); 46*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(fChars[i].fPosition.fX + kMidX, fChars[i].fPosition.fY - kMidY); 47*c8dee2aaSAndroid Build Coastguard Worker canvas->rotate(SkRadiansToDegrees(rot)); 48*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(-35,+50); 49*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(fChars[i].fChar, 0, 0, font, paint); 50*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker animate(double nanos)54*c8dee2aaSAndroid Build Coastguard Worker bool animate(double nanos) override { 55*c8dee2aaSAndroid Build Coastguard Worker fCurrTime = 1e-9 * nanos - fResetTime; 56*c8dee2aaSAndroid Build Coastguard Worker if (fCurrTime > kDuration) { 57*c8dee2aaSAndroid Build Coastguard Worker this->initChars(); 58*c8dee2aaSAndroid Build Coastguard Worker fResetTime = 1e-9 * nanos; 59*c8dee2aaSAndroid Build Coastguard Worker fCurrTime = 0; 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker return true; 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker private: initChars()66*c8dee2aaSAndroid Build Coastguard Worker void initChars() { 67*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumChars; ++i) { 68*c8dee2aaSAndroid Build Coastguard Worker char c = fRand.nextULessThan(26) + 65; 69*c8dee2aaSAndroid Build Coastguard Worker fChars[i].fChar[0] = c; 70*c8dee2aaSAndroid Build Coastguard Worker fChars[i].fChar[1] = '\0'; 71*c8dee2aaSAndroid Build Coastguard Worker fChars[i].fPosition = SkPoint::Make(fRand.nextF()*748 + 10, fRand.nextF()*1004 + 10); 72*c8dee2aaSAndroid Build Coastguard Worker fChars[i].fStartRotation = fRand.nextF(); 73*c8dee2aaSAndroid Build Coastguard Worker fChars[i].fEndRotation = fRand.nextF() * 20 - 10; 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr double kDuration = 5.0; 78*c8dee2aaSAndroid Build Coastguard Worker double fCurrTime; 79*c8dee2aaSAndroid Build Coastguard Worker double fResetTime; 80*c8dee2aaSAndroid Build Coastguard Worker SkRandom fRand; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker struct AnimatedChar { 83*c8dee2aaSAndroid Build Coastguard Worker char fChar[2]; 84*c8dee2aaSAndroid Build Coastguard Worker SkPoint fPosition; 85*c8dee2aaSAndroid Build Coastguard Worker SkScalar fStartRotation; 86*c8dee2aaSAndroid Build Coastguard Worker SkScalar fEndRotation; 87*c8dee2aaSAndroid Build Coastguard Worker }; 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkTypeface> fTypeface; 89*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kNumChars = 40; 90*c8dee2aaSAndroid Build Coastguard Worker AnimatedChar fChars[kNumChars]; 91*c8dee2aaSAndroid Build Coastguard Worker }; 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new FlutterAnimateView(); ) 96