1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Benchmark.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColor.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const char* get_tilemode_name(SkShader::TileMode tilemode) {
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    switch (tilemode) {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case SkShader::kClamp_TileMode:
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return "clamp";
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case SkShader::kRepeat_TileMode:
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return "repeat";
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case SkShader::kMirror_TileMode:
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return "mirror";
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        default:
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkDEBUGFAIL("Unknown tilemode");
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return "error";
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass HardStopGradientBench_ScaleNumColors : public Benchmark {
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    HardStopGradientBench_ScaleNumColors(SkShader::TileMode tilemode, int count) {
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("hardstop_scale_num_colors_%s_%03d_colors", get_tilemode_name(tilemode), count);
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fTileMode   = tilemode;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fColorCount = count;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkIPoint onGetSize() override {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkIPoint::Make(kSize, kSize);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Set up a linear gradient from left to right with
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * fColorCount colors alternating between four
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * different colors. The positions are evenly spaced,
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * with the exception of the first two; these create a
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * hard stop in order to trigger the hard stop code.
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onPreDraw(SkCanvas* canvas) override {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Left to right
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint points[2] = {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPoint::Make(0,        kSize/2),
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPoint::Make(kSize-1,  kSize/2),
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr int kNumColorChoices = 4;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor color_choices[kNumColorChoices] = {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorRED,
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorGREEN,
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorBLUE,
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorYELLOW,
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Alternate between different choices
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor  colors[100];
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < fColorCount; i++) {
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            colors[i] = color_choices[i % kNumColorChoices];
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Create a hard stop
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar positions[100];
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        positions[0] = 0.0f;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        positions[1] = 0.0f;
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 2; i < fColorCount; i++) {
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Evenly spaced afterwards
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            positions[i] = i / (fColorCount - 1.0f);
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaint.setShader(SkGradientShader::MakeLinear(points,
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      colors,
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      positions,
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      fColorCount,
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      fTileMode,
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      0,
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                      nullptr));
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Draw simple linear gradient from left to right
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; i++) {
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPaint(fPaint);
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const int kSize = 500;
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkShader::TileMode  fTileMode;
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString            fName;
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int                 fColorCount;
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint             fPaint;
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Clamp
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,   3);)
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,   4);)
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,   5);)
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,  10);)
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,  25);)
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,  50);)
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 100);)
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Repeat
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,   3);)
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,   4);)
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,   5);)
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,  10);)
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,  25);)
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,  50);)
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 100);)
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Mirror
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,   3);)
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,   4);)
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,   5);)
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,  10);)
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,  25);)
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,  50);)
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 100);)
140