Index: src/effects/SkLightingImageFilter.cpp |
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp |
index aac54625fee1a6197f125e4dee9f95eda7b0b704..ce31857093cd2f0d1f31c2e1f28e61d0a534c940 100644 |
--- a/src/effects/SkLightingImageFilter.cpp |
+++ b/src/effects/SkLightingImageFilter.cpp |
@@ -248,6 +248,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; |
}; |
@@ -526,6 +529,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)), |
@@ -740,6 +745,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), |
@@ -860,8 +869,44 @@ SkImageFilter* SkLightingImageFilter::CreateSpotLitSpecular( |
surfaceScale, ks, shininess, input, cropRect)); |
} |
+SkFlattenable::Factory SkLightingImageFilter::GetFactory(SkFlattenable::Type type) { |
+ switch(type) { |
+ case SkFlattenable::kSkDiffuseLightingImageFilter_Type: |
+ return SkDiffuseLightingImageFilter::CreateProc; |
+ case SkFlattenable::kSkDistantLight_Type: |
+ return SkDistantLight::CreateProc; |
+ case SkFlattenable::kSkPointLight_Type: |
+ return SkPointLight::CreateProc; |
+ case SkFlattenable::kSkSpecularLightingImageFilter_Type: |
+ return SkSpecularLightingImageFilter::CreateProc; |
+ case SkFlattenable::kSkSpotLight_Type: |
+ return SkSpotLight::CreateProc; |
+ default: |
+ break; |
+ } |
+ return NULL; |
+} |
+ |
+SkFlattenable::TypeCheck SkLightingImageFilter::GetTypeCheck(SkFlattenable::Type type) { |
+ switch(type) { |
+ case SkFlattenable::kSkDiffuseLightingImageFilter_Type: |
+ return SkDiffuseLightingImageFilter::IsA; |
+ case SkFlattenable::kSkDistantLight_Type: |
+ return SkDistantLight::IsA; |
+ case SkFlattenable::kSkPointLight_Type: |
+ return SkPointLight::IsA; |
+ case SkFlattenable::kSkSpecularLightingImageFilter_Type: |
+ return SkSpecularLightingImageFilter::IsA; |
+ case SkFlattenable::kSkSpotLight_Type: |
+ return SkSpotLight::IsA; |
+ default: |
+ break; |
+ } |
+ return NULL; |
+} |
+ |
SkLightingImageFilter::~SkLightingImageFilter() { |
- fLight->unref(); |
+ SkSafeUnref(fLight); |
} |
SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
@@ -869,6 +914,7 @@ SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
{ |
fLight = buffer.readFlattenableT<SkLight>(); |
fSurfaceScale = buffer.readScalar(); |
+ buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
} |
void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
@@ -889,6 +935,7 @@ SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff |
: INHERITED(buffer) |
{ |
fKD = buffer.readScalar(); |
+ buffer.validate(SkScalarIsFinite(fKD)); |
} |
void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
@@ -966,6 +1013,8 @@ SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu |
{ |
fKS = buffer.readScalar(); |
fShininess = buffer.readScalar(); |
+ buffer.validate(SkScalarIsFinite(fKS) && |
+ SkScalarIsFinite(fShininess)); |
} |
void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |