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