HardStopGradientBench_SpecialHardStops.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. enum class Kind {
  15. k001,
  16. k011,
  17. kCentered,
  18. };
  19. const char* kindstr(Kind k) {
  20. switch (k) {
  21. case Kind::k001:
  22. return "001";
  23. case Kind::k011:
  24. return "011";
  25. case Kind::kCentered:
  26. return "centered";
  27. default:
  28. return "Invalid kind";
  29. }
  30. }
  31. class HardStopGradientBench_SpecialHardStops : public Benchmark {
  32. public:
  33. HardStopGradientBench_SpecialHardStops(int w, int h, Kind kind) {
  34. fW = w;
  35. fH = h;
  36. fKind = kind;
  37. fName.printf("hardstop_special_%03dx%03d_%s", fW, fH, kindstr(fKind));
  38. }
  39. const char* onGetName() override {
  40. return fName.c_str();
  41. }
  42. SkIPoint onGetSize() override {
  43. return SkIPoint::Make(fW, fH);
  44. }
  45. void onPreDraw(SkCanvas* canvas) override {
  46. SkPoint points[2] = {
  47. SkPoint::Make( 0.0f, fH/2.0f),
  48. SkPoint::Make(fW+2.0f, fH/2.0f),
  49. };
  50. SkColor colors[4] = {
  51. SK_ColorRED,
  52. SK_ColorGREEN,
  53. SK_ColorBLUE,
  54. SK_ColorYELLOW,
  55. };
  56. SkScalar pos_001[3] = {
  57. 0.0f,
  58. 0.0f,
  59. 1.0f,
  60. };
  61. SkScalar pos_011[3] = {
  62. 0.0f,
  63. 1.0f,
  64. 1.0f,
  65. };
  66. SkScalar pos_centered[4] = {
  67. 0.0f,
  68. 0.5f,
  69. 0.5f,
  70. 1.0f,
  71. };
  72. SkScalar* positions = fKind == Kind::k001 ? pos_001 :
  73. fKind == Kind::k011 ? pos_011 :
  74. pos_centered;
  75. int count = fKind == Kind::kCentered ? 4 : 3;
  76. fPaint.setShader(SkGradientShader::MakeLinear(points,
  77. colors,
  78. positions,
  79. count,
  80. SkTileMode::kClamp,
  81. 0,
  82. nullptr));
  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. SkString fName;
  91. int fW;
  92. int fH;
  93. Kind fKind;
  94. SkPaint fPaint;
  95. };
  96. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k001););
  97. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k001););
  98. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k001););
  99. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k001););
  100. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k001););
  101. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k011););
  102. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k011););
  103. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k011););
  104. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k011););
  105. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k011););
  106. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::kCentered););
  107. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::kCentered););
  108. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::kCentered););
  109. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::kCentered););
  110. DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::kCentered););