blob: 2d6f5d1a655f3fff775f76f9da140d530fdb710e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 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 */
tfarinaf168b862014-06-19 12:32:29 -07007#include "Benchmark.h"
reed@google.com84e9c082011-04-13 17:44:24 +00008#include "SkBitmap.h"
9#include "SkCanvas.h"
10#include "SkColorPriv.h"
11#include "SkGradientShader.h"
fmalita36693b52016-02-24 15:32:57 -080012#include "SkLinearGradient.h"
reed@google.com84e9c082011-04-13 17:44:24 +000013#include "SkPaint.h"
14#include "SkShader.h"
15#include "SkString.h"
reed@google.com84e9c082011-04-13 17:44:24 +000016
17struct GradData {
18 int fCount;
19 const SkColor* fColors;
20 const SkScalar* fPos;
commit-bot@chromium.org5396a042013-07-10 16:13:14 +000021 const char* fName;
reed@google.com84e9c082011-04-13 17:44:24 +000022};
23
24static const SkColor gColors[] = {
commit-bot@chromium.orgb6865392013-07-09 19:43:29 +000025 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
commit-bot@chromium.org5396a042013-07-10 16:13:14 +000026 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
27 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
28 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
29 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
30 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
31 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
32 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
33 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
34 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, // 10 lines, 50 colors
reed@google.com84e9c082011-04-13 17:44:24 +000035};
36
krajcevskif461a8f2014-06-19 14:14:06 -070037static const SkColor gShallowColors[] = { 0xFF555555, 0xFF444444 };
Herb Derby4de13042017-05-15 10:49:39 -040038static const SkScalar gPos[] = {0.25f, 0.75f};
krajcevskif461a8f2014-06-19 14:14:06 -070039
commit-bot@chromium.org3400f4b2013-09-30 19:41:09 +000040// We have several special-cases depending on the number (and spacing) of colors, so
41// try to exercise those here.
reed@google.com84e9c082011-04-13 17:44:24 +000042static const GradData gGradData[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070043 { 2, gColors, nullptr, "" },
44 { 50, gColors, nullptr, "_hicolor" }, // many color gradient
45 { 3, gColors, nullptr, "_3color" },
46 { 2, gShallowColors, nullptr, "_shallow" },
Herb Derby4de13042017-05-15 10:49:39 -040047 { 2, gColors, gPos, "_pos" },
reed@google.com84e9c082011-04-13 17:44:24 +000048};
49
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000050/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070051static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data,
52 SkShader::TileMode tm, float scale, bool force4f) {
fmalita36693b52016-02-24 15:32:57 -080053 const uint32_t flags = force4f ? SkLinearGradient::kForce4fContext_PrivateFlag : 0;
reedc6f28f72016-03-14 12:22:10 -070054 return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos,
55 data.fCount, tm, flags, nullptr);
reed@google.com84e9c082011-04-13 17:44:24 +000056}
57
reedc6f28f72016-03-14 12:22:10 -070058static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data,
59 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com84e9c082011-04-13 17:44:24 +000060 SkPoint center;
61 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
62 SkScalarAve(pts[0].fY, pts[1].fY));
reedc6f28f72016-03-14 12:22:10 -070063 return SkGradientShader::MakeRadial(center, center.fX * scale, data.fColors,
64 data.fPos, data.fCount, tm);
reed@google.com84e9c082011-04-13 17:44:24 +000065}
66
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000067/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070068static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data,
69 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com84e9c082011-04-13 17:44:24 +000070 SkPoint center;
71 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
72 SkScalarAve(pts[0].fY, pts[1].fY));
reedc6f28f72016-03-14 12:22:10 -070073 return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
reed@google.com84e9c082011-04-13 17:44:24 +000074}
75
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000076/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070077static sk_sp<SkShader> MakeConical(const SkPoint pts[2], const GradData& data,
78 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com258e0bf2012-06-07 14:18:34 +000079 SkPoint center0, center1;
80 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
81 SkScalarAve(pts[0].fY, pts[1].fY));
82 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
83 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reedc6f28f72016-03-14 12:22:10 -070084 return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
85 center0, (pts[1].fX - pts[0].fX) / 2,
86 data.fColors, data.fPos, data.fCount, tm);
reed@google.com84e9c082011-04-13 17:44:24 +000087}
88
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000089/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070090static sk_sp<SkShader> MakeConicalZeroRad(const SkPoint pts[2], const GradData& data,
91 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000092 SkPoint center0, center1;
93 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
94 SkScalarAve(pts[0].fY, pts[1].fY));
95 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
96 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reedc6f28f72016-03-14 12:22:10 -070097 return SkGradientShader::MakeTwoPointConical(center1, 0.0,
98 center0, (pts[1].fX - pts[0].fX) / 2,
99 data.fColors, data.fPos, data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000100}
101
102/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -0700103static sk_sp<SkShader> MakeConicalOutside(const SkPoint pts[2], const GradData& data,
104 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000105 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700106 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
107 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000108 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
109 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reedc6f28f72016-03-14 12:22:10 -0700110 return SkGradientShader::MakeTwoPointConical(center0, radius0,
111 center1, radius1,
112 data.fColors, data.fPos,
113 data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000114}
115
116/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -0700117static sk_sp<SkShader> MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData& data,
118 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000119 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700120 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
121 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000122 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
123 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reedc6f28f72016-03-14 12:22:10 -0700124 return SkGradientShader::MakeTwoPointConical(center0, 0.0,
125 center1, radius1,
126 data.fColors, data.fPos,
127 data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000128}
129
reedc6f28f72016-03-14 12:22:10 -0700130typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data,
131 SkShader::TileMode tm, float scale, bool force4f);
reed@google.com84e9c082011-04-13 17:44:24 +0000132
133static const struct {
134 GradMaker fMaker;
135 const char* fName;
reed@google.com84e9c082011-04-13 17:44:24 +0000136} gGrads[] = {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000137 { MakeLinear, "linear" },
138 { MakeRadial, "radial1" },
139 { MakeSweep, "sweep" },
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000140 { MakeConical, "conical" },
141 { MakeConicalZeroRad, "conicalZero" },
142 { MakeConicalOutside, "conicalOut" },
143 { MakeConicalOutsideZeroRad, "conicalOutZero" },
reed@google.com84e9c082011-04-13 17:44:24 +0000144};
145
146enum GradType { // these must match the order in gGrads
147 kLinear_GradType,
148 kRadial_GradType,
149 kSweep_GradType,
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000150 kConical_GradType,
151 kConicalZero_GradType,
152 kConicalOut_GradType,
153 kConicalOutZero_GradType
reed@google.com84e9c082011-04-13 17:44:24 +0000154};
155
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000156enum GeomType {
157 kRect_GeomType,
158 kOval_GeomType
159};
160
reed@google.com72415162011-06-15 21:17:37 +0000161static const char* tilemodename(SkShader::TileMode tm) {
162 switch (tm) {
163 case SkShader::kClamp_TileMode:
164 return "clamp";
165 case SkShader::kRepeat_TileMode:
166 return "repeat";
167 case SkShader::kMirror_TileMode:
168 return "mirror";
169 default:
mtklein@google.com330313a2013-08-22 15:37:26 +0000170 SkDEBUGFAIL("unknown tilemode");
reed@google.com72415162011-06-15 21:17:37 +0000171 return "error";
172 }
173}
174
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000175static const char* geomtypename(GeomType gt) {
176 switch (gt) {
177 case kRect_GeomType:
178 return "rectangle";
179 case kOval_GeomType:
180 return "oval";
181 default:
mtklein@google.com330313a2013-08-22 15:37:26 +0000182 SkDEBUGFAIL("unknown geometry type");
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000183 return "error";
184 }
185}
186
reed@google.com84e9c082011-04-13 17:44:24 +0000187///////////////////////////////////////////////////////////////////////////////
188
tfarinaf168b862014-06-19 12:32:29 -0700189class GradientBench : public Benchmark {
reed@google.com84e9c082011-04-13 17:44:24 +0000190public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000191 GradientBench(GradType gradType,
commit-bot@chromium.org5396a042013-07-10 16:13:14 +0000192 GradData data = gGradData[0],
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000193 SkShader::TileMode tm = SkShader::kClamp_TileMode,
194 GeomType geomType = kRect_GeomType,
fmalita36693b52016-02-24 15:32:57 -0800195 float scale = 1.0f,
196 bool force4f = false)
197 : fGeomType(geomType) {
198
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000199 fName.printf("gradient_%s_%s", gGrads[gradType].fName,
200 tilemodename(tm));
201 if (geomType != kRect_GeomType) {
fmalita36693b52016-02-24 15:32:57 -0800202 fName.appendf("_%s", geomtypename(geomType));
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000203 }
reed@google.com84e9c082011-04-13 17:44:24 +0000204
commit-bot@chromium.org3400f4b2013-09-30 19:41:09 +0000205 if (scale != 1.f) {
206 fName.appendf("_scale_%g", scale);
207 }
208
commit-bot@chromium.org5396a042013-07-10 16:13:14 +0000209 fName.append(data.fName);
210
fmalita36693b52016-02-24 15:32:57 -0800211 if (force4f) {
212 fName.append("_4f");
213 }
214
fmalita36693b52016-02-24 15:32:57 -0800215 this->setupPaint(&fPaint);
reedc6f28f72016-03-14 12:22:10 -0700216 fPaint.setShader(MakeShader(gradType, data, tm, scale, force4f));
reed@google.com84e9c082011-04-13 17:44:24 +0000217 }
218
fmalita36693b52016-02-24 15:32:57 -0800219 GradientBench(GradType gradType, GradData data, bool dither, bool force4f = false)
220 : fGeomType(kRect_GeomType) {
221
krajcevskif461a8f2014-06-19 14:14:06 -0700222 const char *tmname = tilemodename(SkShader::kClamp_TileMode);
223 fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname);
224 fName.append(data.fName);
225
krajcevskif461a8f2014-06-19 14:14:06 -0700226 if (dither) {
227 fName.appendf("_dither");
228 }
229
fmalita36693b52016-02-24 15:32:57 -0800230 this->setupPaint(&fPaint);
reedc6f28f72016-03-14 12:22:10 -0700231 fPaint.setShader(MakeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f, force4f));
fmalita36693b52016-02-24 15:32:57 -0800232 fPaint.setDither(dither);
reed@google.com84e9c082011-04-13 17:44:24 +0000233 }
234
235protected:
fmalita36693b52016-02-24 15:32:57 -0800236 const char* onGetName() override {
reed@google.com84e9c082011-04-13 17:44:24 +0000237 return fName.c_str();
238 }
239
fmalita36693b52016-02-24 15:32:57 -0800240 SkIPoint onGetSize() override {
241 return SkIPoint::Make(kSize, kSize);
242 }
reed@google.com84e9c082011-04-13 17:44:24 +0000243
fmalita36693b52016-02-24 15:32:57 -0800244 void onDraw(int loops, SkCanvas* canvas) override {
245 const SkRect r = SkRect::MakeIWH(kSize, kSize);
reed@google.com84e9c082011-04-13 17:44:24 +0000246
bsalomona7f79b42014-08-14 12:24:46 -0700247 for (int i = 0; i < loops; i++) {
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000248 switch (fGeomType) {
249 case kRect_GeomType:
fmalita36693b52016-02-24 15:32:57 -0800250 canvas->drawRect(r, fPaint);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000251 break;
252 case kOval_GeomType:
fmalita36693b52016-02-24 15:32:57 -0800253 canvas->drawOval(r, fPaint);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000254 break;
255 }
reed@google.com84e9c082011-04-13 17:44:24 +0000256 }
257 }
258
259private:
tfarinaf168b862014-06-19 12:32:29 -0700260 typedef Benchmark INHERITED;
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000261
reedc6f28f72016-03-14 12:22:10 -0700262 sk_sp<SkShader> MakeShader(GradType gradType, GradData data,
263 SkShader::TileMode tm, float scale, bool force4f) {
fmalita36693b52016-02-24 15:32:57 -0800264 const SkPoint pts[2] = {
265 { 0, 0 },
266 { SkIntToScalar(kSize), SkIntToScalar(kSize) }
267 };
268
269 return gGrads[gradType].fMaker(pts, data, tm, scale, force4f);
270 }
271
272 static const int kSize = 400;
273
274 SkString fName;
275 SkPaint fPaint;
276 const GeomType fGeomType;
reed@google.com84e9c082011-04-13 17:44:24 +0000277};
278
fmalita36693b52016-02-24 15:32:57 -0800279// 4f
280DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kClamp_TileMode,
281 kRect_GeomType, 1, true); )
282DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kClamp_TileMode,
283 kRect_GeomType, 1, true); )
284DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kClamp_TileMode,
285 kRect_GeomType, 1, true); )
Herb Derby4de13042017-05-15 10:49:39 -0400286DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[4], SkShader::kClamp_TileMode,
287 kRect_GeomType, 1, true); )
fmalita36693b52016-02-24 15:32:57 -0800288DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode,
289 kRect_GeomType, 1, true); )
290DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode,
291 kRect_GeomType, 1, true); )
292DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode,
293 kRect_GeomType, 1, true); )
294DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode,
295 kRect_GeomType, 1, true); )
296DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode,
297 kRect_GeomType, 1, true); )
298DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode,
299 kRect_GeomType, 1, true); )
300
301DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000302DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1]); )
303DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2]); )
Herb Derby4de13042017-05-15 10:49:39 -0400304DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[4]); )
fmalita36693b52016-02-24 15:32:57 -0800305DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
306DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode); )
307DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000308DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode); )
fmalita36693b52016-02-24 15:32:57 -0800309DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode); )
310DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000311
312DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0]); )
313DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[1]); )
314DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[2]); )
315// Draw a radial gradient of radius 1/2 on a rectangle; half the lines should
316// be completely pinned, the other half should pe partially pinned
317DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kRect_GeomType, 0.5f); )
318
319// Draw a radial gradient on a circle of equal size; all the lines should
320// hit the unpinned fast path (so long as GradientBench.W == H)
321DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kOval_GeomType); )
322
323DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kMirror_TileMode); )
commit-bot@chromium.org34150b42013-10-16 18:59:44 +0000324DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000325DEF_BENCH( return new GradientBench(kSweep_GradType); )
326DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[1]); )
327DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[2]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000328DEF_BENCH( return new GradientBench(kConical_GradType); )
329DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[1]); )
330DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[2]); )
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000331DEF_BENCH( return new GradientBench(kConicalZero_GradType); )
332DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[1]); )
333DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[2]); )
334DEF_BENCH( return new GradientBench(kConicalOut_GradType); )
335DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[1]); )
336DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[2]); )
337DEF_BENCH( return new GradientBench(kConicalOutZero_GradType); )
338DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); )
339DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000340
krajcevskif461a8f2014-06-19 14:14:06 -0700341// Dithering
342DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], true); )
343DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], false); )
344DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], true); )
345DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], false); )
346DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], true); )
347DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], false); )
348DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], true); )
349DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], false); )
350
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000351///////////////////////////////////////////////////////////////////////////////
352
tfarinaf168b862014-06-19 12:32:29 -0700353class Gradient2Bench : public Benchmark {
reed@google.com73349aa2013-02-04 18:09:58 +0000354 SkString fName;
355 bool fHasAlpha;
356
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000357public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000358 Gradient2Bench(bool hasAlpha) {
reed@google.com73349aa2013-02-04 18:09:58 +0000359 fName.printf("gradient_create_%s", hasAlpha ? "alpha" : "opaque");
360 fHasAlpha = hasAlpha;
361 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000362
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000363protected:
364 virtual const char* onGetName() {
reed@google.com73349aa2013-02-04 18:09:58 +0000365 return fName.c_str();
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000366 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000367
mtkleina1ebeb22015-10-01 09:43:39 -0700368 virtual void onDraw(int loops, SkCanvas* canvas) {
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000369 SkPaint paint;
370 this->setupPaint(&paint);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000371
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000372 const SkRect r = { 0, 0, SkIntToScalar(4), SkIntToScalar(4) };
reed@google.com1ca4f262011-06-24 19:17:37 +0000373 const SkPoint pts[] = {
374 { 0, 0 },
375 { SkIntToScalar(100), SkIntToScalar(100) },
376 };
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000377
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000378 for (int i = 0; i < loops; i++) {
reed@google.com73349aa2013-02-04 18:09:58 +0000379 const int gray = i % 256;
380 const int alpha = fHasAlpha ? gray : 0xFF;
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000381 SkColor colors[] = {
382 SK_ColorBLACK,
reed@google.com73349aa2013-02-04 18:09:58 +0000383 SkColorSetARGB(alpha, gray, gray, gray),
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000384 SK_ColorWHITE };
reedc6f28f72016-03-14 12:22:10 -0700385 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr,
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000386 SK_ARRAY_COUNT(colors),
reedc6f28f72016-03-14 12:22:10 -0700387 SkShader::kClamp_TileMode));
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000388 canvas->drawRect(r, paint);
389 }
390 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000391
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000392private:
tfarinaf168b862014-06-19 12:32:29 -0700393 typedef Benchmark INHERITED;
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000394};
395
mtklein@google.com410e6e82013-09-13 19:52:27 +0000396DEF_BENCH( return new Gradient2Bench(false); )
397DEF_BENCH( return new Gradient2Bench(true); )