MorphologyBench.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright 2012 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/SkPaint.h"
  10. #include "include/core/SkShader.h"
  11. #include "include/core/SkString.h"
  12. #include "include/effects/SkMorphologyImageFilter.h"
  13. #include "include/utils/SkRandom.h"
  14. #define SMALL SkIntToScalar(2)
  15. #define REAL 1.5f
  16. #define BIG SkIntToScalar(10)
  17. enum MorphologyType {
  18. kErode_MT,
  19. kDilate_MT
  20. };
  21. static const char* gStyleName[] = {
  22. "erode",
  23. "dilate"
  24. };
  25. class MorphologyBench : public Benchmark {
  26. SkScalar fRadius;
  27. MorphologyType fStyle;
  28. SkString fName;
  29. public:
  30. MorphologyBench(SkScalar rad, MorphologyType style)
  31. {
  32. fRadius = rad;
  33. fStyle = style;
  34. const char* name = rad > 0 ? gStyleName[style] : "none";
  35. if (SkScalarFraction(rad) != 0) {
  36. fName.printf("morph_%.2f_%s", SkScalarToFloat(rad), name);
  37. } else {
  38. fName.printf("morph_%d_%s", SkScalarRoundToInt(rad), name);
  39. }
  40. }
  41. protected:
  42. const char* onGetName() override {
  43. return fName.c_str();
  44. }
  45. void onDraw(int loops, SkCanvas* canvas) override {
  46. SkPaint paint;
  47. this->setupPaint(&paint);
  48. paint.setAntiAlias(true);
  49. SkRandom rand;
  50. for (int i = 0; i < loops; i++) {
  51. SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
  52. rand.nextUScalar1() * 400);
  53. r.offset(fRadius, fRadius);
  54. if (fRadius > 0) {
  55. sk_sp<SkImageFilter> mf;
  56. switch (fStyle) {
  57. case kDilate_MT:
  58. mf = SkDilateImageFilter::Make(SkScalarFloorToInt(fRadius),
  59. SkScalarFloorToInt(fRadius),
  60. nullptr);
  61. break;
  62. case kErode_MT:
  63. mf = SkErodeImageFilter::Make(SkScalarFloorToInt(fRadius),
  64. SkScalarFloorToInt(fRadius),
  65. nullptr);
  66. break;
  67. }
  68. paint.setImageFilter(std::move(mf));
  69. }
  70. canvas->drawOval(r, paint);
  71. }
  72. }
  73. private:
  74. typedef Benchmark INHERITED;
  75. };
  76. DEF_BENCH( return new MorphologyBench(SMALL, kErode_MT); )
  77. DEF_BENCH( return new MorphologyBench(SMALL, kDilate_MT); )
  78. DEF_BENCH( return new MorphologyBench(BIG, kErode_MT); )
  79. DEF_BENCH( return new MorphologyBench(BIG, kDilate_MT); )
  80. DEF_BENCH( return new MorphologyBench(REAL, kErode_MT); )
  81. DEF_BENCH( return new MorphologyBench(REAL, kDilate_MT); )
  82. DEF_BENCH( return new MorphologyBench(0, kErode_MT); )