blob: e38022e9bd74dcb4fc84b520b9e47d759292c7c3 [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
Mike Reedfae8fce2019-04-03 10:27:45 -040017static const char* get_tilemode_name(SkTileMode tilemode) {
fmenozzi17e82972016-07-28 10:59:49 -070018 switch (tilemode) {
Mike Reedfae8fce2019-04-03 10:27:45 -040019 case SkTileMode::kClamp:
fmenozzi17e82972016-07-28 10:59:49 -070020 return "clamp";
Mike Reedfae8fce2019-04-03 10:27:45 -040021 case SkTileMode::kRepeat:
fmenozzi17e82972016-07-28 10:59:49 -070022 return "repeat";
Mike Reedfae8fce2019-04-03 10:27:45 -040023 case SkTileMode::kMirror:
fmenozzi17e82972016-07-28 10:59:49 -070024 return "mirror";
Mike Reedfae8fce2019-04-03 10:27:45 -040025 case SkTileMode::kDecal:
26 return "decal";
fmenozzi17e82972016-07-28 10:59:49 -070027 }
Mike Reedfae8fce2019-04-03 10:27:45 -040028 return "";
fmenozzi17e82972016-07-28 10:59:49 -070029}
30
31class HardStopGradientBench_ScaleNumColors : public Benchmark {
32public:
Mike Reedfae8fce2019-04-03 10:27:45 -040033 HardStopGradientBench_ScaleNumColors(SkTileMode tilemode, int count) {
fmenozzi17e82972016-07-28 10:59:49 -070034 fName.printf("hardstop_scale_num_colors_%s_%03d_colors", get_tilemode_name(tilemode), count);
35
36 fTileMode = tilemode;
37 fColorCount = count;
38 }
39
40 const char* onGetName() override {
41 return fName.c_str();
42 }
43
44 SkIPoint onGetSize() override {
45 return SkIPoint::Make(kSize, kSize);
46 }
47
48 /*
49 * Set up a linear gradient from left to right with
50 * fColorCount colors alternating between four
51 * different colors. The positions are evenly spaced,
52 * with the exception of the first two; these create a
53 * hard stop in order to trigger the hard stop code.
54 */
55 void onPreDraw(SkCanvas* canvas) override {
56 // Left to right
57 SkPoint points[2] = {
Ben Wagner63fd7602017-10-09 15:45:33 -040058 SkPoint::Make(0, kSize/2),
fmenozzi17e82972016-07-28 10:59:49 -070059 SkPoint::Make(kSize-1, kSize/2),
60 };
61
62 constexpr int kNumColorChoices = 4;
63 SkColor color_choices[kNumColorChoices] = {
64 SK_ColorRED,
65 SK_ColorGREEN,
66 SK_ColorBLUE,
67 SK_ColorYELLOW,
68 };
69
70 // Alternate between different choices
71 SkColor colors[100];
72 for (int i = 0; i < fColorCount; i++) {
73 colors[i] = color_choices[i % kNumColorChoices];
74 }
75
76 // Create a hard stop
77 SkScalar positions[100];
78 positions[0] = 0.0f;
79 positions[1] = 0.0f;
80 for (int i = 2; i < fColorCount; i++) {
81 // Evenly spaced afterwards
82 positions[i] = i / (fColorCount - 1.0f);
83 }
84
85 fPaint.setShader(SkGradientShader::MakeLinear(points,
86 colors,
87 positions,
88 fColorCount,
89 fTileMode,
90 0,
91 nullptr));
92 }
93
94 /*
95 * Draw simple linear gradient from left to right
96 */
97 void onDraw(int loops, SkCanvas* canvas) override {
98 for (int i = 0; i < loops; i++) {
99 canvas->drawPaint(fPaint);
100 }
101 }
102
103private:
104 static const int kSize = 500;
105
Mike Reedfae8fce2019-04-03 10:27:45 -0400106 SkTileMode fTileMode;
107 SkString fName;
108 int fColorCount;
109 SkPaint fPaint;
fmenozzi17e82972016-07-28 10:59:49 -0700110
111 typedef Benchmark INHERITED;
112};
113
114// Clamp
Mike Reedfae8fce2019-04-03 10:27:45 -0400115DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 3);)
116DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 4);)
117DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 5);)
118DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 10);)
119DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 25);)
120DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 50);)
121DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kClamp, 100);)
fmenozzi17e82972016-07-28 10:59:49 -0700122
123// Repeat
Mike Reedfae8fce2019-04-03 10:27:45 -0400124DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 3);)
125DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 4);)
126DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 5);)
127DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 10);)
128DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 25);)
129DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 50);)
130DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kRepeat, 100);)
fmenozzi17e82972016-07-28 10:59:49 -0700131
132// Mirror
Mike Reedfae8fce2019-04-03 10:27:45 -0400133DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 3);)
134DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 4);)
135DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 5);)
136DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 10);)
137DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 25);)
138DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 50);)
139DEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkTileMode::kMirror, 100);)