|  | /* | 
|  | * Copyright 2016 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "bench/Benchmark.h" | 
|  |  | 
|  | #include "include/core/SkCanvas.h" | 
|  | #include "include/core/SkColor.h" | 
|  | #include "include/core/SkPaint.h" | 
|  | #include "include/core/SkShader.h" | 
|  | #include "include/core/SkString.h" | 
|  | #include "include/effects/SkGradientShader.h" | 
|  |  | 
|  | enum class Kind { | 
|  | k001, | 
|  | k011, | 
|  | kCentered, | 
|  | }; | 
|  |  | 
|  | const char* kindstr(Kind k) { | 
|  | switch (k) { | 
|  | case Kind::k001: | 
|  | return "001"; | 
|  | case Kind::k011: | 
|  | return "011"; | 
|  | case Kind::kCentered: | 
|  | return "centered"; | 
|  | default: | 
|  | return "Invalid kind"; | 
|  | } | 
|  | } | 
|  |  | 
|  | class HardStopGradientBench_SpecialHardStops : public Benchmark { | 
|  | public: | 
|  | HardStopGradientBench_SpecialHardStops(int w, int h, Kind kind) { | 
|  | fW    = w; | 
|  | fH    = h; | 
|  | fKind = kind; | 
|  |  | 
|  | fName.printf("hardstop_special_%03dx%03d_%s", fW, fH, kindstr(fKind)); | 
|  | } | 
|  |  | 
|  | const char* onGetName() override { | 
|  | return fName.c_str(); | 
|  | } | 
|  |  | 
|  | SkISize onGetSize() override { | 
|  | return SkISize::Make(fW, fH); | 
|  | } | 
|  |  | 
|  | void onPreDraw(SkCanvas* canvas) override { | 
|  | SkPoint points[2] = { | 
|  | SkPoint::Make(   0.0f, fH/2.0f), | 
|  | SkPoint::Make(fW+2.0f, fH/2.0f), | 
|  | }; | 
|  |  | 
|  | SkColor colors[4] = { | 
|  | SK_ColorRED, | 
|  | SK_ColorGREEN, | 
|  | SK_ColorBLUE, | 
|  | SK_ColorYELLOW, | 
|  | }; | 
|  |  | 
|  | SkScalar pos_001[3] = { | 
|  | 0.0f, | 
|  | 0.0f, | 
|  | 1.0f, | 
|  | }; | 
|  |  | 
|  | SkScalar pos_011[3] = { | 
|  | 0.0f, | 
|  | 1.0f, | 
|  | 1.0f, | 
|  | }; | 
|  |  | 
|  | SkScalar pos_centered[4] = { | 
|  | 0.0f, | 
|  | 0.5f, | 
|  | 0.5f, | 
|  | 1.0f, | 
|  | }; | 
|  |  | 
|  | SkScalar* positions = fKind == Kind::k001 ? pos_001 : | 
|  | fKind == Kind::k011 ? pos_011 : | 
|  | pos_centered; | 
|  |  | 
|  | int count = fKind == Kind::kCentered ? 4 : 3; | 
|  |  | 
|  | fPaint.setShader(SkGradientShader::MakeLinear(points, | 
|  | colors, | 
|  | positions, | 
|  | count, | 
|  | SkTileMode::kClamp, | 
|  | 0, | 
|  | nullptr)); | 
|  | } | 
|  |  | 
|  | void onDraw(int loops, SkCanvas* canvas) override { | 
|  | for (int i = 0; i < loops; i++) { | 
|  | canvas->drawPaint(fPaint); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | SkString fName; | 
|  | int      fW; | 
|  | int      fH; | 
|  | Kind     fKind; | 
|  | SkPaint  fPaint; | 
|  | }; | 
|  |  | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k001);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k001);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k001);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k001);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k001);); | 
|  |  | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k011);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k011);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k011);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k011);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k011);); | 
|  |  | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::kCentered);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::kCentered);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::kCentered);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::kCentered);); | 
|  | DEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::kCentered);); |