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