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 17enum class Kind { 18 k001, 19 k011, 20 kCentered, 21}; 22 23const 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 36class HardStopGradientBench_SpecialHardStops : public Benchmark { 37public: 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 107private: 108 SkString fName; 109 int fW; 110 int fH; 111 Kind fKind; 112 SkPaint fPaint; 113}; 114 115DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k001);); 116DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k001);); 117DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k001);); 118DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k001);); 119DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k001);); 120 121DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k011);); 122DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k011);); 123DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k011);); 124DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k011);); 125DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k011);); 126 127DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::kCentered);); 128DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::kCentered);); 129DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::kCentered);); 130DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::kCentered);); 131DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::kCentered);); 132