| Index: src/effects/SkLightingImageFilter.cpp
|
| diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
|
| index ca52b981e53bde666af997597ae00c0b3a4164dd..9c1dbf1b232ee67e260a99a8f97a1506f80351a6 100644
|
| --- a/src/effects/SkLightingImageFilter.cpp
|
| +++ b/src/effects/SkLightingImageFilter.cpp
|
| @@ -249,6 +249,9 @@ SkPoint3 readPoint3(SkFlattenableReadBuffer& buffer) {
|
| point.fX = buffer.readScalar();
|
| point.fY = buffer.readScalar();
|
| point.fZ = buffer.readScalar();
|
| + buffer.validate(SkScalarIsFinite(point.fX) &&
|
| + SkScalarIsFinite(point.fY) &&
|
| + SkScalarIsFinite(point.fZ));
|
| return point;
|
| };
|
|
|
| @@ -259,6 +262,8 @@ void writePoint3(const SkPoint3& point, SkFlattenableWriteBuffer& buffer) {
|
| };
|
|
|
| class SkDiffuseLightingImageFilter : public SkLightingImageFilter {
|
| + typedef SkLightingImageFilter INHERITED;
|
| +
|
| public:
|
| SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale,
|
| SkScalar kd, SkImageFilter* input, const SkIRect* cropRect);
|
| @@ -277,11 +282,12 @@ protected:
|
|
|
|
|
| private:
|
| - typedef SkLightingImageFilter INHERITED;
|
| SkScalar fKD;
|
| };
|
|
|
| class SkSpecularLightingImageFilter : public SkLightingImageFilter {
|
| + typedef SkLightingImageFilter INHERITED;
|
| +
|
| public:
|
| SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const SkIRect* cropRect);
|
| SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageFilter)
|
| @@ -300,7 +306,6 @@ protected:
|
| SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
|
|
|
| private:
|
| - typedef SkLightingImageFilter INHERITED;
|
| SkScalar fKS;
|
| SkScalar fShininess;
|
| };
|
| @@ -509,6 +514,8 @@ class GrGLLight;
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkLight : public SkFlattenable {
|
| + typedef SkFlattenable INHERITED;
|
| +
|
| public:
|
| SK_DECLARE_INST_COUNT(SkLight)
|
|
|
| @@ -527,6 +534,8 @@ public:
|
| virtual bool requiresFragmentPosition() const = 0;
|
| virtual SkLight* transform(const SkMatrix& matrix) const = 0;
|
|
|
| + SK_DEFINE_FLATTENABLE_TYPE(SkLight)
|
| +
|
| protected:
|
| SkLight(SkColor color)
|
| : fColor(SkIntToScalar(SkColorGetR(color)),
|
| @@ -544,7 +553,6 @@ protected:
|
| }
|
|
|
| private:
|
| - typedef SkFlattenable INHERITED;
|
| SkPoint3 fColor;
|
| };
|
|
|
| @@ -553,6 +561,8 @@ SK_DEFINE_INST_COUNT(SkLight)
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkDistantLight : public SkLight {
|
| + typedef SkLight INHERITED;
|
| +
|
| public:
|
| SkDistantLight(const SkPoint3& direction, SkColor color)
|
| : INHERITED(color), fDirection(direction) {
|
| @@ -602,13 +612,14 @@ protected:
|
| }
|
|
|
| private:
|
| - typedef SkLight INHERITED;
|
| SkPoint3 fDirection;
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkPointLight : public SkLight {
|
| + typedef SkLight INHERITED;
|
| +
|
| public:
|
| SkPointLight(const SkPoint3& location, SkColor color)
|
| : INHERITED(color), fLocation(location) {}
|
| @@ -661,13 +672,14 @@ protected:
|
| }
|
|
|
| private:
|
| - typedef SkLight INHERITED;
|
| SkPoint3 fLocation;
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class SkSpotLight : public SkLight {
|
| + typedef SkLight INHERITED;
|
| +
|
| public:
|
| SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle, SkColor color)
|
| : INHERITED(color),
|
| @@ -741,6 +753,10 @@ protected:
|
| fCosInnerConeAngle = buffer.readScalar();
|
| fConeScale = buffer.readScalar();
|
| fS = readPoint3(buffer);
|
| + buffer.validate(SkScalarIsFinite(fSpecularExponent) &&
|
| + SkScalarIsFinite(fCosOuterConeAngle) &&
|
| + SkScalarIsFinite(fCosInnerConeAngle) &&
|
| + SkScalarIsFinite(fConeScale));
|
| }
|
| SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specularExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar coneScale, const SkPoint3& s, const SkPoint3& color)
|
| : INHERITED(color),
|
| @@ -781,7 +797,6 @@ private:
|
| static const SkScalar kSpecularExponentMin;
|
| static const SkScalar kSpecularExponentMax;
|
|
|
| - typedef SkLight INHERITED;
|
| SkPoint3 fLocation;
|
| SkPoint3 fTarget;
|
| SkScalar fSpecularExponent;
|
| @@ -861,6 +876,42 @@ SkImageFilter* SkLightingImageFilter::CreateSpotLitSpecular(
|
| surfaceScale, ks, shininess, input, cropRect));
|
| }
|
|
|
| +SkFlattenable::Factory SkLightingImageFilter::GetFactory(SkFlattenable::Type type) {
|
| + switch(type) {
|
| + case SkFlattenable::kSkDiffuseLightingImageFilter:
|
| + return SkDiffuseLightingImageFilter::CreateProc;
|
| + case SkFlattenable::kSkDistantLight:
|
| + return SkDistantLight::CreateProc;
|
| + case SkFlattenable::kSkPointLight:
|
| + return SkPointLight::CreateProc;
|
| + case SkFlattenable::kSkSpecularLightingImageFilter:
|
| + return SkSpecularLightingImageFilter::CreateProc;
|
| + case SkFlattenable::kSkSpotLight:
|
| + return SkSpotLight::CreateProc;
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +SkFlattenable::TypeCheck SkLightingImageFilter::GetTypeCheck(SkFlattenable::Type type) {
|
| + switch(type) {
|
| + case SkFlattenable::kSkDiffuseLightingImageFilter:
|
| + return SkDiffuseLightingImageFilter::IsA;
|
| + case SkFlattenable::kSkDistantLight:
|
| + return SkDistantLight::IsA;
|
| + case SkFlattenable::kSkPointLight:
|
| + return SkPointLight::IsA;
|
| + case SkFlattenable::kSkSpecularLightingImageFilter:
|
| + return SkSpecularLightingImageFilter::IsA;
|
| + case SkFlattenable::kSkSpotLight:
|
| + return SkSpotLight::IsA;
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| SkLightingImageFilter::~SkLightingImageFilter() {
|
| fLight->unref();
|
| }
|
| @@ -870,6 +921,7 @@ SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer)
|
| {
|
| fLight = buffer.readFlattenableT<SkLight>();
|
| fSurfaceScale = buffer.readScalar();
|
| + buffer.validate(SkScalarIsFinite(fSurfaceScale));
|
| }
|
|
|
| void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
|
| @@ -890,6 +942,7 @@ SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
|
| : INHERITED(buffer)
|
| {
|
| fKD = buffer.readScalar();
|
| + buffer.validate(SkScalarIsFinite(fKD));
|
| }
|
|
|
| void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
|
| @@ -967,6 +1020,8 @@ SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
|
| {
|
| fKS = buffer.readScalar();
|
| fShininess = buffer.readScalar();
|
| + buffer.validate(SkScalarIsFinite(fKS) &&
|
| + SkScalarIsFinite(fShininess));
|
| }
|
|
|
| void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
|
|
|