OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkBenchmark.h" | 8 #include "SkBenchmark.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 16 matching lines...) Expand all Loading... | |
27 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, | 28 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, |
29 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, | 30 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, |
31 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, | 32 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, |
33 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, // 1 0 lines, 50 colors | 34 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, // 1 0 lines, 50 colors |
35 }; | 35 }; |
36 | 36 |
37 static const SkColor gShallowColors[] = { 0xFF555555, 0xFF444444 }; | |
38 | |
37 // We have several special-cases depending on the number (and spacing) of colors , so | 39 // We have several special-cases depending on the number (and spacing) of colors , so |
38 // try to exercise those here. | 40 // try to exercise those here. |
39 static const GradData gGradData[] = { | 41 static const GradData gGradData[] = { |
40 { 2, gColors, NULL, "" }, | 42 { 2, gColors, NULL, "" }, |
41 { 50, gColors, NULL, "_hicolor" }, // many color gradient | 43 { 50, gColors, NULL, "_hicolor" }, // many color gradient |
42 { 3, gColors, NULL, "_3color" }, | 44 { 3, gColors, NULL, "_3color" }, |
45 { 2, gShallowColors, NULL, "_shallow" }, | |
43 }; | 46 }; |
44 | 47 |
45 /// Ignores scale | 48 /// Ignores scale |
46 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, | 49 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, |
47 SkShader::TileMode tm, float scale) { | 50 SkShader::TileMode tm, float scale) { |
48 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCo unt, tm); | 51 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCo unt, tm); |
49 } | 52 } |
50 | 53 |
51 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, | 54 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, |
52 SkShader::TileMode tm, float scale) { | 55 SkShader::TileMode tm, float scale) { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
193 SkDEBUGFAIL("unknown geometry type"); | 196 SkDEBUGFAIL("unknown geometry type"); |
194 return "error"; | 197 return "error"; |
195 } | 198 } |
196 } | 199 } |
197 | 200 |
198 /////////////////////////////////////////////////////////////////////////////// | 201 /////////////////////////////////////////////////////////////////////////////// |
199 | 202 |
200 class GradientBench : public SkBenchmark { | 203 class GradientBench : public SkBenchmark { |
201 SkString fName; | 204 SkString fName; |
202 SkShader* fShader; | 205 SkShader* fShader; |
206 bool fDither; | |
203 enum { | 207 enum { |
204 W = 400, | 208 W = 400, |
205 H = 400, | 209 H = 400, |
206 kRepeat = 15, | 210 kRepeat = 15, |
207 }; | 211 }; |
208 public: | 212 public: |
213 SkShader* makeShader(GradType gradType, GradData data, SkShader::TileMode tm , float scale) { | |
214 const SkPoint pts[2] = { | |
215 { 0, 0 }, | |
216 { SkIntToScalar(W), SkIntToScalar(H) } | |
217 }; | |
218 | |
219 return gGrads[gradType].fMaker(pts, data, tm, scale); | |
220 } | |
221 | |
209 GradientBench(GradType gradType, | 222 GradientBench(GradType gradType, |
210 GradData data = gGradData[0], | 223 GradData data = gGradData[0], |
211 SkShader::TileMode tm = SkShader::kClamp_TileMode, | 224 SkShader::TileMode tm = SkShader::kClamp_TileMode, |
212 GeomType geomType = kRect_GeomType, | 225 GeomType geomType = kRect_GeomType, |
213 float scale = 1.0f) { | 226 float scale = 1.0f) { |
214 fName.printf("gradient_%s_%s", gGrads[gradType].fName, | 227 fName.printf("gradient_%s_%s", gGrads[gradType].fName, |
215 tilemodename(tm)); | 228 tilemodename(tm)); |
216 if (geomType != kRect_GeomType) { | 229 if (geomType != kRect_GeomType) { |
217 fName.append("_"); | 230 fName.append("_"); |
218 fName.append(geomtypename(geomType)); | 231 fName.append(geomtypename(geomType)); |
219 } | 232 } |
220 | 233 |
221 if (scale != 1.f) { | 234 if (scale != 1.f) { |
222 fName.appendf("_scale_%g", scale); | 235 fName.appendf("_scale_%g", scale); |
223 } | 236 } |
224 | 237 |
225 fName.append(data.fName); | 238 fName.append(data.fName); |
226 | 239 |
227 const SkPoint pts[2] = { | 240 fDither = false; |
228 { 0, 0 }, | 241 fShader = this->makeShader(gradType, data, tm, scale); |
229 { SkIntToScalar(W), SkIntToScalar(H) } | 242 fGeomType = geomType; |
230 }; | 243 } |
231 | 244 |
232 fShader = gGrads[gradType].fMaker(pts, data, tm, scale); | 245 GradientBench(GradType gradType, GradData data, bool dither) { |
233 fGeomType = geomType; | 246 const char *tmname = tilemodename(SkShader::kClamp_TileMode); |
247 fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname); | |
248 fName.append(data.fName); | |
249 | |
250 if (dither) { | |
251 fDither = true; | |
egdaniel
2014/06/19 13:41:28
can we just do fDither = dither? Then no need for
krajcevski
2014/06/19 13:51:43
Done.
| |
252 fName.appendf("_dither"); | |
253 } else { | |
254 fDither = false; | |
255 } | |
256 | |
257 fShader = this->makeShader(gradType, data, SkShader::kClamp_TileMode, 1. 0f); | |
258 fGeomType = kRect_GeomType; | |
234 } | 259 } |
235 | 260 |
236 virtual ~GradientBench() { | 261 virtual ~GradientBench() { |
237 fShader->unref(); | 262 fShader->unref(); |
238 } | 263 } |
239 | 264 |
240 protected: | 265 protected: |
241 virtual const char* onGetName() { | 266 virtual const char* onGetName() { |
242 return fName.c_str(); | 267 return fName.c_str(); |
243 } | 268 } |
244 | 269 |
245 virtual void onDraw(const int loops, SkCanvas* canvas) { | 270 virtual void onDraw(const int loops, SkCanvas* canvas) { |
246 SkPaint paint; | 271 SkPaint paint; |
247 this->setupPaint(&paint); | 272 this->setupPaint(&paint); |
248 | 273 |
249 paint.setShader(fShader); | 274 paint.setShader(fShader); |
275 if (fDither) { | |
276 paint.setDither(true); | |
277 } | |
250 | 278 |
251 SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) }; | 279 SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) }; |
252 for (int i = 0; i < loops * kRepeat; i++) { | 280 for (int i = 0; i < loops * kRepeat; i++) { |
253 switch (fGeomType) { | 281 switch (fGeomType) { |
254 case kRect_GeomType: | 282 case kRect_GeomType: |
255 canvas->drawRect(r, paint); | 283 canvas->drawRect(r, paint); |
256 break; | 284 break; |
257 case kOval_GeomType: | 285 case kOval_GeomType: |
258 canvas->drawOval(r, paint); | 286 canvas->drawOval(r, paint); |
259 break; | 287 break; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
297 DEF_BENCH( return new GradientBench(kConicalZero_GradType); ) | 325 DEF_BENCH( return new GradientBench(kConicalZero_GradType); ) |
298 DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[1]); ) | 326 DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[1]); ) |
299 DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[2]); ) | 327 DEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[2]); ) |
300 DEF_BENCH( return new GradientBench(kConicalOut_GradType); ) | 328 DEF_BENCH( return new GradientBench(kConicalOut_GradType); ) |
301 DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[1]); ) | 329 DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[1]); ) |
302 DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[2]); ) | 330 DEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[2]); ) |
303 DEF_BENCH( return new GradientBench(kConicalOutZero_GradType); ) | 331 DEF_BENCH( return new GradientBench(kConicalOutZero_GradType); ) |
304 DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); ) | 332 DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); ) |
305 DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); ) | 333 DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); ) |
306 | 334 |
335 // Dithering | |
336 DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], true); ) | |
337 DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], false); ) | |
338 DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], true); ) | |
339 DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], false); ) | |
340 DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], true); ) | |
341 DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], false); ) | |
342 DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], true); ) | |
343 DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], false); ) | |
344 | |
307 /////////////////////////////////////////////////////////////////////////////// | 345 /////////////////////////////////////////////////////////////////////////////// |
308 | 346 |
309 class Gradient2Bench : public SkBenchmark { | 347 class Gradient2Bench : public SkBenchmark { |
310 SkString fName; | 348 SkString fName; |
311 bool fHasAlpha; | 349 bool fHasAlpha; |
312 | 350 |
313 public: | 351 public: |
314 Gradient2Bench(bool hasAlpha) { | 352 Gradient2Bench(bool hasAlpha) { |
315 fName.printf("gradient_create_%s", hasAlpha ? "alpha" : "opaque"); | 353 fName.printf("gradient_create_%s", hasAlpha ? "alpha" : "opaque"); |
316 fHasAlpha = hasAlpha; | 354 fHasAlpha = hasAlpha; |
(...skipping 28 matching lines...) Expand all Loading... | |
345 canvas->drawRect(r, paint); | 383 canvas->drawRect(r, paint); |
346 } | 384 } |
347 } | 385 } |
348 | 386 |
349 private: | 387 private: |
350 typedef SkBenchmark INHERITED; | 388 typedef SkBenchmark INHERITED; |
351 }; | 389 }; |
352 | 390 |
353 DEF_BENCH( return new Gradient2Bench(false); ) | 391 DEF_BENCH( return new Gradient2Bench(false); ) |
354 DEF_BENCH( return new Gradient2Bench(true); ) | 392 DEF_BENCH( return new Gradient2Bench(true); ) |
OLD | NEW |