diff options
author | ericrk <ericrk@chromium.org> | 2015-10-19 14:44:56 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-19 14:44:56 -0700 |
commit | c84ccb070258db2803a9e8f532bfe7239a737063 (patch) | |
tree | a88d5eab3360be254e4ccd69240a9dfd50dc2729 /src/effects | |
parent | af96fce87937aba4aa5d394ee6316ba790308490 (diff) |
Update feSpotLight to match spec
This change updates feSpotLight to match the spec via two changes:
1) specularExponent is ignored if the spotlight has no coneAngle (GPU
bug only). This change updates the GPU path so that it matches the
CPU path and the spec in this regard.
2) specularExponent is clamped to the 1-128 range. The spec does not
specify a clamp for the specularExponent attribute of feSpotLight.
Note that the spec *does* specify this clamp for the
specularExponent attribute of feSpecularLighting. It looks like we
incorrectly applied this to both specularExponent attributes.
This change (along with a parallel change in Blink) allows us to pass
the SVG filter effects conformance test here:
http://www.w3.org/Graphics/SVG/Test/20110816/harness/htmlObject/filters-light-01-f.html
Additionally, this brings our behavior in line with Safari and Edge’s
behavior on this filter.
Two new cases were added to gm/lighting.cpp to catch these issues:
- The existing spotlight case exercised the path where our specular
exponent was between 1-128 and had a limiting cone angle.
- The first new spotlight case exercises the path where our specular
exponent is between 1-128 and we do not have a limiting cone angle.
- The second new spotlight case exercises the path where the specular
exponent is not within the 1-128 range, to ensure that we don’t
incorrectly clip to this range.
BUG=472849
Review URL: https://codereview.chromium.org/1403403003
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkLightingImageFilter.cpp | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 199bb4d684..f0f2c66d6f 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -682,7 +682,7 @@ class GrGLLight; class SkImageFilterLight : public SkRefCnt { public: - + enum LightType { kDistant_LightType, @@ -819,8 +819,8 @@ public: // 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()); } @@ -854,7 +854,7 @@ public: : INHERITED(color), fLocation(location), fTarget(target), - fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSpecularExponentMax)) + fSpecularExponent(specularExponent) { fS = target - location; fast_normalize(&fS); @@ -984,9 +984,6 @@ protected: } private: - static const SkScalar kSpecularExponentMin; - static const SkScalar kSpecularExponentMax; - SkPoint3 fLocation; SkPoint3 fTarget; SkScalar fSpecularExponent; @@ -998,11 +995,6 @@ private: 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; - /////////////////////////////////////////////////////////////////////////////// void SkImageFilterLight::flattenLight(SkWriteBuffer& buffer) const { @@ -1993,7 +1985,7 @@ void GrGLSpotLight::emitLightColor(GrGLFPBuilder* builder, lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", color, cosOuter, coneScale); lightColorBody.appendf("\t}\n"); - lightColorBody.appendf("\treturn %s;\n", color); + lightColorBody.appendf("\treturn %s * scale;\n", color); GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); fsBuilder->emitFunction(kVec3f_GrSLType, "lightColor", |