LightingBench.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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 "bench/Benchmark.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkPoint3.h"
  10. #include "include/effects/SkLightingImageFilter.h"
  11. #define FILTER_WIDTH_SMALL SkIntToScalar(32)
  12. #define FILTER_HEIGHT_SMALL SkIntToScalar(32)
  13. #define FILTER_WIDTH_LARGE SkIntToScalar(256)
  14. #define FILTER_HEIGHT_LARGE SkIntToScalar(256)
  15. class LightingBaseBench : public Benchmark {
  16. public:
  17. LightingBaseBench(bool small) : fIsSmall(small) { }
  18. protected:
  19. void draw(int loops, SkCanvas* canvas, sk_sp<SkImageFilter> imageFilter) const {
  20. SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
  21. SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
  22. SkPaint paint;
  23. paint.setImageFilter(std::move(imageFilter));
  24. for (int i = 0; i < loops; i++) {
  25. canvas->drawRect(r, paint);
  26. }
  27. }
  28. static SkPoint3 GetPointLocation() {
  29. static SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10));
  30. return pointLocation;
  31. }
  32. static SkPoint3 GetDistantDirection() {
  33. static SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
  34. static SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));
  35. static SkPoint3 distantDirection = SkPoint3::Make(
  36. SkScalarCos(azimuthRad) * SkScalarCos(elevationRad),
  37. SkScalarSin(azimuthRad) * SkScalarCos(elevationRad),
  38. SkScalarSin(elevationRad));
  39. return distantDirection;
  40. }
  41. static SkPoint3 GetSpotLocation() {
  42. static SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10),
  43. SkIntToScalar(-10),
  44. SkIntToScalar(20));
  45. return spotLocation;
  46. }
  47. static SkPoint3 GetSpotTarget() {
  48. static SkPoint3 spotTarget = SkPoint3::Make(SkIntToScalar(40), SkIntToScalar(40), 0);
  49. return spotTarget;
  50. }
  51. static SkScalar GetSpotExponent() {
  52. static SkScalar spotExponent = SK_Scalar1;
  53. return spotExponent;
  54. }
  55. static SkScalar GetCutoffAngle() {
  56. static SkScalar cutoffAngle = SkIntToScalar(15);
  57. return cutoffAngle;
  58. }
  59. static SkScalar GetKd() {
  60. static SkScalar kd = SkIntToScalar(2);
  61. return kd;
  62. }
  63. static SkScalar GetKs() {
  64. static SkScalar ks = SkIntToScalar(1);
  65. return ks;
  66. }
  67. static SkScalar GetShininess() {
  68. static SkScalar shininess = SkIntToScalar(8);
  69. return shininess;
  70. }
  71. static SkScalar GetSurfaceScale() {
  72. static SkScalar surfaceScale = SkIntToScalar(1);
  73. return surfaceScale;
  74. }
  75. static SkColor GetWhite() {
  76. static SkColor white(0xFFFFFFFF);
  77. return white;
  78. }
  79. bool fIsSmall;
  80. typedef Benchmark INHERITED;
  81. };
  82. class LightingPointLitDiffuseBench : public LightingBaseBench {
  83. public:
  84. LightingPointLitDiffuseBench(bool small) : INHERITED(small) { }
  85. protected:
  86. const char* onGetName() override {
  87. return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdiffuse_large";
  88. }
  89. void onDraw(int loops, SkCanvas* canvas) override {
  90. draw(loops, canvas, SkLightingImageFilter::MakePointLitDiffuse(GetPointLocation(),
  91. GetWhite(),
  92. GetSurfaceScale(),
  93. GetKd(),
  94. nullptr));
  95. }
  96. private:
  97. typedef LightingBaseBench INHERITED;
  98. };
  99. class LightingDistantLitDiffuseBench : public LightingBaseBench {
  100. public:
  101. LightingDistantLitDiffuseBench(bool small) : INHERITED(small) { }
  102. protected:
  103. const char* onGetName() override {
  104. return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantlitdiffuse_large";
  105. }
  106. void onDraw(int loops, SkCanvas* canvas) override {
  107. draw(loops, canvas, SkLightingImageFilter::MakeDistantLitDiffuse(GetDistantDirection(),
  108. GetWhite(),
  109. GetSurfaceScale(),
  110. GetKd(),
  111. nullptr));
  112. }
  113. private:
  114. typedef LightingBaseBench INHERITED;
  115. };
  116. class LightingSpotLitDiffuseBench : public LightingBaseBench {
  117. public:
  118. LightingSpotLitDiffuseBench(bool small) : INHERITED(small) { }
  119. protected:
  120. const char* onGetName() override {
  121. return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffuse_large";
  122. }
  123. void onDraw(int loops, SkCanvas* canvas) override {
  124. draw(loops, canvas, SkLightingImageFilter::MakeSpotLitDiffuse(GetSpotLocation(),
  125. GetSpotTarget(),
  126. GetSpotExponent(),
  127. GetCutoffAngle(),
  128. GetWhite(),
  129. GetSurfaceScale(),
  130. GetKd(),
  131. nullptr));
  132. }
  133. private:
  134. typedef LightingBaseBench INHERITED;
  135. };
  136. class LightingPointLitSpecularBench : public LightingBaseBench {
  137. public:
  138. LightingPointLitSpecularBench(bool small) : INHERITED(small) { }
  139. protected:
  140. const char* onGetName() override {
  141. return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitspecular_large";
  142. }
  143. void onDraw(int loops, SkCanvas* canvas) override {
  144. draw(loops, canvas, SkLightingImageFilter::MakePointLitSpecular(GetPointLocation(),
  145. GetWhite(),
  146. GetSurfaceScale(),
  147. GetKs(),
  148. GetShininess(),
  149. nullptr));
  150. }
  151. private:
  152. typedef LightingBaseBench INHERITED;
  153. };
  154. class LightingDistantLitSpecularBench : public LightingBaseBench {
  155. public:
  156. LightingDistantLitSpecularBench(bool small) : INHERITED(small) { }
  157. protected:
  158. const char* onGetName() override {
  159. return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantlitspecular_large";
  160. }
  161. void onDraw(int loops, SkCanvas* canvas) override {
  162. draw(loops, canvas, SkLightingImageFilter::MakeDistantLitSpecular(GetDistantDirection(),
  163. GetWhite(),
  164. GetSurfaceScale(),
  165. GetKs(),
  166. GetShininess(),
  167. nullptr));
  168. }
  169. private:
  170. typedef LightingBaseBench INHERITED;
  171. };
  172. class LightingSpotLitSpecularBench : public LightingBaseBench {
  173. public:
  174. LightingSpotLitSpecularBench(bool small) : INHERITED(small) { }
  175. protected:
  176. const char* onGetName() override {
  177. return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspecular_large";
  178. }
  179. void onDraw(int loops, SkCanvas* canvas) override {
  180. draw(loops, canvas, SkLightingImageFilter::MakeSpotLitSpecular(GetSpotLocation(),
  181. GetSpotTarget(),
  182. GetSpotExponent(),
  183. GetCutoffAngle(),
  184. GetWhite(),
  185. GetSurfaceScale(),
  186. GetKs(),
  187. GetShininess(),
  188. nullptr));
  189. }
  190. private:
  191. typedef LightingBaseBench INHERITED;
  192. };
  193. ///////////////////////////////////////////////////////////////////////////////
  194. DEF_BENCH( return new LightingPointLitDiffuseBench(true); )
  195. DEF_BENCH( return new LightingPointLitDiffuseBench(false); )
  196. DEF_BENCH( return new LightingDistantLitDiffuseBench(true); )
  197. DEF_BENCH( return new LightingDistantLitDiffuseBench(false); )
  198. DEF_BENCH( return new LightingSpotLitDiffuseBench(true); )
  199. DEF_BENCH( return new LightingSpotLitDiffuseBench(false); )
  200. DEF_BENCH( return new LightingPointLitSpecularBench(true); )
  201. DEF_BENCH( return new LightingPointLitSpecularBench(false); )
  202. DEF_BENCH( return new LightingDistantLitSpecularBench(true); )
  203. DEF_BENCH( return new LightingDistantLitSpecularBench(false); )
  204. DEF_BENCH( return new LightingSpotLitSpecularBench(true); )
  205. DEF_BENCH( return new LightingSpotLitSpecularBench(false); )