blob: 1685c52089f290dd47e1546daa0ea4055d5cd4b1 [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 };
38
commit-bot@chromium.org3400f4b2013-09-30 19:41:09 +000039// We have several special-cases depending on the number (and spacing) of colors, so
40// try to exercise those here.
reed@google.com84e9c082011-04-13 17:44:24 +000041static const GradData gGradData[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070042 { 2, gColors, nullptr, "" },
43 { 50, gColors, nullptr, "_hicolor" }, // many color gradient
44 { 3, gColors, nullptr, "_3color" },
45 { 2, gShallowColors, nullptr, "_shallow" },
reed@google.com84e9c082011-04-13 17:44:24 +000046};
47
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000048/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070049static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data,
50 SkShader::TileMode tm, float scale, bool force4f) {
fmalita36693b52016-02-24 15:32:57 -080051 const uint32_t flags = force4f ? SkLinearGradient::kForce4fContext_PrivateFlag : 0;
reedc6f28f72016-03-14 12:22:10 -070052 return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos,
53 data.fCount, tm, flags, nullptr);
reed@google.com84e9c082011-04-13 17:44:24 +000054}
55
reedc6f28f72016-03-14 12:22:10 -070056static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data,
57 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com84e9c082011-04-13 17:44:24 +000058 SkPoint center;
59 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
60 SkScalarAve(pts[0].fY, pts[1].fY));
reedc6f28f72016-03-14 12:22:10 -070061 return SkGradientShader::MakeRadial(center, center.fX * scale, data.fColors,
62 data.fPos, data.fCount, tm);
reed@google.com84e9c082011-04-13 17:44:24 +000063}
64
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000065/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070066static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data,
67 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com84e9c082011-04-13 17:44:24 +000068 SkPoint center;
69 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
70 SkScalarAve(pts[0].fY, pts[1].fY));
reedc6f28f72016-03-14 12:22:10 -070071 return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
reed@google.com84e9c082011-04-13 17:44:24 +000072}
73
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000074/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070075static sk_sp<SkShader> MakeConical(const SkPoint pts[2], const GradData& data,
76 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com258e0bf2012-06-07 14:18:34 +000077 SkPoint center0, center1;
78 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
79 SkScalarAve(pts[0].fY, pts[1].fY));
80 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
81 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reedc6f28f72016-03-14 12:22:10 -070082 return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
83 center0, (pts[1].fX - pts[0].fX) / 2,
84 data.fColors, data.fPos, data.fCount, tm);
reed@google.com84e9c082011-04-13 17:44:24 +000085}
86
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000087/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -070088static sk_sp<SkShader> MakeConicalZeroRad(const SkPoint pts[2], const GradData& data,
89 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000090 SkPoint center0, center1;
91 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
92 SkScalarAve(pts[0].fY, pts[1].fY));
93 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
94 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reedc6f28f72016-03-14 12:22:10 -070095 return SkGradientShader::MakeTwoPointConical(center1, 0.0,
96 center0, (pts[1].fX - pts[0].fX) / 2,
97 data.fColors, data.fPos, data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000098}
99
100/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -0700101static sk_sp<SkShader> MakeConicalOutside(const SkPoint pts[2], const GradData& data,
102 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000103 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700104 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
105 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000106 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
107 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reedc6f28f72016-03-14 12:22:10 -0700108 return SkGradientShader::MakeTwoPointConical(center0, radius0,
109 center1, radius1,
110 data.fColors, data.fPos,
111 data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000112}
113
114/// Ignores scale
reedc6f28f72016-03-14 12:22:10 -0700115static sk_sp<SkShader> MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData& data,
116 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000117 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700118 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
119 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000120 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
121 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reedc6f28f72016-03-14 12:22:10 -0700122 return SkGradientShader::MakeTwoPointConical(center0, 0.0,
123 center1, radius1,
124 data.fColors, data.fPos,
125 data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000126}
127
reedc6f28f72016-03-14 12:22:10 -0700128typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data,
129 SkShader::TileMode tm, float scale, bool force4f);
reed@google.com84e9c082011-04-13 17:44:24 +0000130
131static const struct {
132 GradMaker fMaker;
133 const char* fName;
reed@google.com84e9c082011-04-13 17:44:24 +0000134} gGrads[] = {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000135 { MakeLinear, "linear" },
136 { MakeRadial, "radial1" },
137 { MakeSweep, "sweep" },
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000138 { MakeConical, "conical" },
139 { MakeConicalZeroRad, "conicalZero" },
140 { MakeConicalOutside, "conicalOut" },
141 { MakeConicalOutsideZeroRad, "conicalOutZero" },
reed@google.com84e9c082011-04-13 17:44:24 +0000142};
143
144enum GradType { // these must match the order in gGrads
145 kLinear_GradType,
146 kRadial_GradType,
147 kSweep_GradType,
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000148 kConical_GradType,
149 kConicalZero_GradType,
150 kConicalOut_GradType,
151 kConicalOutZero_GradType
reed@google.com84e9c082011-04-13 17:44:24 +0000152};
153
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000154enum GeomType {
155 kRect_GeomType,
156 kOval_GeomType
157};
158
reed@google.com72415162011-06-15 21:17:37 +0000159static const char* tilemodename(SkShader::TileMode tm) {
160 switch (tm) {
161 case SkShader::kClamp_TileMode:
162 return "clamp";
163 case SkShader::kRepeat_TileMode:
164 return "repeat";
165 case SkShader::kMirror_TileMode:
166 return "mirror";
167 default:
mtklein@google.com330313a2013-08-22 15:37:26 +0000168 SkDEBUGFAIL("unknown tilemode");
reed@google.com72415162011-06-15 21:17:37 +0000169 return "error";
170 }
171}
172
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000173static const char* geomtypename(GeomType gt) {
174 switch (gt) {
175 case kRect_GeomType:
176 return "rectangle";
177 case kOval_GeomType:
178 return "oval";
179 default:
mtklein@google.com330313a2013-08-22 15:37:26 +0000180 SkDEBUGFAIL("unknown geometry type");
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000181 return "error";
182 }
183}
184
reed@google.com84e9c082011-04-13 17:44:24 +0000185///////////////////////////////////////////////////////////////////////////////
186
tfarinaf168b862014-06-19 12:32:29 -0700187class GradientBench : public Benchmark {
reed@google.com84e9c082011-04-13 17:44:24 +0000188public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000189 GradientBench(GradType gradType,
commit-bot@chromium.org5396a042013-07-10 16:13:14 +0000190 GradData data = gGradData[0],
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000191 SkShader::TileMode tm = SkShader::kClamp_TileMode,
192 GeomType geomType = kRect_GeomType,
fmalita36693b52016-02-24 15:32:57 -0800193 float scale = 1.0f,
194 bool force4f = false)
195 : fGeomType(geomType) {
196
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000197 fName.printf("gradient_%s_%s", gGrads[gradType].fName,
198 tilemodename(tm));
199 if (geomType != kRect_GeomType) {
fmalita36693b52016-02-24 15:32:57 -0800200 fName.appendf("_%s", geomtypename(geomType));
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000201 }
reed@google.com84e9c082011-04-13 17:44:24 +0000202
commit-bot@chromium.org3400f4b2013-09-30 19:41:09 +0000203 if (scale != 1.f) {
204 fName.appendf("_scale_%g", scale);
205 }
206
commit-bot@chromium.org5396a042013-07-10 16:13:14 +0000207 fName.append(data.fName);
208
fmalita36693b52016-02-24 15:32:57 -0800209 if (force4f) {
210 fName.append("_4f");
211 }
212
fmalita36693b52016-02-24 15:32:57 -0800213 this->setupPaint(&fPaint);
reedc6f28f72016-03-14 12:22:10 -0700214 fPaint.setShader(MakeShader(gradType, data, tm, scale, force4f));
reed@google.com84e9c082011-04-13 17:44:24 +0000215 }
216
fmalita36693b52016-02-24 15:32:57 -0800217 GradientBench(GradType gradType, GradData data, bool dither, bool force4f = false)
218 : fGeomType(kRect_GeomType) {
219
krajcevskif461a8f2014-06-19 14:14:06 -0700220 const char *tmname = tilemodename(SkShader::kClamp_TileMode);
221 fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname);
222 fName.append(data.fName);
223
krajcevskif461a8f2014-06-19 14:14:06 -0700224 if (dither) {
225 fName.appendf("_dither");
226 }
227
fmalita36693b52016-02-24 15:32:57 -0800228 this->setupPaint(&fPaint);
reedc6f28f72016-03-14 12:22:10 -0700229 fPaint.setShader(MakeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f, force4f));
fmalita36693b52016-02-24 15:32:57 -0800230 fPaint.setDither(dither);
reed@google.com84e9c082011-04-13 17:44:24 +0000231 }
232
233protected:
fmalita36693b52016-02-24 15:32:57 -0800234 const char* onGetName() override {
reed@google.com84e9c082011-04-13 17:44:24 +0000235 return fName.c_str();
236 }
237
fmalita36693b52016-02-24 15:32:57 -0800238 SkIPoint onGetSize() override {
239 return SkIPoint::Make(kSize, kSize);
240 }
reed@google.com84e9c082011-04-13 17:44:24 +0000241
fmalita36693b52016-02-24 15:32:57 -0800242 void onDraw(int loops, SkCanvas* canvas) override {
243 const SkRect r = SkRect::MakeIWH(kSize, kSize);
reed@google.com84e9c082011-04-13 17:44:24 +0000244
bsalomona7f79b42014-08-14 12:24:46 -0700245 for (int i = 0; i < loops; i++) {
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000246 switch (fGeomType) {
247 case kRect_GeomType:
fmalita36693b52016-02-24 15:32:57 -0800248 canvas->drawRect(r, fPaint);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000249 break;
250 case kOval_GeomType:
fmalita36693b52016-02-24 15:32:57 -0800251 canvas->drawOval(r, fPaint);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000252 break;
253 }
reed@google.com84e9c082011-04-13 17:44:24 +0000254 }
255 }
256
257private:
tfarinaf168b862014-06-19 12:32:29 -0700258 typedef Benchmark INHERITED;
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000259
reedc6f28f72016-03-14 12:22:10 -0700260 sk_sp<SkShader> MakeShader(GradType gradType, GradData data,
261 SkShader::TileMode tm, float scale, bool force4f) {
fmalita36693b52016-02-24 15:32:57 -0800262 const SkPoint pts[2] = {
263 { 0, 0 },
264 { SkIntToScalar(kSize), SkIntToScalar(kSize) }
265 };
266
267 return gGrads[gradType].fMaker(pts, data, tm, scale, force4f);
268 }
269
270 static const int kSize = 400;
271
272 SkString fName;
273 SkPaint fPaint;
274 const GeomType fGeomType;
reed@google.com84e9c082011-04-13 17:44:24 +0000275};
276
fmalita36693b52016-02-24 15:32:57 -0800277// 4f
278DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kClamp_TileMode,
279 kRect_GeomType, 1, true); )
280DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kClamp_TileMode,
281 kRect_GeomType, 1, true); )
282DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kClamp_TileMode,
283 kRect_GeomType, 1, true); )
284DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode,
285 kRect_GeomType, 1, true); )
286DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode,
287 kRect_GeomType, 1, true); )
288DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode,
289 kRect_GeomType, 1, true); )
290DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode,
291 kRect_GeomType, 1, true); )
292DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode,
293 kRect_GeomType, 1, true); )
294DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode,
295 kRect_GeomType, 1, true); )
296
297DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000298DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1]); )
299DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2]); )
fmalita36693b52016-02-24 15:32:57 -0800300DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
301DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode); )
302DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000303DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode); )
fmalita36693b52016-02-24 15:32:57 -0800304DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode); )
305DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000306
307DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0]); )
308DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[1]); )
309DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[2]); )
310// Draw a radial gradient of radius 1/2 on a rectangle; half the lines should
311// be completely pinned, the other half should pe partially pinned
312DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kRect_GeomType, 0.5f); )
313
314// Draw a radial gradient on a circle of equal size; all the lines should
315// hit the unpinned fast path (so long as GradientBench.W == H)
316DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kOval_GeomType); )
317
318DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kMirror_TileMode); )
commit-bot@chromium.org34150b42013-10-16 18:59:44 +0000319DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000320DEF_BENCH( return new GradientBench(kSweep_GradType); )
321DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[1]); )
322DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[2]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000323DEF_BENCH( return new GradientBench(kConical_GradType); )
324DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[1]); )
325DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[2]); )
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000326DEF_BENCH( return new GradientBench(kConicalZero_GradType); )
327DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[1]); )
328DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[2]); )
329DEF_BENCH( return new GradientBench(kConicalOut_GradType); )
330DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[1]); )
331DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[2]); )
332DEF_BENCH( return new GradientBench(kConicalOutZero_GradType); )
333DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); )
334DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000335
krajcevskif461a8f2014-06-19 14:14:06 -0700336// Dithering
337DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], true); )
338DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], false); )
339DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], true); )
340DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], false); )
341DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], true); )
342DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], false); )
343DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], true); )
344DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], false); )
345
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000346///////////////////////////////////////////////////////////////////////////////
347
tfarinaf168b862014-06-19 12:32:29 -0700348class Gradient2Bench : public Benchmark {
reed@google.com73349aa2013-02-04 18:09:58 +0000349 SkString fName;
350 bool fHasAlpha;
351
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000352public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000353 Gradient2Bench(bool hasAlpha) {
reed@google.com73349aa2013-02-04 18:09:58 +0000354 fName.printf("gradient_create_%s", hasAlpha ? "alpha" : "opaque");
355 fHasAlpha = hasAlpha;
356 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000357
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000358protected:
359 virtual const char* onGetName() {
reed@google.com73349aa2013-02-04 18:09:58 +0000360 return fName.c_str();
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000361 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000362
mtkleina1ebeb22015-10-01 09:43:39 -0700363 virtual void onDraw(int loops, SkCanvas* canvas) {
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000364 SkPaint paint;
365 this->setupPaint(&paint);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000366
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000367 const SkRect r = { 0, 0, SkIntToScalar(4), SkIntToScalar(4) };
reed@google.com1ca4f262011-06-24 19:17:37 +0000368 const SkPoint pts[] = {
369 { 0, 0 },
370 { SkIntToScalar(100), SkIntToScalar(100) },
371 };
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000372
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000373 for (int i = 0; i < loops; i++) {
reed@google.com73349aa2013-02-04 18:09:58 +0000374 const int gray = i % 256;
375 const int alpha = fHasAlpha ? gray : 0xFF;
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000376 SkColor colors[] = {
377 SK_ColorBLACK,
reed@google.com73349aa2013-02-04 18:09:58 +0000378 SkColorSetARGB(alpha, gray, gray, gray),
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000379 SK_ColorWHITE };
reedc6f28f72016-03-14 12:22:10 -0700380 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr,
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000381 SK_ARRAY_COUNT(colors),
reedc6f28f72016-03-14 12:22:10 -0700382 SkShader::kClamp_TileMode));
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000383 canvas->drawRect(r, paint);
384 }
385 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000386
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000387private:
tfarinaf168b862014-06-19 12:32:29 -0700388 typedef Benchmark INHERITED;
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000389};
390
mtklein@google.com410e6e82013-09-13 19:52:27 +0000391DEF_BENCH( return new Gradient2Bench(false); )
392DEF_BENCH( return new Gradient2Bench(true); )