xref: /aosp_15_r20/external/skia/tools/viewer/AnimatedRectsSlide.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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