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 class HardStopGradientBench_ScaleNumHardStops : public Benchmark { 18 public: HardStopGradientBench_ScaleNumHardStops(int colorCount,int hardStopCount)19 HardStopGradientBench_ScaleNumHardStops(int colorCount, int hardStopCount) { 20 SkASSERT(hardStopCount <= colorCount/2); 21 22 fName.printf("hardstop_scale_num_hard_stops_%03d_colors_%03d_hard_stops", 23 colorCount, hardStopCount); 24 25 fColorCount = colorCount; 26 fHardStopCount = hardStopCount; 27 } 28 onGetName()29 const char* onGetName() override { 30 return fName.c_str(); 31 } 32 onGetSize()33 SkIPoint onGetSize() override { 34 return SkIPoint::Make(kSize, kSize); 35 } 36 onPreDraw(SkCanvas * canvas)37 void onPreDraw(SkCanvas* canvas) override { 38 // Left to right 39 SkPoint points[2] = { 40 SkPoint::Make(0, kSize/2), 41 SkPoint::Make(kSize-1, kSize/2), 42 }; 43 44 constexpr int kNumColorChoices = 4; 45 SkColor color_choices[kNumColorChoices] = { 46 SK_ColorRED, 47 SK_ColorGREEN, 48 SK_ColorBLUE, 49 SK_ColorYELLOW, 50 }; 51 52 // Alternate between different choices 53 SkAutoTArray<SkColor> colors(fColorCount); 54 for (int i = 0; i < fColorCount; i++) { 55 colors[i] = color_choices[i % kNumColorChoices]; 56 } 57 58 // Create requisite number of hard stops, and evenly 59 // space positions after that 60 SkAutoTArray<SkScalar> positions(fColorCount); 61 int k = 0; 62 for (int i = 0; i < fHardStopCount; i++) { 63 float val = k/2.0f; 64 positions[k++] = val / fColorCount; 65 positions[k++] = val / fColorCount; 66 } 67 for (int i = k; i < fColorCount; i++) { 68 positions[i] = i / (fColorCount - 1.0f); 69 } 70 71 fPaint.setShader(SkGradientShader::MakeLinear(points, 72 colors.get(), 73 positions.get(), 74 fColorCount, 75 SkShader::kClamp_TileMode, 76 0, 77 nullptr)); 78 } 79 80 /* 81 * Draw simple linear gradient from left to right 82 */ onDraw(int loops,SkCanvas * canvas)83 void onDraw(int loops, SkCanvas* canvas) override { 84 for (int i = 0; i < loops; i++) { 85 canvas->drawPaint(fPaint); 86 } 87 } 88 89 private: 90 static const int kSize = 500; 91 92 SkString fName; 93 int fColorCount; 94 int fHardStopCount; 95 SkPaint fPaint; 96 97 typedef Benchmark INHERITED; 98 }; 99 100 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 1);) 101 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 2);) 102 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 5);) 103 104 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 1);) 105 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 5);) 106 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 10);) 107 108 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 1);) 109 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 10);) 110 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 25);) 111 112 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 1);) 113 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 25);) 114 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 50);) 115