• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
8 #include "Benchmark.h"
9 
10 #include "SkCanvas.h"
11 #include "SkShader.h"
12 #include "SkGradientShader.h"
13 #include "SkString.h"
14 #include "SkColor.h"
15 #include "SkPaint.h"
16 
17 class HardStopGradientBench_ScaleNumHardStops : public Benchmark {
18 public:
HardStopGradientBench_ScaleNumHardStops(int colorCount,int hardStopCount)19     HardStopGradientBench_ScaleNumHardStops(int colorCount, int hardStopCount) {
20         SkASSERT(hardStopCount <= colorCount/2);
21 
22         fName.printf("hardstop_scale_num_hard_stops_%03d_colors_%03d_hard_stops",
23                      colorCount, hardStopCount);
24 
25         fColorCount    = colorCount;
26         fHardStopCount = hardStopCount;
27     }
28 
onGetName()29     const char* onGetName() override {
30         return fName.c_str();
31     }
32 
onGetSize()33     SkIPoint onGetSize() override {
34         return SkIPoint::Make(kSize, kSize);
35     }
36 
onPreDraw(SkCanvas * canvas)37     void onPreDraw(SkCanvas* canvas) override {
38         // Left to right
39         SkPoint points[2] = {
40             SkPoint::Make(0,        kSize/2),
41             SkPoint::Make(kSize-1,  kSize/2),
42         };
43 
44         constexpr int kNumColorChoices = 4;
45         SkColor color_choices[kNumColorChoices] = {
46             SK_ColorRED,
47             SK_ColorGREEN,
48             SK_ColorBLUE,
49             SK_ColorYELLOW,
50         };
51 
52         // Alternate between different choices
53         SkAutoTArray<SkColor> colors(fColorCount);
54         for (int i = 0; i < fColorCount; i++) {
55             colors[i] = color_choices[i % kNumColorChoices];
56         }
57 
58         // Create requisite number of hard stops, and evenly
59         // space positions after that
60         SkAutoTArray<SkScalar> positions(fColorCount);
61         int k = 0;
62         for (int i = 0; i < fHardStopCount; i++) {
63             float val = k/2.0f;
64             positions[k++] = val / fColorCount;
65             positions[k++] = val / fColorCount;
66         }
67         for (int i = k; i < fColorCount; i++) {
68             positions[i] = i / (fColorCount - 1.0f);
69         }
70 
71         fPaint.setShader(SkGradientShader::MakeLinear(points,
72                                                       colors.get(),
73                                                       positions.get(),
74                                                       fColorCount,
75                                                       SkShader::kClamp_TileMode,
76                                                       0,
77                                                       nullptr));
78     }
79 
80     /*
81      * Draw simple linear gradient from left to right
82      */
onDraw(int loops,SkCanvas * canvas)83     void onDraw(int loops, SkCanvas* canvas) override {
84         for (int i = 0; i < loops; i++) {
85             canvas->drawPaint(fPaint);
86         }
87     }
88 
89 private:
90     static const int kSize = 500;
91 
92     SkString fName;
93     int      fColorCount;
94     int      fHardStopCount;
95     SkPaint  fPaint;
96 
97     typedef Benchmark INHERITED;
98 };
99 
100 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 1);)
101 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 2);)
102 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 5);)
103 
104 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20,  1);)
105 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20,  5);)
106 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 10);)
107 
108 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50,  1);)
109 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 10);)
110 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 25);)
111 
112 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100,  1);)
113 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 25);)
114 DEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 50);)
115