aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-06-26 14:33:13 +0000
committerGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-06-26 14:33:13 +0000
commit0833777df1f05adafd9b70c666a72d80defa4f6b (patch)
tree19bbf33e67b34075d89ea9f76a4e2a335eac760b
parent31868471126d2bc972ae2e61b8b39c6c3c70d16f (diff)
Cleanup flattening code to properly serialize lighting image filters.
Review URL: https://codereview.appspot.com/6333070 git-svn-id: http://skia.googlecode.com/svn/trunk@4340 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--include/effects/SkLightingImageFilter.h2
-rw-r--r--src/effects/SkLightingImageFilter.cpp117
-rw-r--r--src/ports/SkGlobalInitialization_default.cpp2
3 files changed, 66 insertions, 55 deletions
diff --git a/include/effects/SkLightingImageFilter.h b/include/effects/SkLightingImageFilter.h
index f8a5ccf4af..03dbff1972 100644
--- a/include/effects/SkLightingImageFilter.h
+++ b/include/effects/SkLightingImageFilter.h
@@ -65,7 +65,7 @@ public:
SkScalar shininess);
~SkLightingImageFilter();
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingImageFilter)
+ SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
protected:
SkLightingImageFilter(SkLight* light, const SkColor& lightColor,
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index c2551d138a..84cb2910b3 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -278,32 +278,41 @@ public:
};
virtual LightType type() const = 0;
- static SkLight* Create(SkFlattenableReadBuffer& buffer);
+protected:
+ SkLight() {}
+ SkLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
- buffer.write32(type());
+ INHERITED::flatten(buffer);
}
+
+private:
+ typedef SkFlattenable INHERITED;
};
class SkDistantLight : public SkLight {
public:
SkDistantLight(const SkPoint3& direction) : fDirection(direction) {
}
- SkDistantLight(SkFlattenableReadBuffer& buffer) {
- fDirection = readPoint3(buffer);
- }
+
SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
return fDirection;
};
SkScalar lightColorScale(const SkPoint3&) const { return SK_Scalar1; }
virtual LightType type() const { return kDistant_LightType; }
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
- SkLight::flatten(buffer);
- writePoint3(fDirection, buffer);
- }
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDistantLight)
+protected:
+ SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
+ fDirection = readPoint3(buffer);
+ }
+ virtual void flatten(SkFlattenableWriteBuffer& buffer) const {
+ INHERITED::flatten(buffer);
+ writePoint3(fDirection, buffer);
+ }
+
private:
+ typedef SkLight INHERITED;
SkPoint3 fDirection;
};
@@ -311,9 +320,7 @@ class SkPointLight : public SkLight {
public:
SkPointLight(const SkPoint3& location)
: fLocation(location) {}
- SkPointLight(SkFlattenableReadBuffer& buffer) {
- fLocation = readPoint3(buffer);
- }
+
SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
SkPoint3 direction(fLocation.fX - SkIntToScalar(x),
fLocation.fY - SkIntToScalar(y),
@@ -323,14 +330,20 @@ public:
};
SkScalar lightColorScale(const SkPoint3&) const { return SK_Scalar1; }
virtual LightType type() const { return kPoint_LightType; }
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
- SkLight::flatten(buffer);
- writePoint3(fLocation, buffer);
- }
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPointLight)
+protected:
+ SkPointLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
+ fLocation = readPoint3(buffer);
+ }
+ virtual void flatten(SkFlattenableWriteBuffer& buffer) const {
+ INHERITED::flatten(buffer);
+ writePoint3(fLocation, buffer);
+ }
+
private:
+ typedef SkLight INHERITED;
SkPoint3 fLocation;
};
@@ -348,25 +361,7 @@ public:
fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold;
fConeScale = SkScalarInvert(antiAliasThreshold);
}
- SkSpotLight(SkFlattenableReadBuffer& buffer) {
- fLocation = readPoint3(buffer);
- fTarget = readPoint3(buffer);
- fSpecularExponent = buffer.readScalar();
- fCosOuterConeAngle = buffer.readScalar();
- fCosInnerConeAngle = buffer.readScalar();
- fConeScale = buffer.readScalar();
- fS = readPoint3(buffer);
- }
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
- SkLight::flatten(buffer);
- writePoint3(fLocation, buffer);
- writePoint3(fTarget, buffer);
- buffer.writeScalar(fSpecularExponent);
- buffer.writeScalar(fCosOuterConeAngle);
- buffer.writeScalar(fCosInnerConeAngle);
- buffer.writeScalar(fConeScale);
- writePoint3(fS, buffer);
- }
+
SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
SkPoint3 direction(fLocation.fX - SkIntToScalar(x),
fLocation.fY - SkIntToScalar(y),
@@ -387,10 +382,33 @@ public:
return scale;
}
+ virtual LightType type() const { return kSpot_LightType; }
+
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpotLight)
- virtual LightType type() const { return kSpot_LightType; }
+protected:
+ SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
+ fLocation = readPoint3(buffer);
+ fTarget = readPoint3(buffer);
+ fSpecularExponent = buffer.readScalar();
+ fCosOuterConeAngle = buffer.readScalar();
+ fCosInnerConeAngle = buffer.readScalar();
+ fConeScale = buffer.readScalar();
+ fS = readPoint3(buffer);
+ }
+ virtual void flatten(SkFlattenableWriteBuffer& buffer) const {
+ INHERITED::flatten(buffer);
+ writePoint3(fLocation, buffer);
+ writePoint3(fTarget, buffer);
+ buffer.writeScalar(fSpecularExponent);
+ buffer.writeScalar(fCosOuterConeAngle);
+ buffer.writeScalar(fCosInnerConeAngle);
+ buffer.writeScalar(fConeScale);
+ writePoint3(fS, buffer);
+ }
+
private:
+ typedef SkLight INHERITED;
SkPoint3 fLocation;
SkPoint3 fTarget;
SkScalar fSpecularExponent;
@@ -400,21 +418,6 @@ private:
SkPoint3 fS;
};
-SkLight* SkLight::Create(SkFlattenableReadBuffer& buffer) {
- LightType type = static_cast<LightType>(buffer.readU32());
- switch (type) {
- case kDistant_LightType:
- return new SkDistantLight(buffer);
- case kPoint_LightType:
- return new SkPointLight(buffer);
- case kSpot_LightType:
- return new SkSpotLight(buffer);
- default:
- SkASSERT(false);
- return 0;
- }
-}
-
SkLightingImageFilter::SkLightingImageFilter(SkLight* light, const SkColor& lightColor, SkScalar surfaceScale)
: fLight(light),
fLightColor(SkIntToScalar(SkColorGetR(lightColor)),
@@ -481,14 +484,14 @@ SkLightingImageFilter::~SkLightingImageFilter() {
SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer)
: INHERITED(buffer)
{
- fLight = SkLight::Create(buffer);
+ fLight = (SkLight*)buffer.readFlattenable();
fLightColor = readPoint3(buffer);
fSurfaceScale = buffer.readScalar();
}
void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
this->INHERITED::flatten(buffer);
- fLight->flatten(buffer);
+ buffer.writeFlattenable(fLight);
writePoint3(fLightColor, buffer);
buffer.writeScalar(fSurfaceScale);
}
@@ -596,4 +599,10 @@ bool SkSpecularLightingImageFilter::onFilterImage(Proxy*,
return true;
}
-SK_DEFINE_FLATTENABLE_REGISTRAR(SkLightingImageFilter)
+SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight)
+SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp
index 6635cecb68..259ec440a7 100644
--- a/src/ports/SkGlobalInitialization_default.cpp
+++ b/src/ports/SkGlobalInitialization_default.cpp
@@ -38,6 +38,7 @@
#include "SkGroupShape.h"
#include "SkLayerDrawLooper.h"
#include "SkLayerRasterizer.h"
+#include "SkLightingImageFilter.h"
#include "SkMorphologyImageFilter.h"
#include "SkPathEffect.h"
#include "SkPixelXorXfermode.h"
@@ -86,6 +87,7 @@ void SkFlattenable::InitializeFlattenables() {
SkBlurMaskFilter::InitializeFlattenables();
SkColorFilter::InitializeFlattenables();
SkGradientShader::InitializeFlattenables();
+ SkLightingImageFilter::InitializeFlattenables();
SkTableColorFilter::InitializeFlattenables();
SkXfermode::InitializeFlattenables();
}