Chromium Code Reviews| Index: src/effects/SkLightingImageFilter.cpp |
| diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp |
| index c28b317e225c41bfcd04a338b3b59c789b1831db..7ca22c1a5a2f7769ea7a017c5b0602dfc73a5ea6 100644 |
| --- a/src/effects/SkLightingImageFilter.cpp |
| +++ b/src/effects/SkLightingImageFilter.cpp |
| @@ -507,7 +507,7 @@ class GrGLLight; |
| /////////////////////////////////////////////////////////////////////////////// |
| -class SkLight : public SkFlattenable { |
| +class SkLight : public SkRefCnt { |
| public: |
| SK_DECLARE_INST_COUNT(SkLight) |
| @@ -526,6 +526,10 @@ public: |
| virtual bool requiresFragmentPosition() const = 0; |
| virtual SkLight* transform(const SkMatrix& matrix) const = 0; |
| + // Defined below SkLight's subclasses. |
| + void flattenLight(SkFlattenableWriteBuffer& buffer) const; |
| + static SkLight* unflattenLight(SkFlattenableReadBuffer& buffer); |
|
reed1
2013/10/14 13:08:51
statics are Capitalized
mtklein
2013/10/14 15:50:54
Done.
|
| + |
| protected: |
| SkLight(SkColor color) |
| : fColor(SkIntToScalar(SkColorGetR(color)), |
| @@ -533,17 +537,15 @@ protected: |
| SkIntToScalar(SkColorGetB(color))) {} |
| SkLight(const SkPoint3& color) |
| : fColor(color) {} |
| - SkLight(SkFlattenableReadBuffer& buffer) |
| - : INHERITED(buffer) { |
| + SkLight(SkFlattenableReadBuffer& buffer) { |
| fColor = readPoint3(buffer); |
| } |
| - virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
| - INHERITED::flatten(buffer); |
| - writePoint3(fColor, buffer); |
| - } |
| + |
| + virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const = 0; |
| + |
| private: |
| - typedef SkFlattenable INHERITED; |
| + typedef SkRefCnt INHERITED; |
| SkPoint3 fColor; |
| }; |
| @@ -583,20 +585,18 @@ public: |
| fDirection == o.fDirection; |
| } |
| - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDistantLight) |
| + SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
| + fDirection = readPoint3(buffer); |
| + } |
| protected: |
| SkDistantLight(const SkPoint3& direction, const SkPoint3& color) |
| : INHERITED(color), fDirection(direction) { |
| } |
| - SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
| - fDirection = readPoint3(buffer); |
| - } |
| virtual SkLight* transform(const SkMatrix& matrix) const { |
| return new SkDistantLight(direction(), color()); |
| } |
| - virtual void flatten(SkFlattenableWriteBuffer& buffer) const { |
| - INHERITED::flatten(buffer); |
| + virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
| writePoint3(fDirection, buffer); |
| } |
| @@ -646,16 +646,14 @@ public: |
| return new SkPointLight(location, color()); |
| } |
| - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPointLight) |
| - |
| -protected: |
| SkPointLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
| fLocation = readPoint3(buffer); |
| } |
| + |
| +protected: |
| SkPointLight(const SkPoint3& location, const SkPoint3& color) |
| : INHERITED(color), fLocation(location) {} |
| - virtual void flatten(SkFlattenableWriteBuffer& buffer) const { |
| - INHERITED::flatten(buffer); |
| + virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
| writePoint3(fLocation, buffer); |
| } |
| @@ -729,9 +727,6 @@ public: |
| SkScalar coneScale() const { return fConeScale; } |
| const SkPoint3& s() const { return fS; } |
| - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpotLight) |
| - |
| -protected: |
| SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
| fLocation = readPoint3(buffer); |
| fTarget = readPoint3(buffer); |
| @@ -741,6 +736,7 @@ protected: |
| fConeScale = buffer.readScalar(); |
| fS = readPoint3(buffer); |
| } |
| +protected: |
| SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specularExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar coneScale, const SkPoint3& s, const SkPoint3& color) |
| : INHERITED(color), |
| fLocation(location), |
| @@ -752,8 +748,7 @@ protected: |
| fS(s) |
| { |
| } |
| - virtual void flatten(SkFlattenableWriteBuffer& buffer) const { |
| - INHERITED::flatten(buffer); |
| + virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
| writePoint3(fLocation, buffer); |
| writePoint3(fTarget, buffer); |
| buffer.writeScalar(fSpecularExponent); |
| @@ -797,6 +792,29 @@ const SkScalar SkSpotLight::kSpecularExponentMax = SkFloatToScalar(128.0f); |
| /////////////////////////////////////////////////////////////////////////////// |
| +void SkLight::flattenLight(SkFlattenableWriteBuffer& buffer) const { |
| + // Write type first, then baseclass, then subclass. |
| + buffer.writeInt(this->type()); |
| + writePoint3(fColor, buffer); |
| + this->onFlattenLight(buffer); |
| +} |
| + |
| +/*static*/ SkLight* SkLight::unflattenLight(SkFlattenableReadBuffer& buffer) { |
| + // Read type first. |
| + const SkLight::LightType type = (SkLight::LightType)buffer.readInt(); |
| + switch (type) { |
| + // Each of these constructors must first call SkLight's, so we'll read the baseclass |
| + // then subclass, same order as flattenLight. |
| + case SkLight::kDistant_LightType: return SkNEW_ARGS(SkDistantLight, (buffer)); |
| + case SkLight::kPoint_LightType: return SkNEW_ARGS(SkPointLight, (buffer)); |
| + case SkLight::kSpot_LightType: return SkNEW_ARGS(SkSpotLight, (buffer)); |
| + default: |
| + SkDEBUGFAIL("Unknown LightType."); |
| + return NULL; |
| + } |
| +} |
| +/////////////////////////////////////////////////////////////////////////////// |
| + |
| SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkImageFilter* input, const CropRect* cropRect) |
| : INHERITED(input, cropRect), |
| fLight(light), |
| @@ -865,15 +883,14 @@ SkLightingImageFilter::~SkLightingImageFilter() { |
| } |
| SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
| - : INHERITED(buffer) |
| -{ |
| - fLight = buffer.readFlattenableT<SkLight>(); |
| + : INHERITED(buffer) { |
| + fLight = SkLight::unflattenLight(buffer); |
| fSurfaceScale = buffer.readScalar(); |
| } |
| void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
| this->INHERITED::flatten(buffer); |
| - buffer.writeFlattenable(fLight); |
| + fLight->flattenLight(buffer); |
| buffer.writeScalar(fSurfaceScale); |
| } |
| @@ -1562,7 +1579,4 @@ void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder, |
| 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 |