blob: 7a1b5998d8ddf2965dfe9c4a8504980964e41448 [file] [log] [blame]
sugoi@google.com5d71adf2013-04-24 19:36:44 +00001/*
2 * Copyright 2013 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#include "SkBenchmark.h"
8#include "SkBitmapSource.h"
9#include "SkCanvas.h"
10#include "SkDevice.h"
11#include "SkLightingImageFilter.h"
12
13#define FILTER_WIDTH_SMALL SkIntToScalar(32)
14#define FILTER_HEIGHT_SMALL SkIntToScalar(32)
15#define FILTER_WIDTH_LARGE SkIntToScalar(256)
16#define FILTER_HEIGHT_LARGE SkIntToScalar(256)
17
18class LightingBaseBench : public SkBenchmark {
19public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000020 LightingBaseBench(bool small) : fIsSmall(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +000021
22protected:
23 void draw(SkCanvas* canvas, SkImageFilter* imageFilter) const {
24 SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
25 SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
26 SkPaint paint;
27 paint.setImageFilter(imageFilter)->unref();
mtklein@google.comc2897432013-09-10 19:23:38 +000028 for (int i = 0; i < this->getLoops(); i++) {
29 canvas->drawRect(r, paint);
30 }
sugoi@google.com5d71adf2013-04-24 19:36:44 +000031 }
32
33 static SkPoint3 getPointLocation() {
34 static SkPoint3 pointLocation(0, 0, SkIntToScalar(10));
35 return pointLocation;
36 }
37
38 static SkPoint3 getDistantDirection() {
39 static SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
40 static SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));
41 static SkPoint3 distantDirection(SkScalarMul(SkScalarCos(azimuthRad),
42 SkScalarCos(elevationRad)),
43 SkScalarMul(SkScalarSin(azimuthRad),
44 SkScalarCos(elevationRad)),
45 SkScalarSin(elevationRad));
46 return distantDirection;
47 }
48
49 static SkPoint3 getSpotLocation() {
50 static SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToScalar(20));
51 return spotLocation;
52 }
53
54 static SkPoint3 getSpotTarget() {
55 static SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0);
56 return spotTarget;
57 }
58
59 static SkScalar getSpotExponent() {
60 static SkScalar spotExponent = SK_Scalar1;
61 return spotExponent;
62 }
63
64 static SkScalar getCutoffAngle() {
65 static SkScalar cutoffAngle = SkIntToScalar(15);
66 return cutoffAngle;
67 }
68
69 static SkScalar getKd() {
70 static SkScalar kd = SkIntToScalar(2);
71 return kd;
72 }
73
74 static SkScalar getKs() {
75 static SkScalar ks = SkIntToScalar(1);
76 return ks;
77 }
78
79 static SkScalar getShininess() {
80 static SkScalar shininess = SkIntToScalar(8);
81 return shininess;
82 }
83
84 static SkScalar getSurfaceScale() {
85 static SkScalar surfaceScale = SkIntToScalar(1);
86 return surfaceScale;
87 }
88
89 static SkColor getWhite() {
90 static SkColor white(0xFFFFFFFF);
91 return white;
92 }
93
94 bool fIsSmall;
95 typedef SkBenchmark INHERITED;
96};
97
98class LightingPointLitDiffuseBench : public LightingBaseBench {
99public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000100 LightingPointLitDiffuseBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000101 }
102
103protected:
104 virtual const char* onGetName() SK_OVERRIDE {
105 return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdiffuse_large";
106 }
107
108 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
109 draw(canvas, SkLightingImageFilter::CreatePointLitDiffuse(getPointLocation(), getWhite(),
110 getSurfaceScale(), getKd()));
111 }
112
113private:
114 typedef LightingBaseBench INHERITED;
115};
116
117class LightingDistantLitDiffuseBench : public LightingBaseBench {
118public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000119 LightingDistantLitDiffuseBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000120 }
121
122protected:
123 virtual const char* onGetName() SK_OVERRIDE {
124 return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantlitdiffuse_large";
125 }
126
127 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
128 draw(canvas, SkLightingImageFilter::CreateDistantLitDiffuse(getDistantDirection(),
129 getWhite(), getSurfaceScale(), getKd()));
130 }
131
132private:
133 typedef LightingBaseBench INHERITED;
134};
135
136class LightingSpotLitDiffuseBench : public LightingBaseBench {
137public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000138 LightingSpotLitDiffuseBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000139 }
140
141protected:
142 virtual const char* onGetName() SK_OVERRIDE {
143 return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffuse_large";
144 }
145
146 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
147 draw(canvas, SkLightingImageFilter::CreateSpotLitDiffuse(getSpotLocation(),
148 getSpotTarget(), getSpotExponent(), getCutoffAngle(), getWhite(), getSurfaceScale(),
149 getKd()));
150 }
151
152private:
153 typedef LightingBaseBench INHERITED;
154};
155
156class LightingPointLitSpecularBench : public LightingBaseBench {
157public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000158 LightingPointLitSpecularBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000159 }
160
161protected:
162 virtual const char* onGetName() SK_OVERRIDE {
163 return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitspecular_large";
164 }
165
166 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
167 draw(canvas, SkLightingImageFilter::CreatePointLitSpecular(getPointLocation(), getWhite(),
168 getSurfaceScale(), getKs(), getShininess()));
169 }
170
171private:
172 typedef LightingBaseBench INHERITED;
173};
174
175class LightingDistantLitSpecularBench : public LightingBaseBench {
176public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000177 LightingDistantLitSpecularBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000178 }
179
180protected:
181 virtual const char* onGetName() SK_OVERRIDE {
182 return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantlitspecular_large";
183 }
184
185 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
186 draw(canvas, SkLightingImageFilter::CreateDistantLitSpecular(getDistantDirection(),
187 getWhite(), getSurfaceScale(), getKs(), getShininess()));
188 }
189
190private:
191 typedef LightingBaseBench INHERITED;
192};
193
194class LightingSpotLitSpecularBench : public LightingBaseBench {
195public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000196 LightingSpotLitSpecularBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000197 }
198
199protected:
200 virtual const char* onGetName() SK_OVERRIDE {
201 return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspecular_large";
202 }
203
204 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
205 draw(canvas, SkLightingImageFilter::CreateSpotLitSpecular(getSpotLocation(),
206 getSpotTarget(), getSpotExponent(), getCutoffAngle(), getWhite(), getSurfaceScale(),
207 getKs(), getShininess()));
208 }
209
210private:
211 typedef LightingBaseBench INHERITED;
212};
213
214///////////////////////////////////////////////////////////////////////////////
215
mtklein@google.com410e6e82013-09-13 19:52:27 +0000216DEF_BENCH( return new LightingPointLitDiffuseBench(true); )
217DEF_BENCH( return new LightingPointLitDiffuseBench(false); )
218DEF_BENCH( return new LightingDistantLitDiffuseBench(true); )
219DEF_BENCH( return new LightingDistantLitDiffuseBench(false); )
220DEF_BENCH( return new LightingSpotLitDiffuseBench(true); )
221DEF_BENCH( return new LightingSpotLitDiffuseBench(false); )
222DEF_BENCH( return new LightingPointLitSpecularBench(true); )
223DEF_BENCH( return new LightingPointLitSpecularBench(false); )
224DEF_BENCH( return new LightingDistantLitSpecularBench(true); )
225DEF_BENCH( return new LightingDistantLitSpecularBench(false); )
226DEF_BENCH( return new LightingSpotLitSpecularBench(true); )
227DEF_BENCH( return new LightingSpotLitSpecularBench(false); )