blob: 66180c5d98bcbb5e7cc2385ae1f3a5c0fd6a9cea [file] [log] [blame]
fmenozzi17e82972016-07-28 10:59:49 -07001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
fmenozzi17e82972016-07-28 10:59:49 -07009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
12#include "include/core/SkPaint.h"
13#include "include/core/SkShader.h"
14#include "include/core/SkString.h"
15#include "include/effects/SkGradientShader.h"
fmenozzi17e82972016-07-28 10:59:49 -070016
Michael Ludwig23003182019-08-05 11:25:23 -040017#include "tools/ToolUtils.h"
fmenozzi17e82972016-07-28 10:59:49 -070018
19class HardStopGradientBench_ScaleNumColors : public Benchmark {
20public:
Mike Reedfae8fce2019-04-03 10:27:45 -040021 HardStopGradientBench_ScaleNumColors(SkTileMode tilemode, int count) {
Michael Ludwig23003182019-08-05 11:25:23 -040022 fName.printf("hardstop_scale_num_colors_%s_%03d_colors",
23 ToolUtils::tilemode_name(tilemode), count);
fmenozzi17e82972016-07-28 10:59:49 -070024
25 fTileMode = tilemode;
26 fColorCount = count;
27 }
28
29 const char* onGetName() override {
30 return fName.c_str();
31 }
32
33 SkIPoint onGetSize() override {
34 return SkIPoint::Make(kSize, kSize);
35 }
36
37 /*
38 * Set up a linear gradient from left to right with
39 * fColorCount colors alternating between four
40 * different colors. The positions are evenly spaced,
41 * with the exception of the first two; these create a
42 * hard stop in order to trigger the hard stop code.
43 */
44 void onPreDraw(SkCanvas* canvas) override {
45 // Left to right
46 SkPoint points[2] = {
Ben Wagner63fd7602017-10-09 15:45:33 -040047 SkPoint::Make(0, kSize/2),
fmenozzi17e82972016-07-28 10:59:49 -070048 SkPoint::Make(kSize-1, kSize/2),
49 };
50
51 constexpr int kNumColorChoices = 4;
52 SkColor color_choices[kNumColorChoices] = {
53 SK_ColorRED,
54 SK_ColorGREEN,
55 SK_ColorBLUE,
56 SK_ColorYELLOW,
57 };
58
59 // Alternate between different choices
60 SkColor colors[100];
61 for (int i = 0; i < fColorCount; i++) {
62 colors[i] = color_choices[i % kNumColorChoices];
63 }
64
65 // Create a hard stop
66 SkScalar positions[100];
67 positions[0] = 0.0f;
68 positions[1] = 0.0f;
69 for (int i = 2; i < fColorCount; i++) {
70 // Evenly spaced afterwards
71 positions[i] = i / (fColorCount - 1.0f);
72 }
73
74 fPaint.setShader(SkGradientShader::MakeLinear(points,
75 colors,
76 positions,
77 fColorCount,
78 fTileMode,
79 0,
80 nullptr));
81 }
82
83 /*
84 * Draw simple linear gradient from left to right
85 */
86 void onDraw(int loops, SkCanvas* canvas) override {
87 for (int i = 0; i < loops; i++) {
88 canvas->drawPaint(fPaint);
89 }
90 }
91
92private:
93 static const int kSize = 500;
94
Mike Reedfae8fce2019-04-03 10:27:45 -040095 SkTileMode fTileMode;
96 SkString fName;
97 int fColorCount;
98 SkPaint fPaint;
fmenozzi17e82972016-07-28 10:59:49 -070099
John Stiles7571f9e2020-09-02 22:42:33 -0400100 using INHERITED = Benchmark;
fmenozzi17e82972016-07-28 10:59:49 -0700101};
102
103// Clamp
Mike Reedfae8fce2019-04-03 10:27:45 -0400104DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 3);)
105DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 4);)
106DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 5);)
107DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 10);)
108DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 25);)
109DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 50);)
110DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 100);)
fmenozzi17e82972016-07-28 10:59:49 -0700111
112// Repeat
Mike Reedfae8fce2019-04-03 10:27:45 -0400113DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 3);)
114DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 4);)
115DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 5);)
116DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 10);)
117DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 25);)
118DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 50);)
119DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 100);)
fmenozzi17e82972016-07-28 10:59:49 -0700120
121// Mirror
Mike Reedfae8fce2019-04-03 10:27:45 -0400122DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 3);)
123DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 4);)
124DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 5);)
125DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 10);)
126DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 25);)
127DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 50);)
128DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 100);)