blob: ce6c11989d697a329b5dca9a992fc6f249dabff1 [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 */
tfarinaf168b862014-06-19 12:32:29 -07007#include "Benchmark.h"
sugoi@google.com5d71adf2013-04-24 19:36:44 +00008#include "SkBitmapSource.h"
9#include "SkCanvas.h"
10#include "SkDevice.h"
11#include "SkLightingImageFilter.h"
robertphillips3d32d762015-07-13 13:16:44 -070012#include "SkPoint3.h"
sugoi@google.com5d71adf2013-04-24 19:36:44 +000013
14#define FILTER_WIDTH_SMALL SkIntToScalar(32)
15#define FILTER_HEIGHT_SMALL SkIntToScalar(32)
16#define FILTER_WIDTH_LARGE SkIntToScalar(256)
17#define FILTER_HEIGHT_LARGE SkIntToScalar(256)
18
tfarinaf168b862014-06-19 12:32:29 -070019class LightingBaseBench : public Benchmark {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000020public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000021 LightingBaseBench(bool small) : fIsSmall(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +000022
23protected:
commit-bot@chromium.org33614712013-12-03 18:17:16 +000024 void draw(const int loops, SkCanvas* canvas, SkImageFilter* imageFilter) const {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000025 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();
commit-bot@chromium.org33614712013-12-03 18:17:16 +000029 for (int i = 0; i < loops; i++) {
mtklein@google.comc2897432013-09-10 19:23:38 +000030 canvas->drawRect(r, paint);
31 }
sugoi@google.com5d71adf2013-04-24 19:36:44 +000032 }
33
robertphillips3d32d762015-07-13 13:16:44 -070034 static SkPoint3 GetPointLocation() {
35 static SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10));
sugoi@google.com5d71adf2013-04-24 19:36:44 +000036 return pointLocation;
37 }
38
robertphillips3d32d762015-07-13 13:16:44 -070039 static SkPoint3 GetDistantDirection() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000040 static SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
41 static SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));
robertphillips3d32d762015-07-13 13:16:44 -070042 static SkPoint3 distantDirection = SkPoint3::Make(SkScalarMul(SkScalarCos(azimuthRad),
43 SkScalarCos(elevationRad)),
44 SkScalarMul(SkScalarSin(azimuthRad),
45 SkScalarCos(elevationRad)),
46 SkScalarSin(elevationRad));
sugoi@google.com5d71adf2013-04-24 19:36:44 +000047 return distantDirection;
48 }
49
robertphillips3d32d762015-07-13 13:16:44 -070050 static SkPoint3 GetSpotLocation() {
51 static SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10),
52 SkIntToScalar(-10),
53 SkIntToScalar(20));
sugoi@google.com5d71adf2013-04-24 19:36:44 +000054 return spotLocation;
55 }
56
robertphillips3d32d762015-07-13 13:16:44 -070057 static SkPoint3 GetSpotTarget() {
58 static SkPoint3 spotTarget = SkPoint3::Make(SkIntToScalar(40), SkIntToScalar(40), 0);
sugoi@google.com5d71adf2013-04-24 19:36:44 +000059 return spotTarget;
60 }
61
robertphillips3d32d762015-07-13 13:16:44 -070062 static SkScalar GetSpotExponent() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000063 static SkScalar spotExponent = SK_Scalar1;
64 return spotExponent;
65 }
66
robertphillips3d32d762015-07-13 13:16:44 -070067 static SkScalar GetCutoffAngle() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000068 static SkScalar cutoffAngle = SkIntToScalar(15);
69 return cutoffAngle;
70 }
71
robertphillips3d32d762015-07-13 13:16:44 -070072 static SkScalar GetKd() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000073 static SkScalar kd = SkIntToScalar(2);
74 return kd;
75 }
76
robertphillips3d32d762015-07-13 13:16:44 -070077 static SkScalar GetKs() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000078 static SkScalar ks = SkIntToScalar(1);
79 return ks;
80 }
81
robertphillips3d32d762015-07-13 13:16:44 -070082 static SkScalar GetShininess() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000083 static SkScalar shininess = SkIntToScalar(8);
84 return shininess;
85 }
86
robertphillips3d32d762015-07-13 13:16:44 -070087 static SkScalar GetSurfaceScale() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000088 static SkScalar surfaceScale = SkIntToScalar(1);
89 return surfaceScale;
90 }
91
robertphillips3d32d762015-07-13 13:16:44 -070092 static SkColor GetWhite() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000093 static SkColor white(0xFFFFFFFF);
94 return white;
95 }
96
97 bool fIsSmall;
tfarinaf168b862014-06-19 12:32:29 -070098 typedef Benchmark INHERITED;
sugoi@google.com5d71adf2013-04-24 19:36:44 +000099};
100
101class LightingPointLitDiffuseBench : public LightingBaseBench {
102public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000103 LightingPointLitDiffuseBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000104 }
105
106protected:
mtklein36352bf2015-03-25 18:17:31 -0700107 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000108 return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdiffuse_large";
109 }
110
mtklein36352bf2015-03-25 18:17:31 -0700111 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips3d32d762015-07-13 13:16:44 -0700112 draw(loops, canvas, SkLightingImageFilter::CreatePointLitDiffuse(GetPointLocation(),
113 GetWhite(),
114 GetSurfaceScale(),
115 GetKd()));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000116 }
117
118private:
119 typedef LightingBaseBench INHERITED;
120};
121
122class LightingDistantLitDiffuseBench : public LightingBaseBench {
123public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000124 LightingDistantLitDiffuseBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000125 }
126
127protected:
mtklein36352bf2015-03-25 18:17:31 -0700128 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000129 return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantlitdiffuse_large";
130 }
131
mtklein36352bf2015-03-25 18:17:31 -0700132 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips3d32d762015-07-13 13:16:44 -0700133 draw(loops, canvas, SkLightingImageFilter::CreateDistantLitDiffuse(GetDistantDirection(),
134 GetWhite(),
135 GetSurfaceScale(),
136 GetKd()));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000137 }
138
139private:
140 typedef LightingBaseBench INHERITED;
141};
142
143class LightingSpotLitDiffuseBench : public LightingBaseBench {
144public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000145 LightingSpotLitDiffuseBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000146 }
147
148protected:
mtklein36352bf2015-03-25 18:17:31 -0700149 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000150 return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffuse_large";
151 }
152
mtklein36352bf2015-03-25 18:17:31 -0700153 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips3d32d762015-07-13 13:16:44 -0700154 draw(loops, canvas, SkLightingImageFilter::CreateSpotLitDiffuse(GetSpotLocation(),
155 GetSpotTarget(),
156 GetSpotExponent(),
157 GetCutoffAngle(),
158 GetWhite(),
159 GetSurfaceScale(),
160 GetKd()));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000161 }
162
163private:
164 typedef LightingBaseBench INHERITED;
165};
166
167class LightingPointLitSpecularBench : public LightingBaseBench {
168public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000169 LightingPointLitSpecularBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000170 }
171
172protected:
mtklein36352bf2015-03-25 18:17:31 -0700173 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000174 return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitspecular_large";
175 }
176
mtklein36352bf2015-03-25 18:17:31 -0700177 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips3d32d762015-07-13 13:16:44 -0700178 draw(loops, canvas, SkLightingImageFilter::CreatePointLitSpecular(GetPointLocation(),
179 GetWhite(),
180 GetSurfaceScale(),
181 GetKs(),
182 GetShininess()));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000183 }
184
185private:
186 typedef LightingBaseBench INHERITED;
187};
188
189class LightingDistantLitSpecularBench : public LightingBaseBench {
190public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000191 LightingDistantLitSpecularBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000192 }
193
194protected:
mtklein36352bf2015-03-25 18:17:31 -0700195 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000196 return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantlitspecular_large";
197 }
198
mtklein36352bf2015-03-25 18:17:31 -0700199 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips3d32d762015-07-13 13:16:44 -0700200 draw(loops, canvas, SkLightingImageFilter::CreateDistantLitSpecular(GetDistantDirection(),
201 GetWhite(),
202 GetSurfaceScale(),
203 GetKs(),
204 GetShininess()));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000205 }
206
207private:
208 typedef LightingBaseBench INHERITED;
209};
210
211class LightingSpotLitSpecularBench : public LightingBaseBench {
212public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000213 LightingSpotLitSpecularBench(bool small) : INHERITED(small) {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000214 }
215
216protected:
mtklein36352bf2015-03-25 18:17:31 -0700217 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000218 return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspecular_large";
219 }
220
mtklein36352bf2015-03-25 18:17:31 -0700221 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips3d32d762015-07-13 13:16:44 -0700222 draw(loops, canvas, SkLightingImageFilter::CreateSpotLitSpecular(GetSpotLocation(),
223 GetSpotTarget(),
224 GetSpotExponent(),
225 GetCutoffAngle(),
226 GetWhite(),
227 GetSurfaceScale(),
228 GetKs(),
229 GetShininess()));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000230 }
231
232private:
233 typedef LightingBaseBench INHERITED;
234};
235
236///////////////////////////////////////////////////////////////////////////////
237
mtklein@google.com410e6e82013-09-13 19:52:27 +0000238DEF_BENCH( return new LightingPointLitDiffuseBench(true); )
239DEF_BENCH( return new LightingPointLitDiffuseBench(false); )
240DEF_BENCH( return new LightingDistantLitDiffuseBench(true); )
241DEF_BENCH( return new LightingDistantLitDiffuseBench(false); )
242DEF_BENCH( return new LightingSpotLitDiffuseBench(true); )
243DEF_BENCH( return new LightingSpotLitDiffuseBench(false); )
244DEF_BENCH( return new LightingPointLitSpecularBench(true); )
245DEF_BENCH( return new LightingPointLitSpecularBench(false); )
246DEF_BENCH( return new LightingDistantLitSpecularBench(true); )
247DEF_BENCH( return new LightingDistantLitSpecularBench(false); )
248DEF_BENCH( return new LightingSpotLitSpecularBench(true); )
249DEF_BENCH( return new LightingSpotLitSpecularBench(false); )