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 { |