BlendmodeBench.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright 2013 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/SkFont.h"
  10. #include "include/core/SkPaint.h"
  11. #include "include/core/SkString.h"
  12. #include "include/core/SkTextBlob.h"
  13. #include "include/utils/SkRandom.h"
  14. #include "src/core/SkBlendModePriv.h"
  15. // Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
  16. class XfermodeBench : public Benchmark {
  17. public:
  18. XfermodeBench(SkBlendMode mode, bool aa) : fBlendMode(mode) {
  19. fAA = aa;
  20. fName.printf("blendmode_%s_%s", aa ? "mask" : "rect", SkBlendMode_Name(mode));
  21. }
  22. protected:
  23. const char* onGetName() override { return fName.c_str(); }
  24. void onDraw(int loops, SkCanvas* canvas) override {
  25. const char* text = "Hamburgefons";
  26. size_t len = strlen(text);
  27. SkISize size = canvas->getBaseLayerSize();
  28. SkRandom random;
  29. for (int i = 0; i < loops; ++i) {
  30. SkPaint paint;
  31. paint.setBlendMode(fBlendMode);
  32. paint.setColor(random.nextU());
  33. if (fAA) {
  34. // Draw text to exercise AA code paths.
  35. SkFont font;
  36. font.setSize(random.nextRangeScalar(12, 96));
  37. SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth),
  38. y = random.nextRangeScalar(0, (SkScalar)size.fHeight);
  39. auto blob = SkTextBlob::MakeFromText(text, len, font, SkTextEncoding::kUTF8);
  40. for (int j = 0; j < 1000; ++j) {
  41. canvas->drawTextBlob(blob, x, y, paint);
  42. }
  43. } else {
  44. // Draw rects to exercise non-AA code paths.
  45. SkScalar w = random.nextRangeScalar(50, 100);
  46. SkScalar h = random.nextRangeScalar(50, 100);
  47. SkRect rect = SkRect::MakeXYWH(
  48. random.nextUScalar1() * (size.fWidth - w),
  49. random.nextUScalar1() * (size.fHeight - h),
  50. w,
  51. h
  52. );
  53. for (int j = 0; j < 1000; ++j) {
  54. canvas->drawRect(rect, paint);
  55. }
  56. }
  57. }
  58. }
  59. private:
  60. SkBlendMode fBlendMode;
  61. SkString fName;
  62. bool fAA;
  63. typedef Benchmark INHERITED;
  64. };
  65. //////////////////////////////////////////////////////////////////////////////
  66. #define BENCH(...) \
  67. DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); ) \
  68. DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); )
  69. BENCH(SkBlendMode::kClear)
  70. BENCH(SkBlendMode::kSrc)
  71. BENCH(SkBlendMode::kDst)
  72. BENCH(SkBlendMode::kSrcOver)
  73. BENCH(SkBlendMode::kDstOver)
  74. BENCH(SkBlendMode::kSrcIn)
  75. BENCH(SkBlendMode::kDstIn)
  76. BENCH(SkBlendMode::kSrcOut)
  77. BENCH(SkBlendMode::kDstOut)
  78. BENCH(SkBlendMode::kSrcATop)
  79. BENCH(SkBlendMode::kDstATop)
  80. BENCH(SkBlendMode::kXor)
  81. BENCH(SkBlendMode::kPlus)
  82. BENCH(SkBlendMode::kModulate)
  83. BENCH(SkBlendMode::kScreen)
  84. BENCH(SkBlendMode::kOverlay)
  85. BENCH(SkBlendMode::kDarken)
  86. BENCH(SkBlendMode::kLighten)
  87. BENCH(SkBlendMode::kColorDodge)
  88. BENCH(SkBlendMode::kColorBurn)
  89. BENCH(SkBlendMode::kHardLight)
  90. BENCH(SkBlendMode::kSoftLight)
  91. BENCH(SkBlendMode::kDifference)
  92. BENCH(SkBlendMode::kExclusion)
  93. BENCH(SkBlendMode::kMultiply)
  94. BENCH(SkBlendMode::kHue)
  95. BENCH(SkBlendMode::kSaturation)
  96. BENCH(SkBlendMode::kColor)
  97. BENCH(SkBlendMode::kLuminosity)