blob: 1a5b3bf48f73017c75adf54c454cb979d337248b [file] [log] [blame]
robertphillips@google.com8e679fe2013-01-17 19:51:41 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
9#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkShader.h"
12#include "include/core/SkString.h"
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000013
14static void create_gradient(SkBitmap* bm) {
15 SkASSERT(1 == bm->width());
16 const int height = bm->height();
17
18 float deltaB = 255.0f / height;
19 float blue = 255.0f;
20
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000021 for (int y = 0; y < height; y++) {
22 *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue);
23 blue -= deltaB;
24 }
25}
26
27// Test out the special case of a tiled 1xN texture. Test out opacity,
28// filtering and the different tiling modes
tfarinaf168b862014-06-19 12:32:29 -070029class ConstXTileBench : public Benchmark {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000030public:
Mike Reedfae8fce2019-04-03 10:27:45 -040031 ConstXTileBench(SkTileMode xTile,
32 SkTileMode yTile,
Mike Reed057fcbe2020-12-12 14:31:25 -050033 SkFilterMode fm,
robertphillips@google.com1e305232013-01-22 20:29:16 +000034 bool doTrans,
35 bool doScale)
Herb Derby106e7ff2021-09-23 14:28:55 -040036 : fFilterMode{fm}
37 , fXTile{xTile}
38 , fYTile{yTile}
39 , fDoTrans{doTrans}
40 , fDoScale{doScale} {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000041 fName.printf("constXTile_");
42
Mike Reedfae8fce2019-04-03 10:27:45 -040043 static const char* gTileModeStr[kSkTileModeCount] = { "C", "R", "M", "D" };
44 fName.append(gTileModeStr[(unsigned)xTile]);
45 fName.append(gTileModeStr[(unsigned)yTile]);
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000046
Mike Reed057fcbe2020-12-12 14:31:25 -050047 if (fm != SkFilterMode::kNearest) {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000048 fName.append("_filter");
49 }
50
51 if (doTrans) {
52 fName.append("_trans");
53 }
robertphillips@google.com1e305232013-01-22 20:29:16 +000054
55 if (doScale) {
56 fName.append("_scale");
57 }
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000058 }
59
60protected:
Brian Salomond0072812020-07-21 17:03:56 -040061 const char* onGetName() override {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000062 return fName.c_str();
63 }
64
Herb Derby106e7ff2021-09-23 14:28:55 -040065 void onDelayedSetup() override {
66 SkBitmap bm;
67
68 bm.allocN32Pixels(kWidth, kHeight, true);
69 bm.eraseColor(SK_ColorWHITE);
70
71 create_gradient(&bm);
72
73 fPaint.setShader(bm.makeShader(fXTile, fYTile, SkSamplingOptions(fFilterMode)));
74 }
75
Brian Salomond0072812020-07-21 17:03:56 -040076 void onDraw(int loops, SkCanvas* canvas) override {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000077 SkPaint paint(fPaint);
78 this->setupPaint(&paint);
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000079 if (fDoTrans) {
Cary Clark6cdb7d32018-04-24 14:47:16 -040080 paint.setColor(SkColorSetARGB(0x80, 0xFF, 0xFF, 0xFF));
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000081 }
82
83 SkRect r;
84
robertphillips@google.com1e305232013-01-22 20:29:16 +000085 if (fDoScale) {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000086 r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480));
87 canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
88 } else {
89 r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480));
90 }
91
92 SkPaint bgPaint;
93 bgPaint.setColor(SK_ColorWHITE);
94
commit-bot@chromium.org33614712013-12-03 18:17:16 +000095 for (int i = 0; i < loops; i++) {
robertphillips@google.com8e679fe2013-01-17 19:51:41 +000096 if (fDoTrans) {
97 canvas->drawRect(r, bgPaint);
98 }
99
100 canvas->drawRect(r, paint);
101 }
102 }
103
104private:
Herb Derby106e7ff2021-09-23 14:28:55 -0400105 static constexpr int kWidth = 1;
106 static constexpr int kHeight = 300;
107
108 const SkFilterMode fFilterMode;
109 const SkTileMode fXTile,
110 fYTile;
111 const bool fDoTrans,
112 fDoScale;
113 SkPaint fPaint;
114 SkString fName;
John Stiles7571f9e2020-09-02 22:42:33 -0400115 using INHERITED = Benchmark;
robertphillips@google.com8e679fe2013-01-17 19:51:41 +0000116};
117
mtklein474cef42014-06-24 15:19:25 -0700118// Scaled benches are trending towards free. Seems like caching.
119// TODO(mtklein, reed): fix and reenable
120
Mike Reed057fcbe2020-12-12 14:31:25 -0500121 constexpr SkFilterMode gNN = SkFilterMode::kNearest;
122 constexpr SkFilterMode gLI = SkFilterMode::kLinear;
123
Mike Reedfae8fce2019-04-03 10:27:45 -0400124//DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, false, false, true))
Mike Reed057fcbe2020-12-12 14:31:25 -0500125DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, gNN, false, false))
Mike Reedfae8fce2019-04-03 10:27:45 -0400126//DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, false, false, true))
robertphillips@google.com8e679fe2013-01-17 19:51:41 +0000127
Mike Reed057fcbe2020-12-12 14:31:25 -0500128DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, gLI, false, false))
Mike Reedfae8fce2019-04-03 10:27:45 -0400129//DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, true, false, true))
Mike Reed057fcbe2020-12-12 14:31:25 -0500130DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, gLI, false, false))
robertphillips@google.com8e679fe2013-01-17 19:51:41 +0000131
Mike Reedfae8fce2019-04-03 10:27:45 -0400132//DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, false, true, true))
Mike Reed057fcbe2020-12-12 14:31:25 -0500133DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, gNN, true, false))
Mike Reedfae8fce2019-04-03 10:27:45 -0400134//DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, false, true, true))
robertphillips@google.com8e679fe2013-01-17 19:51:41 +0000135
Mike Reed057fcbe2020-12-12 14:31:25 -0500136DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, gLI, true, false))
Mike Reedfae8fce2019-04-03 10:27:45 -0400137//DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, true, true, true))
Mike Reed057fcbe2020-12-12 14:31:25 -0500138DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, gLI, true, false))