Index: src/effects/SkLightingImageFilter.cpp |
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp |
index 31d36925550a5db488d9146046283fd9a600e6ab..4265f6e1e53c23137f5ca9db523169c44bde5c40 100644 |
--- a/src/effects/SkLightingImageFilter.cpp |
+++ b/src/effects/SkLightingImageFilter.cpp |
@@ -683,7 +683,7 @@ |
class SkImageFilterLight : public SkRefCnt { |
public: |
- |
+ |
enum LightType { |
kDistant_LightType, |
@@ -820,8 +820,8 @@ |
// Use X scale and Y scale on Z and average the result |
SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); |
matrix.mapVectors(&locationZ, 1); |
- SkPoint3 location = SkPoint3::Make(location2.fX, |
- location2.fY, |
+ SkPoint3 location = SkPoint3::Make(location2.fX, |
+ location2.fY, |
SkScalarAve(locationZ.fX, locationZ.fY)); |
return new SkPointLight(location, color()); |
} |
@@ -855,7 +855,7 @@ |
: INHERITED(color), |
fLocation(location), |
fTarget(target), |
- fSpecularExponent(specularExponent) |
+ fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSpecularExponentMax)) |
{ |
fS = target - location; |
fast_normalize(&fS); |
@@ -985,6 +985,9 @@ |
} |
private: |
+ static const SkScalar kSpecularExponentMin; |
+ static const SkScalar kSpecularExponentMax; |
+ |
SkPoint3 fLocation; |
SkPoint3 fTarget; |
SkScalar fSpecularExponent; |
@@ -995,6 +998,11 @@ |
typedef SkImageFilterLight INHERITED; |
}; |
+ |
+// 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 = 1.0f; |
+const SkScalar SkSpotLight::kSpecularExponentMax = 128.0f; |
/////////////////////////////////////////////////////////////////////////////// |
@@ -1988,7 +1996,7 @@ |
lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", |
color, cosOuter, coneScale); |
lightColorBody.appendf("\t}\n"); |
- lightColorBody.appendf("\treturn %s * scale;\n", color); |
+ lightColorBody.appendf("\treturn %s;\n", color); |
GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
fsBuilder->emitFunction(kVec3f_GrSLType, |
"lightColor", |