1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 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 "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/timer/TimeUtils.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/Slide.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker // This slide draws a lot of overlapping rectangles which slide left. 19*c8dee2aaSAndroid Build Coastguard Worker // It's adapted from the performance test at https://benchmarks.slaylines.io/ 20*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kWidth = 1000; 21*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kHeight = 639; 22*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kNumRects = 32000; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class AnimatedRects : public Slide { 25*c8dee2aaSAndroid Build Coastguard Worker public: AnimatedRects()26*c8dee2aaSAndroid Build Coastguard Worker AnimatedRects() { 27*c8dee2aaSAndroid Build Coastguard Worker fName = "animated-rects"; 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker protected: load(SkScalar,SkScalar)31*c8dee2aaSAndroid Build Coastguard Worker void load(SkScalar, SkScalar) override { 32*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumRects; ++i) { 33*c8dee2aaSAndroid Build Coastguard Worker fRect[i].x = fRand.nextF() * kWidth; 34*c8dee2aaSAndroid Build Coastguard Worker fRect[i].y = fRand.nextF() * kHeight; 35*c8dee2aaSAndroid Build Coastguard Worker fRect[i].size = 10.0 + fRand.nextF() * 40.0; 36*c8dee2aaSAndroid Build Coastguard Worker fRect[i].speed = 1.0 + fRand.nextF(); 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker fStrokePaint.setAntiAlias(true); 40*c8dee2aaSAndroid Build Coastguard Worker fStrokePaint.setColor(SK_ColorBLACK); 41*c8dee2aaSAndroid Build Coastguard Worker fStrokePaint.setStyle(SkPaint::kStroke_Style); 42*c8dee2aaSAndroid Build Coastguard Worker fStrokePaint.setStrokeWidth(2.0); 43*c8dee2aaSAndroid Build Coastguard Worker fFillPaint.setAntiAlias(true); 44*c8dee2aaSAndroid Build Coastguard Worker fFillPaint.setStyle(SkPaint::kFill_Style); 45*c8dee2aaSAndroid Build Coastguard Worker fFillPaint.setColor(SK_ColorWHITE); 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)48*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 49*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, /*doSave=*/true); 50*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect({0, 0, (float)kWidth, (float)kHeight}); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumRects; ++i) { 53*c8dee2aaSAndroid Build Coastguard Worker const AnimatedRect& r = fRect[i]; 54*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect{r.x, r.y, r.x + r.size, r.y + r.size}, fStrokePaint); 55*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect{r.x, r.y, r.x + r.size, r.y + r.size}, fFillPaint); 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker animate(double nanos)59*c8dee2aaSAndroid Build Coastguard Worker bool animate(double nanos) override { 60*c8dee2aaSAndroid Build Coastguard Worker float seconds = 1e-9 * nanos; 61*c8dee2aaSAndroid Build Coastguard Worker if (0.0f != fLastTime) { 62*c8dee2aaSAndroid Build Coastguard Worker float scale = (seconds - fLastTime) * 60; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumRects; ++i) { 65*c8dee2aaSAndroid Build Coastguard Worker AnimatedRect& r = fRect[i]; 66*c8dee2aaSAndroid Build Coastguard Worker r.x -= r.speed * scale; 67*c8dee2aaSAndroid Build Coastguard Worker if (r.x + r.size < 0) { 68*c8dee2aaSAndroid Build Coastguard Worker r.x = kWidth + r.size; 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker } 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker fLastTime = seconds; 74*c8dee2aaSAndroid Build Coastguard Worker return true; 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker private: 78*c8dee2aaSAndroid Build Coastguard Worker struct AnimatedRect { 79*c8dee2aaSAndroid Build Coastguard Worker float x, y, size, speed; 80*c8dee2aaSAndroid Build Coastguard Worker }; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker AnimatedRect fRect[kNumRects]; 83*c8dee2aaSAndroid Build Coastguard Worker SkRandom fRand; 84*c8dee2aaSAndroid Build Coastguard Worker SkPaint fStrokePaint, fFillPaint; 85*c8dee2aaSAndroid Build Coastguard Worker float fLastTime = 0.0f; 86*c8dee2aaSAndroid Build Coastguard Worker }; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE(return new AnimatedRects;) 91