blob: 73014f7bae2ba55ad960097c2bb70167eb644d10 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
tfarinaf168b862014-06-19 12:32:29 -07008#include "Benchmark.h"
reed@google.com84e9c082011-04-13 17:44:24 +00009#include "SkBitmap.h"
10#include "SkCanvas.h"
11#include "SkColorPriv.h"
12#include "SkGradientShader.h"
fmalita36693b52016-02-24 15:32:57 -080013#include "SkLinearGradient.h"
reed@google.com84e9c082011-04-13 17:44:24 +000014#include "SkPaint.h"
15#include "SkShader.h"
16#include "SkString.h"
reed@google.com84e9c082011-04-13 17:44:24 +000017
18struct GradData {
19 int fCount;
20 const SkColor* fColors;
21 const SkScalar* fPos;
commit-bot@chromium.org5396a042013-07-10 16:13:14 +000022 const char* fName;
reed@google.com84e9c082011-04-13 17:44:24 +000023};
24
25static const SkColor gColors[] = {
commit-bot@chromium.orgb6865392013-07-09 19:43:29 +000026 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
commit-bot@chromium.org5396a042013-07-10 16:13:14 +000027 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,
35 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, // 10 lines, 50 colors
reed@google.com84e9c082011-04-13 17:44:24 +000036};
37
krajcevskif461a8f2014-06-19 14:14:06 -070038static const SkColor gShallowColors[] = { 0xFF555555, 0xFF444444 };
39
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" },
reed@google.com84e9c082011-04-13 17:44:24 +000047};
48
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000049/// Ignores scale
reed@google.com84e9c082011-04-13 17:44:24 +000050static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -080051 SkShader::TileMode tm, float scale, bool force4f) {
52 const uint32_t flags = force4f ? SkLinearGradient::kForce4fContext_PrivateFlag : 0;
53 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
54 data.fCount, tm, flags, nullptr);
reed@google.com84e9c082011-04-13 17:44:24 +000055}
56
57static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -080058 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com84e9c082011-04-13 17:44:24 +000059 SkPoint center;
60 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
61 SkScalarAve(pts[0].fY, pts[1].fY));
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000062 return SkGradientShader::CreateRadial(center, center.fX * scale,
63 data.fColors,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +000064 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
reed@google.com84e9c082011-04-13 17:44:24 +000068static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -080069 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));
73 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +000074 data.fPos, data.fCount);
reed@google.com84e9c082011-04-13 17:44:24 +000075}
76
tomhudson@google.com5ea050f2011-09-26 15:03:55 +000077/// Ignores scale
reed@google.com258e0bf2012-06-07 14:18:34 +000078static SkShader* MakeConical(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -080079 SkShader::TileMode tm, float scale, bool force4f) {
reed@google.com258e0bf2012-06-07 14:18:34 +000080 SkPoint center0, center1;
81 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
82 SkScalarAve(pts[0].fY, pts[1].fY));
83 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
84 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
85 return SkGradientShader::CreateTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
86 center0, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +000087 data.fColors, data.fPos, data.fCount, tm);
reed@google.com84e9c082011-04-13 17:44:24 +000088}
89
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000090/// Ignores scale
91static SkShader* MakeConicalZeroRad(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -080092 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +000093 SkPoint center0, center1;
94 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
95 SkScalarAve(pts[0].fY, pts[1].fY));
96 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
97 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
98 return SkGradientShader::CreateTwoPointConical(center1, 0.0,
99 center0, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000100 data.fColors, data.fPos, data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000101}
102
103/// Ignores scale
104static SkShader* MakeConicalOutside(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -0800105 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000106 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700107 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
108 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000109 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
110 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
111 return SkGradientShader::CreateTwoPointConical(center0, radius0,
112 center1, radius1,
113 data.fColors, data.fPos,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000114 data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000115}
116
117/// Ignores scale
118static SkShader* MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -0800119 SkShader::TileMode tm, float scale, bool force4f) {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000120 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700121 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
122 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000123 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
124 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
125 return SkGradientShader::CreateTwoPointConical(center0, 0.0,
126 center1, radius1,
127 data.fColors, data.fPos,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000128 data.fCount, tm);
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000129}
130
reed@google.com84e9c082011-04-13 17:44:24 +0000131typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
fmalita36693b52016-02-24 15:32:57 -0800132 SkShader::TileMode tm, float scale, bool force4f);
reed@google.com84e9c082011-04-13 17:44:24 +0000133
134static const struct {
135 GradMaker fMaker;
136 const char* fName;
reed@google.com84e9c082011-04-13 17:44:24 +0000137} gGrads[] = {
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000138 { MakeLinear, "linear" },
139 { MakeRadial, "radial1" },
140 { MakeSweep, "sweep" },
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000141 { MakeConical, "conical" },
142 { MakeConicalZeroRad, "conicalZero" },
143 { MakeConicalOutside, "conicalOut" },
144 { MakeConicalOutsideZeroRad, "conicalOutZero" },
reed@google.com84e9c082011-04-13 17:44:24 +0000145};
146
147enum GradType { // these must match the order in gGrads
148 kLinear_GradType,
149 kRadial_GradType,
150 kSweep_GradType,
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000151 kConical_GradType,
152 kConicalZero_GradType,
153 kConicalOut_GradType,
154 kConicalOutZero_GradType
reed@google.com84e9c082011-04-13 17:44:24 +0000155};
156
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000157enum GeomType {
158 kRect_GeomType,
159 kOval_GeomType
160};
161
reed@google.com72415162011-06-15 21:17:37 +0000162static const char* tilemodename(SkShader::TileMode tm) {
163 switch (tm) {
164 case SkShader::kClamp_TileMode:
165 return "clamp";
166 case SkShader::kRepeat_TileMode:
167 return "repeat";
168 case SkShader::kMirror_TileMode:
169 return "mirror";
170 default:
mtklein@google.com330313a2013-08-22 15:37:26 +0000171 SkDEBUGFAIL("unknown tilemode");
reed@google.com72415162011-06-15 21:17:37 +0000172 return "error";
173 }
174}
175
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000176static const char* geomtypename(GeomType gt) {
177 switch (gt) {
178 case kRect_GeomType:
179 return "rectangle";
180 case kOval_GeomType:
181 return "oval";
182 default:
mtklein@google.com330313a2013-08-22 15:37:26 +0000183 SkDEBUGFAIL("unknown geometry type");
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000184 return "error";
185 }
186}
187
reed@google.com84e9c082011-04-13 17:44:24 +0000188///////////////////////////////////////////////////////////////////////////////
189
tfarinaf168b862014-06-19 12:32:29 -0700190class GradientBench : public Benchmark {
reed@google.com84e9c082011-04-13 17:44:24 +0000191public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000192 GradientBench(GradType gradType,
commit-bot@chromium.org5396a042013-07-10 16:13:14 +0000193 GradData data = gGradData[0],
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000194 SkShader::TileMode tm = SkShader::kClamp_TileMode,
195 GeomType geomType = kRect_GeomType,
fmalita36693b52016-02-24 15:32:57 -0800196 float scale = 1.0f,
197 bool force4f = false)
198 : fGeomType(geomType) {
199
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000200 fName.printf("gradient_%s_%s", gGrads[gradType].fName,
201 tilemodename(tm));
202 if (geomType != kRect_GeomType) {
fmalita36693b52016-02-24 15:32:57 -0800203 fName.appendf("_%s", geomtypename(geomType));
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000204 }
reed@google.com84e9c082011-04-13 17:44:24 +0000205
commit-bot@chromium.org3400f4b2013-09-30 19:41:09 +0000206 if (scale != 1.f) {
207 fName.appendf("_scale_%g", scale);
208 }
209
commit-bot@chromium.org5396a042013-07-10 16:13:14 +0000210 fName.append(data.fName);
211
fmalita36693b52016-02-24 15:32:57 -0800212 if (force4f) {
213 fName.append("_4f");
214 }
215
216 SkAutoTUnref<SkShader> shader(MakeShader(gradType, data, tm, scale, force4f));
217 this->setupPaint(&fPaint);
218 fPaint.setShader(shader);
reed@google.com84e9c082011-04-13 17:44:24 +0000219 }
220
fmalita36693b52016-02-24 15:32:57 -0800221 GradientBench(GradType gradType, GradData data, bool dither, bool force4f = false)
222 : fGeomType(kRect_GeomType) {
223
krajcevskif461a8f2014-06-19 14:14:06 -0700224 const char *tmname = tilemodename(SkShader::kClamp_TileMode);
225 fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname);
226 fName.append(data.fName);
227
krajcevskif461a8f2014-06-19 14:14:06 -0700228 if (dither) {
229 fName.appendf("_dither");
230 }
231
fmalita36693b52016-02-24 15:32:57 -0800232 SkAutoTUnref<SkShader> shader(
233 MakeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f, force4f));
234 this->setupPaint(&fPaint);
235 fPaint.setShader(shader);
236 fPaint.setDither(dither);
reed@google.com84e9c082011-04-13 17:44:24 +0000237 }
238
239protected:
fmalita36693b52016-02-24 15:32:57 -0800240 const char* onGetName() override {
reed@google.com84e9c082011-04-13 17:44:24 +0000241 return fName.c_str();
242 }
243
fmalita36693b52016-02-24 15:32:57 -0800244 SkIPoint onGetSize() override {
245 return SkIPoint::Make(kSize, kSize);
246 }
reed@google.com84e9c082011-04-13 17:44:24 +0000247
fmalita36693b52016-02-24 15:32:57 -0800248 void onDraw(int loops, SkCanvas* canvas) override {
249 const SkRect r = SkRect::MakeIWH(kSize, kSize);
reed@google.com84e9c082011-04-13 17:44:24 +0000250
bsalomona7f79b42014-08-14 12:24:46 -0700251 for (int i = 0; i < loops; i++) {
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000252 switch (fGeomType) {
253 case kRect_GeomType:
fmalita36693b52016-02-24 15:32:57 -0800254 canvas->drawRect(r, fPaint);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000255 break;
256 case kOval_GeomType:
fmalita36693b52016-02-24 15:32:57 -0800257 canvas->drawOval(r, fPaint);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000258 break;
259 }
reed@google.com84e9c082011-04-13 17:44:24 +0000260 }
261 }
262
263private:
tfarinaf168b862014-06-19 12:32:29 -0700264 typedef Benchmark INHERITED;
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000265
fmalita36693b52016-02-24 15:32:57 -0800266 SkShader* MakeShader(GradType gradType, GradData data,
267 SkShader::TileMode tm, float scale, bool force4f) {
268 const SkPoint pts[2] = {
269 { 0, 0 },
270 { SkIntToScalar(kSize), SkIntToScalar(kSize) }
271 };
272
273 return gGrads[gradType].fMaker(pts, data, tm, scale, force4f);
274 }
275
276 static const int kSize = 400;
277
278 SkString fName;
279 SkPaint fPaint;
280 const GeomType fGeomType;
reed@google.com84e9c082011-04-13 17:44:24 +0000281};
282
fmalita36693b52016-02-24 15:32:57 -0800283// 4f
284DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kClamp_TileMode,
285 kRect_GeomType, 1, true); )
286DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kClamp_TileMode,
287 kRect_GeomType, 1, true); )
288DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kClamp_TileMode,
289 kRect_GeomType, 1, true); )
290DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode,
291 kRect_GeomType, 1, true); )
292DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode,
293 kRect_GeomType, 1, true); )
294DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode,
295 kRect_GeomType, 1, true); )
296DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode,
297 kRect_GeomType, 1, true); )
298DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode,
299 kRect_GeomType, 1, true); )
300DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode,
301 kRect_GeomType, 1, true); )
302
303DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000304DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1]); )
305DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2]); )
fmalita36693b52016-02-24 15:32:57 -0800306DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
307DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode); )
308DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000309DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode); )
fmalita36693b52016-02-24 15:32:57 -0800310DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode); )
311DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000312
313DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0]); )
314DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[1]); )
315DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[2]); )
316// Draw a radial gradient of radius 1/2 on a rectangle; half the lines should
317// be completely pinned, the other half should pe partially pinned
318DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kRect_GeomType, 0.5f); )
319
320// Draw a radial gradient on a circle of equal size; all the lines should
321// hit the unpinned fast path (so long as GradientBench.W == H)
322DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kOval_GeomType); )
323
324DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kMirror_TileMode); )
commit-bot@chromium.org34150b42013-10-16 18:59:44 +0000325DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000326DEF_BENCH( return new GradientBench(kSweep_GradType); )
327DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[1]); )
328DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[2]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000329DEF_BENCH( return new GradientBench(kConical_GradType); )
330DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[1]); )
331DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[2]); )
commit-bot@chromium.org95f79262014-04-14 16:02:31 +0000332DEF_BENCH( return new GradientBench(kConicalZero_GradType); )
333DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[1]); )
334DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[2]); )
335DEF_BENCH( return new GradientBench(kConicalOut_GradType); )
336DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[1]); )
337DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[2]); )
338DEF_BENCH( return new GradientBench(kConicalOutZero_GradType); )
339DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); )
340DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); )
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000341
krajcevskif461a8f2014-06-19 14:14:06 -0700342// Dithering
343DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], true); )
344DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], false); )
345DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], true); )
346DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], false); )
347DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], true); )
348DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], false); )
349DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], true); )
350DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], false); )
351
commit-bot@chromium.orgb120bd92013-10-07 17:18:21 +0000352///////////////////////////////////////////////////////////////////////////////
353
tfarinaf168b862014-06-19 12:32:29 -0700354class Gradient2Bench : public Benchmark {
reed@google.com73349aa2013-02-04 18:09:58 +0000355 SkString fName;
356 bool fHasAlpha;
357
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000358public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000359 Gradient2Bench(bool hasAlpha) {
reed@google.com73349aa2013-02-04 18:09:58 +0000360 fName.printf("gradient_create_%s", hasAlpha ? "alpha" : "opaque");
361 fHasAlpha = hasAlpha;
362 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000363
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000364protected:
365 virtual const char* onGetName() {
reed@google.com73349aa2013-02-04 18:09:58 +0000366 return fName.c_str();
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000367 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000368
mtkleina1ebeb22015-10-01 09:43:39 -0700369 virtual void onDraw(int loops, SkCanvas* canvas) {
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000370 SkPaint paint;
371 this->setupPaint(&paint);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000372
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000373 const SkRect r = { 0, 0, SkIntToScalar(4), SkIntToScalar(4) };
reed@google.com1ca4f262011-06-24 19:17:37 +0000374 const SkPoint pts[] = {
375 { 0, 0 },
376 { SkIntToScalar(100), SkIntToScalar(100) },
377 };
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000378
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000379 for (int i = 0; i < loops; i++) {
reed@google.com73349aa2013-02-04 18:09:58 +0000380 const int gray = i % 256;
381 const int alpha = fHasAlpha ? gray : 0xFF;
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000382 SkColor colors[] = {
383 SK_ColorBLACK,
reed@google.com73349aa2013-02-04 18:09:58 +0000384 SkColorSetARGB(alpha, gray, gray, gray),
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000385 SK_ColorWHITE };
halcanary96fcdcc2015-08-27 07:41:13 -0700386 SkShader* s = SkGradientShader::CreateLinear(pts, colors, nullptr,
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000387 SK_ARRAY_COUNT(colors),
388 SkShader::kClamp_TileMode);
389 paint.setShader(s)->unref();
390 canvas->drawRect(r, paint);
391 }
392 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000393
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000394private:
tfarinaf168b862014-06-19 12:32:29 -0700395 typedef Benchmark INHERITED;
reed@google.com8ac7a0f2011-06-16 13:14:19 +0000396};
397
mtklein@google.com410e6e82013-09-13 19:52:27 +0000398DEF_BENCH( return new Gradient2Bench(false); )
399DEF_BENCH( return new Gradient2Bench(true); )