blob: cde463f3f258571c3749eb9d0f1598a3d02e79b4 [file] [log] [blame]
/*
* Copyright 2023 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRect.h"
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "src/base/SkRandom.h"
#include "tools/timer/TimeUtils.h"
#include "tools/viewer/Slide.h"
// This slide draws a lot of overlapping rectangles which slide left.
// It's adapted from the performance test at https://benchmarks.slaylines.io/
static constexpr int kWidth = 1000;
static constexpr int kHeight = 639;
static constexpr int kNumRects = 32000;
class AnimatedRects : public Slide {
public:
AnimatedRects() {
fName = "animated-rects";
}
protected:
void load(SkScalar, SkScalar) override {
for (int i = 0; i < kNumRects; ++i) {
fRect[i].x = fRand.nextF() * kWidth;
fRect[i].y = fRand.nextF() * kHeight;
fRect[i].size = 10.0 + fRand.nextF() * 40.0;
fRect[i].speed = 1.0 + fRand.nextF();
}
fStrokePaint.setAntiAlias(true);
fStrokePaint.setColor(SK_ColorBLACK);
fStrokePaint.setStyle(SkPaint::kStroke_Style);
fStrokePaint.setStrokeWidth(2.0);
fFillPaint.setAntiAlias(true);
fFillPaint.setStyle(SkPaint::kFill_Style);
fFillPaint.setColor(SK_ColorWHITE);
}
void draw(SkCanvas* canvas) override {
SkAutoCanvasRestore acr(canvas, /*doSave=*/true);
canvas->clipRect({0, 0, (float)kWidth, (float)kHeight});
for (int i = 0; i < kNumRects; ++i) {
const AnimatedRect& r = fRect[i];
canvas->drawRect(SkRect{r.x, r.y, r.x + r.size, r.y + r.size}, fStrokePaint);
canvas->drawRect(SkRect{r.x, r.y, r.x + r.size, r.y + r.size}, fFillPaint);
}
}
bool animate(double nanos) override {
float seconds = 1e-9 * nanos;
if (0.0f != fLastTime) {
float scale = (seconds - fLastTime) * 60;
for (int i = 0; i < kNumRects; ++i) {
AnimatedRect& r = fRect[i];
r.x -= r.speed * scale;
if (r.x + r.size < 0) {
r.x = kWidth + r.size;
}
}
}
fLastTime = seconds;
return true;
}
private:
struct AnimatedRect {
float x, y, size, speed;
};
AnimatedRect fRect[kNumRects];
SkRandom fRand;
SkPaint fStrokePaint, fFillPaint;
float fLastTime = 0.0f;
};
//////////////////////////////////////////////////////////////////////////////
DEF_SLIDE(return new AnimatedRects;)