BlurBench.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  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. */
  7. #include "bench/Benchmark.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkMaskFilter.h"
  10. #include "include/core/SkPaint.h"
  11. #include "include/core/SkShader.h"
  12. #include "include/core/SkString.h"
  13. #include "include/utils/SkRandom.h"
  14. #include "src/core/SkBlurMask.h"
  15. #define MINI 0.01f
  16. #define SMALL SkIntToScalar(2)
  17. #define REAL 0.5f
  18. #define BIG SkIntToScalar(10)
  19. #define REALBIG 100.5f
  20. // The value that produces a sigma of just over 2.
  21. #define CUTOVER 2.6f
  22. static const char* gStyleName[] = {
  23. "normal",
  24. "solid",
  25. "outer",
  26. "inner"
  27. };
  28. class BlurBench : public Benchmark {
  29. SkScalar fRadius;
  30. SkBlurStyle fStyle;
  31. SkString fName;
  32. public:
  33. BlurBench(SkScalar rad, SkBlurStyle bs) {
  34. fRadius = rad;
  35. fStyle = bs;
  36. const char* name = rad > 0 ? gStyleName[bs] : "none";
  37. const char* quality = "high_quality";
  38. if (SkScalarFraction(rad) != 0) {
  39. fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality);
  40. } else {
  41. fName.printf("blur_%d_%s_%s", SkScalarRoundToInt(rad), name, quality);
  42. }
  43. }
  44. protected:
  45. const char* onGetName() override {
  46. return fName.c_str();
  47. }
  48. void onDraw(int loops, SkCanvas* canvas) override {
  49. SkPaint paint;
  50. this->setupPaint(&paint);
  51. paint.setAntiAlias(true);
  52. SkRandom rand;
  53. for (int i = 0; i < loops; i++) {
  54. SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
  55. rand.nextUScalar1() * 400);
  56. r.offset(fRadius, fRadius);
  57. if (fRadius > 0) {
  58. paint.setMaskFilter(SkMaskFilter::MakeBlur(fStyle,
  59. SkBlurMask::ConvertRadiusToSigma(fRadius)));
  60. }
  61. canvas->drawOval(r, paint);
  62. }
  63. }
  64. private:
  65. typedef Benchmark INHERITED;
  66. };
  67. DEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle);)
  68. DEF_BENCH(return new BlurBench(MINI, kSolid_SkBlurStyle);)
  69. DEF_BENCH(return new BlurBench(MINI, kOuter_SkBlurStyle);)
  70. DEF_BENCH(return new BlurBench(MINI, kInner_SkBlurStyle);)
  71. DEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle);)
  72. DEF_BENCH(return new BlurBench(SMALL, kSolid_SkBlurStyle);)
  73. DEF_BENCH(return new BlurBench(SMALL, kOuter_SkBlurStyle);)
  74. DEF_BENCH(return new BlurBench(SMALL, kInner_SkBlurStyle);)
  75. DEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle);)
  76. DEF_BENCH(return new BlurBench(BIG, kSolid_SkBlurStyle);)
  77. DEF_BENCH(return new BlurBench(BIG, kOuter_SkBlurStyle);)
  78. DEF_BENCH(return new BlurBench(BIG, kInner_SkBlurStyle);)
  79. DEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle);)
  80. DEF_BENCH(return new BlurBench(REALBIG, kSolid_SkBlurStyle);)
  81. DEF_BENCH(return new BlurBench(REALBIG, kOuter_SkBlurStyle);)
  82. DEF_BENCH(return new BlurBench(REALBIG, kInner_SkBlurStyle);)
  83. DEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle);)
  84. DEF_BENCH(return new BlurBench(REAL, kSolid_SkBlurStyle);)
  85. DEF_BENCH(return new BlurBench(REAL, kOuter_SkBlurStyle);)
  86. DEF_BENCH(return new BlurBench(REAL, kInner_SkBlurStyle);)
  87. DEF_BENCH(return new BlurBench(0, kNormal_SkBlurStyle);)