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 8 #include "Benchmark.h" 9 10 #include "SkCanvas.h" 11 #include "SkShader.h" 12 #include "SkGradientShader.h" 13 #include "SkString.h" 14 #include "SkColor.h" 15 #include "SkPaint.h" 16 17 enum class Kind { 18 k001, 19 k011, 20 kCentered, 21 }; 22 23 const char* kindstr(Kind k) { 24 switch (k) { 25 case Kind::k001: 26 return "001"; 27 case Kind::k011: 28 return "011"; 29 case Kind::kCentered: 30 return "centered"; 31 default: 32 return "Invalid kind"; 33 } 34 } 35 36 class HardStopGradientBench_SpecialHardStops : public Benchmark { 37 public: 38 HardStopGradientBench_SpecialHardStops(int w, int h, Kind kind) { 39 fW = w; 40 fH = h; 41 fKind = kind; 42 43 fName.printf("hardstop_special_%03dx%03d_%s", fW, fH, kindstr(fKind)); 44 } 45 46 const char* onGetName() override { 47 return fName.c_str(); 48 } 49 50 SkIPoint onGetSize() override { 51 return SkIPoint::Make(fW, fH); 52 } 53 54 void onPreDraw(SkCanvas* canvas) override { 55 SkPoint points[2] = { 56 SkPoint::Make( 0.0f, fH/2.0f), 57 SkPoint::Make(fW+2.0f, fH/2.0f), 58 }; 59 60 SkColor colors[4] = { 61 SK_ColorRED, 62 SK_ColorGREEN, 63 SK_ColorBLUE, 64 SK_ColorYELLOW, 65 }; 66 67 SkScalar pos_001[3] = { 68 0.0f, 69 0.0f, 70 1.0f, 71 }; 72 73 SkScalar pos_011[3] = { 74 0.0f, 75 1.0f, 76 1.0f, 77 }; 78 79 SkScalar pos_centered[4] = { 80 0.0f, 81 0.5f, 82 0.5f, 83 1.0f, 84 }; 85 86 SkScalar* positions = fKind == Kind::k001 ? pos_001 : 87 fKind == Kind::k011 ? pos_011 : 88 pos_centered; 89 90 int count = fKind == Kind::kCentered ? 4 : 3; 91 92 fPaint.setShader(SkGradientShader::MakeLinear(points, 93 colors, 94 positions, 95 count, 96 SkShader::kClamp_TileMode, 97 0, 98 nullptr)); 99 } 100 101 void onDraw(int loops, SkCanvas* canvas) override { 102 for (int i = 0; i < loops; i++) { 103 canvas->drawPaint(fPaint); 104 } 105 } 106 107 private: 108 SkString fName; 109 int fW; 110 int fH; 111 Kind fKind; 112 SkPaint fPaint; 113 }; 114 115 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k001);); 116 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k001);); 117 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k001);); 118 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k001);); 119 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k001);); 120 121 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k011);); 122 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k011);); 123 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k011);); 124 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k011);); 125 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k011);); 126 127 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::kCentered);); 128 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::kCentered);); 129 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::kCentered);); 130 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::kCentered);); 131 DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::kCentered);); 132