Index: src/core/SkLightingShader.h |
diff --git a/src/effects/SkLightingShader.h b/src/core/SkLightingShader.h |
similarity index 55% |
rename from src/effects/SkLightingShader.h |
rename to src/core/SkLightingShader.h |
index 64d41a291e7bd8d90d402e1b33954bd3cd78a1dc..499e358238090dbc4ce817b5154b21f0f7441076 100644 |
--- a/src/effects/SkLightingShader.h |
+++ b/src/core/SkLightingShader.h |
@@ -10,15 +10,57 @@ |
#ifndef SkLightingShader_DEFINED |
#define SkLightingShader_DEFINED |
-#include "SkPoint3.h" |
+#include "SkFlattenable.h" |
+#include "SkLight.h" |
#include "SkShader.h" |
+#include "SkTDArray.h" |
+ |
+class SkBitmap; |
+class SkMatrix; |
class SK_API SkLightingShader { |
public: |
- struct Light { |
- SkVector3 fDirection; // direction towards the light (+Z is out of the screen). |
- // If degenerate, it will be replaced with (0, 0, 1). |
- SkColor3f fColor; // linear (unpremul) color. Range is 0..1 in each channel. |
+ class Lights : public SkRefCnt { |
+ public: |
+ class Builder { |
+ public: |
+ Builder(const SkLight lights[], int numLights) |
+ : fLights(SkNEW_ARGS(Lights, (lights, numLights))) { |
+ } |
+ |
+ Builder() : fLights(SkNEW(Lights)) { } |
+ |
+ // TODO: limit the number of lights here or just ignore those |
+ // above some maximum? |
+ void add(const SkLight& light) { |
+ if (fLights) { |
+ *fLights->fLights.push() = light; |
+ } |
+ } |
+ |
+ const Lights* finish() { |
+ return fLights.detach(); |
+ } |
+ |
+ private: |
+ SkAutoTUnref<Lights> fLights; |
+ }; |
+ |
+ int numLights() const { |
+ return fLights.count(); |
+ } |
+ |
+ const SkLight& light(int index) const { |
+ return fLights[index]; |
+ } |
+ |
+ private: |
+ Lights() {} |
+ Lights(const SkLight lights[], int numLights) : fLights(lights, numLights) {} |
+ |
+ SkTDArray<SkLight> fLights; |
+ |
+ typedef SkRefCnt INHERITED; |
}; |
/** Returns a shader that lights the diffuse and normal maps with a single light. |
@@ -50,8 +92,8 @@ public: |
(127, 127, 0). |
*/ |
static SkShader* Create(const SkBitmap& diffuse, const SkBitmap& normal, |
- const SkLightingShader::Light& light, const SkColor3f& ambient, |
- const SkMatrix* localMatrix); |
+ const Lights* lights, const SkVector& invNormRotation, |
+ const SkMatrix* diffLocalMatrix, const SkMatrix* normLocalMatrix); |
SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() |
}; |