OLD | NEW |
---|---|
(Empty) | |
1 /* | |
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 | |
18 class LightingBaseBench : public SkBenchmark { | |
19 public: | |
20 LightingBaseBench(void* param, bool small) : INHERITED(param), fIsSmall(smal l) { | |
21 } | |
22 | |
23 protected: | |
24 SkRect getFilterRect() const { | |
25 return fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL ) : | |
26 SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE ); | |
27 } | |
28 | |
29 bool fIsSmall; | |
30 typedef SkBenchmark INHERITED; | |
31 }; | |
32 | |
33 class LightingPointLitDiffuseBench : public LightingBaseBench { | |
34 public: | |
35 LightingPointLitDiffuseBench(void* param, bool small) : INHERITED(param, sma ll) { | |
36 } | |
37 | |
38 protected: | |
39 virtual const char* onGetName() SK_OVERRIDE { | |
40 return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdif fuse_large"; | |
41 } | |
42 | |
43 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
44 SkRect r = getFilterRect(); | |
45 | |
46 SkPoint3 pointLocation(0, 0, SkIntToScalar(10)); | |
47 SkScalar kd = SkIntToScalar(2); | |
48 SkScalar surfaceScale = SkIntToScalar(1); | |
49 SkColor white(0xFFFFFFFF); | |
50 | |
51 SkPaint paint; | |
52 paint.setImageFilter(SkLightingImageFilter::CreatePointLitDiffuse( | |
53 pointLocation, white, surfaceScale, kd))->unref(); | |
54 canvas->drawRect(r, paint); | |
55 } | |
56 | |
57 private: | |
58 typedef LightingBaseBench INHERITED; | |
59 }; | |
60 | |
61 class LightingDistantLitDiffuseBench : public LightingBaseBench { | |
62 public: | |
63 LightingDistantLitDiffuseBench(void* param, bool small) : INHERITED(param, s mall) { | |
64 } | |
65 | |
66 protected: | |
67 virtual const char* onGetName() SK_OVERRIDE { | |
68 return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantli tdiffuse_large"; | |
69 } | |
70 | |
71 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
72 SkRect r = getFilterRect(); | |
73 | |
74 SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225)); | |
75 SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5)); | |
76 SkPoint3 distantDirection(SkScalarMul(SkScalarCos(azimuthRad), SkScalarC os(elevationRad)), | |
77 SkScalarMul(SkScalarSin(azimuthRad), SkScalarC os(elevationRad)), | |
78 SkScalarSin(elevationRad)); | |
79 SkScalar kd = SkIntToScalar(2); | |
80 SkScalar surfaceScale = SkIntToScalar(1); | |
81 SkColor white(0xFFFFFFFF); | |
82 | |
83 SkPaint paint; | |
84 paint.setImageFilter(SkLightingImageFilter::CreateDistantLitDiffuse( | |
85 distantDirection, white, surfaceScale, kd))->unref(); | |
86 canvas->drawRect(r, paint); | |
87 } | |
88 | |
89 private: | |
90 typedef LightingBaseBench INHERITED; | |
91 }; | |
92 | |
93 class LightingSpotLitDiffuseBench : public LightingBaseBench { | |
94 public: | |
95 LightingSpotLitDiffuseBench(void* param, bool small) : INHERITED(param, smal l) { | |
96 } | |
97 | |
98 protected: | |
99 virtual const char* onGetName() SK_OVERRIDE { | |
100 return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffu se_large"; | |
101 } | |
102 | |
103 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
104 SkRect r = getFilterRect(); | |
105 | |
106 SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToSca lar(20)); | |
107 SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0); | |
108 SkScalar spotExponent = SK_Scalar1; | |
109 SkScalar cutoffAngle = SkIntToScalar(15); | |
110 SkScalar kd = SkIntToScalar(2); | |
111 SkScalar surfaceScale = SkIntToScalar(1); | |
112 SkColor white(0xFFFFFFFF); | |
113 | |
114 SkPaint paint; | |
115 paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLoc ation, | |
116 spotTarget, spotExponent, cutoffAngle, white, surfaceScale, kd))->un ref(); | |
117 canvas->drawRect(r, paint); | |
118 } | |
119 | |
120 private: | |
121 typedef LightingBaseBench INHERITED; | |
122 }; | |
123 | |
124 class LightingPointLitSpecularBench : public LightingBaseBench { | |
125 public: | |
126 LightingPointLitSpecularBench(void* param, bool small) : INHERITED(param, sm all) { | |
127 } | |
128 | |
129 protected: | |
130 virtual const char* onGetName() SK_OVERRIDE { | |
131 return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitsp ecular_large"; | |
132 } | |
133 | |
134 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
135 SkRect r = getFilterRect(); | |
136 | |
137 SkPoint3 pointLocation(0, 0, SkIntToScalar(10)); | |
138 SkScalar ks = SkIntToScalar(1); | |
139 SkScalar shininess = SkIntToScalar(8); | |
140 SkScalar surfaceScale = SkIntToScalar(1); | |
141 SkColor white(0xFFFFFFFF); | |
142 | |
143 SkPaint paint; | |
144 paint.setImageFilter(SkLightingImageFilter::CreatePointLitSpecular( | |
145 pointLocation, white, surfaceScale, ks, shininess))->unref(); | |
146 canvas->drawRect(r, paint); | |
147 } | |
148 | |
149 private: | |
150 typedef LightingBaseBench INHERITED; | |
151 }; | |
152 | |
153 class LightingDistantLitSpecularBench : public LightingBaseBench { | |
154 public: | |
155 LightingDistantLitSpecularBench(void* param, bool small) : INHERITED(param, small) { | |
156 } | |
157 | |
158 protected: | |
159 virtual const char* onGetName() SK_OVERRIDE { | |
160 return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantl itspecular_large"; | |
161 } | |
162 | |
163 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
164 SkRect r = getFilterRect(); | |
165 | |
166 SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225)); | |
Stephen White
2013/04/24 17:35:56
Nit: looks like there are lots of opportunities f
sugoi1
2013/04/24 18:49:10
Done. I made some base class functionality to redu
| |
167 SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5)); | |
168 SkPoint3 distantDirection(SkScalarMul(SkScalarCos(azimuthRad), SkScalarC os(elevationRad)), | |
169 SkScalarMul(SkScalarSin(azimuthRad), SkScalarC os(elevationRad)), | |
170 SkScalarSin(elevationRad)); | |
171 SkScalar ks = SkIntToScalar(1); | |
172 SkScalar shininess = SkIntToScalar(8); | |
173 SkScalar surfaceScale = SkIntToScalar(1); | |
174 SkColor white(0xFFFFFFFF); | |
175 | |
176 SkPaint paint; | |
177 paint.setImageFilter(SkLightingImageFilter::CreateDistantLitSpecular( | |
178 distantDirection, white, surfaceScale, ks, shininess))->unref(); | |
179 canvas->drawRect(r, paint); | |
180 } | |
181 | |
182 private: | |
183 typedef LightingBaseBench INHERITED; | |
184 }; | |
185 | |
186 class LightingSpotLitSpecularBench : public LightingBaseBench { | |
187 public: | |
188 LightingSpotLitSpecularBench(void* param, bool small) : INHERITED(param, sma ll) { | |
189 } | |
190 | |
191 protected: | |
192 virtual const char* onGetName() SK_OVERRIDE { | |
193 return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspec ular_large"; | |
194 } | |
195 | |
196 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
197 SkRect r = getFilterRect(); | |
198 | |
199 SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToSca lar(20)); | |
200 SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0); | |
201 SkScalar spotExponent = SK_Scalar1; | |
202 SkScalar cutoffAngle = SkIntToScalar(15); | |
203 SkScalar ks = SkIntToScalar(1); | |
204 SkScalar shininess = SkIntToScalar(8); | |
205 SkScalar surfaceScale = SkIntToScalar(1); | |
206 SkColor white(0xFFFFFFFF); | |
207 | |
208 SkPaint paint; | |
209 paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLo cation, | |
210 spotTarget, spotExponent, cutoffAngle, white, surfaceScale, ks, shin iness))->unref(); | |
211 canvas->drawRect(r, paint); | |
212 } | |
213 | |
214 private: | |
215 typedef LightingBaseBench INHERITED; | |
216 }; | |
217 | |
218 /////////////////////////////////////////////////////////////////////////////// | |
219 | |
220 DEF_BENCH( return new LightingPointLitDiffuseBench(p, true); ) | |
221 DEF_BENCH( return new LightingPointLitDiffuseBench(p, false); ) | |
222 DEF_BENCH( return new LightingDistantLitDiffuseBench(p, true); ) | |
223 DEF_BENCH( return new LightingDistantLitDiffuseBench(p, false); ) | |
224 DEF_BENCH( return new LightingSpotLitDiffuseBench(p, true); ) | |
225 DEF_BENCH( return new LightingSpotLitDiffuseBench(p, false); ) | |
226 DEF_BENCH( return new LightingPointLitSpecularBench(p, true); ) | |
227 DEF_BENCH( return new LightingPointLitSpecularBench(p, false); ) | |
228 DEF_BENCH( return new LightingDistantLitSpecularBench(p, true); ) | |
229 DEF_BENCH( return new LightingDistantLitSpecularBench(p, false); ) | |
230 DEF_BENCH( return new LightingSpotLitSpecularBench(p, true); ) | |
231 DEF_BENCH( return new LightingSpotLitSpecularBench(p, false); ) | |
232 | |
OLD | NEW |