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; |
| 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 |