HardStopGradientBench_ScaleNumColors.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright 2016 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/SkColor.h"
  10. #include "include/core/SkPaint.h"
  11. #include "include/core/SkShader.h"
  12. #include "include/core/SkString.h"
  13. #include "include/effects/SkGradientShader.h"
  14. static const char* get_tilemode_name(SkTileMode tilemode) {
  15. switch (tilemode) {
  16. case SkTileMode::kClamp:
  17. return "clamp";
  18. case SkTileMode::kRepeat:
  19. return "repeat";
  20. case SkTileMode::kMirror:
  21. return "mirror";
  22. case SkTileMode::kDecal:
  23. return "decal";
  24. }
  25. return "";
  26. }
  27. class HardStopGradientBench_ScaleNumColors : public Benchmark {
  28. public:
  29. HardStopGradientBench_ScaleNumColors(SkTileMode tilemode, int count) {
  30. fName.printf("hardstop_scale_num_colors_%s_%03d_colors", get_tilemode_name(tilemode), count);
  31. fTileMode = tilemode;
  32. fColorCount = count;
  33. }
  34. const char* onGetName() override {
  35. return fName.c_str();
  36. }
  37. SkIPoint onGetSize() override {
  38. return SkIPoint::Make(kSize, kSize);
  39. }
  40. /*
  41. * Set up a linear gradient from left to right with
  42. * fColorCount colors alternating between four
  43. * different colors. The positions are evenly spaced,
  44. * with the exception of the first two; these create a
  45. * hard stop in order to trigger the hard stop code.
  46. */
  47. void onPreDraw(SkCanvas* canvas) override {
  48. // Left to right
  49. SkPoint points[2] = {
  50. SkPoint::Make(0, kSize/2),
  51. SkPoint::Make(kSize-1, kSize/2),
  52. };
  53. constexpr int kNumColorChoices = 4;
  54. SkColor color_choices[kNumColorChoices] = {
  55. SK_ColorRED,
  56. SK_ColorGREEN,
  57. SK_ColorBLUE,
  58. SK_ColorYELLOW,
  59. };
  60. // Alternate between different choices
  61. SkColor colors[100];
  62. for (int i = 0; i < fColorCount; i++) {
  63. colors[i] = color_choices[i % kNumColorChoices];
  64. }
  65. // Create a hard stop
  66. SkScalar positions[100];
  67. positions[0] = 0.0f;
  68. positions[1] = 0.0f;
  69. for (int i = 2; i < fColorCount; i++) {
  70. // Evenly spaced afterwards
  71. positions[i] = i / (fColorCount - 1.0f);
  72. }
  73. fPaint.setShader(SkGradientShader::MakeLinear(points,
  74. colors,
  75. positions,
  76. fColorCount,
  77. fTileMode,
  78. 0,
  79. nullptr));
  80. }
  81. /*
  82. * Draw simple linear gradient from left to right
  83. */
  84. void onDraw(int loops, SkCanvas* canvas) override {
  85. for (int i = 0; i < loops; i++) {
  86. canvas->drawPaint(fPaint);
  87. }
  88. }
  89. private:
  90. static const int kSize = 500;
  91. SkTileMode fTileMode;
  92. SkString fName;
  93. int fColorCount;
  94. SkPaint fPaint;
  95. typedef Benchmark INHERITED;
  96. };
  97. // Clamp
  98. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 3);)
  99. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 4);)
  100. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 5);)
  101. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 10);)
  102. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 25);)
  103. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 50);)
  104. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 100);)
  105. // Repeat
  106. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 3);)
  107. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 4);)
  108. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 5);)
  109. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 10);)
  110. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 25);)
  111. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 50);)
  112. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 100);)
  113. // Mirror
  114. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 3);)
  115. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 4);)
  116. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 5);)
  117. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 10);)
  118. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 25);)
  119. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 50);)
  120. DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 100);)