Index: src/effects/SkLightingImageFilter.cpp |
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp |
index ccb1dc5127357da4df535069bd3af6d8a1b2c247..363399466cdd951cb89d9114a66f64729c1b788b 100644 |
--- a/src/effects/SkLightingImageFilter.cpp |
+++ b/src/effects/SkLightingImageFilter.cpp |
@@ -64,9 +64,9 @@ public: |
colorScale = SkScalarClampMax(colorScale, SK_Scalar1); |
SkPoint3 color(lightColor * colorScale); |
return SkPackARGB32(255, |
- SkScalarFloorToInt(color.fX), |
- SkScalarFloorToInt(color.fY), |
- SkScalarFloorToInt(color.fZ)); |
+ SkClampMax(SkScalarFloorToInt(color.fX), 255), |
+ SkClampMax(SkScalarFloorToInt(color.fY), 255), |
+ SkClampMax(SkScalarFloorToInt(color.fZ), 255)); |
} |
private: |
SkScalar fKD; |
@@ -84,10 +84,10 @@ public: |
SkScalarPow(normal.dot(halfDir), fShininess)); |
colorScale = SkScalarClampMax(colorScale, SK_Scalar1); |
SkPoint3 color(lightColor * colorScale); |
- return SkPackARGB32(SkScalarFloorToInt(color.maxComponent()), |
- SkScalarFloorToInt(color.fX), |
- SkScalarFloorToInt(color.fY), |
- SkScalarFloorToInt(color.fZ)); |
+ return SkPackARGB32(SkClampMax(SkScalarFloorToInt(color.maxComponent()), 255), |
+ SkClampMax(SkScalarFloorToInt(color.fX), 255), |
+ SkClampMax(SkScalarFloorToInt(color.fY), 255), |
+ SkClampMax(SkScalarFloorToInt(color.fZ), 255)); |
} |
private: |
SkScalar fKS; |
@@ -660,7 +660,7 @@ public: |
: INHERITED(color), |
fLocation(location), |
fTarget(target), |
- fSpecularExponent(specularExponent) |
+ fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSpecularExponentMax)) |
{ |
fS = target - location; |
fS.normalize(); |
@@ -744,6 +744,9 @@ protected: |
} |
private: |
+ static const SkScalar kSpecularExponentMin; |
+ static const SkScalar kSpecularExponentMax; |
+ |
typedef SkLight INHERITED; |
SkPoint3 fLocation; |
SkPoint3 fTarget; |
@@ -754,6 +757,11 @@ private: |
SkPoint3 fS; |
}; |
+// According to the spec, the specular term should be in the range [1, 128] : |
+// http://www.w3.org/TR/SVG/filters.html#feSpecularLightingSpecularExponentAttribute |
+const SkScalar SkSpotLight::kSpecularExponentMin = SkFloatToScalar(1.0f); |
+const SkScalar SkSpotLight::kSpecularExponentMax = SkFloatToScalar(128.0f); |
+ |
/////////////////////////////////////////////////////////////////////////////// |
SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkImageFilter* input, const SkIRect* cropRect) |