diff options
-rw-r--r-- | gm/lighting.cpp | 62 | ||||
-rw-r--r-- | src/effects/SkLightingImageFilter.cpp | 18 |
2 files changed, 20 insertions, 60 deletions
diff --git a/gm/lighting.cpp b/gm/lighting.cpp index 0ce9599bc1..af102d7d03 100644 --- a/gm/lighting.cpp +++ b/gm/lighting.cpp @@ -10,7 +10,7 @@ #include "SkOffsetImageFilter.h" #include "SkPoint3.h" -#define WIDTH 550 +#define WIDTH 330 #define HEIGHT 660 namespace skiagm { @@ -69,10 +69,8 @@ protected: SkIntToScalar(-10), SkIntToScalar(20)); SkPoint3 spotTarget = SkPoint3::Make(SkIntToScalar(40), SkIntToScalar(40), 0); - SkScalar spotExponent1 = SK_Scalar1; - SkScalar spotExponent0 = SkIntToScalar(0); - SkScalar cutoffAngleSmall = SkIntToScalar(15); - SkScalar cutoffAngleNone = SkIntToScalar(180); + SkScalar spotExponent = SK_Scalar1; + SkScalar cutoffAngle = SkIntToScalar(15); SkScalar kd = SkIntToScalar(2); SkScalar ks = SkIntToScalar(1); SkScalar shininess = SkIntToScalar(8); @@ -106,8 +104,8 @@ protected: paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, - spotExponent1, - cutoffAngleSmall, + spotExponent, + cutoffAngle, white, surfaceScale, kd, @@ -115,28 +113,6 @@ protected: cr))->unref(); drawClippedBitmap(canvas, paint, 220, y); - paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, - spotTarget, - spotExponent1, - cutoffAngleNone, - white, - surfaceScale, - kd, - input, - cr))->unref(); - drawClippedBitmap(canvas, paint, 330, y); - - paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, - spotTarget, - spotExponent0, - cutoffAngleNone, - white, - surfaceScale, - kd, - input, - cr))->unref(); - drawClippedBitmap(canvas, paint, 440, y); - y += 110; paint.setImageFilter(SkLightingImageFilter::CreatePointLitSpecular(pointLocation, @@ -159,8 +135,8 @@ protected: paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, spotTarget, - spotExponent1, - cutoffAngleSmall, + spotExponent, + cutoffAngle, white, surfaceScale, ks, @@ -169,30 +145,6 @@ protected: cr))->unref(); drawClippedBitmap(canvas, paint, 220, y); - paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, - spotTarget, - spotExponent1, - cutoffAngleNone, - white, - surfaceScale, - ks, - shininess, - input, - cr))->unref(); - drawClippedBitmap(canvas, paint, 330, y); - - paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, - spotTarget, - spotExponent0, - cutoffAngleNone, - white, - surfaceScale, - ks, - shininess, - input, - cr))->unref(); - drawClippedBitmap(canvas, paint, 440, y); - y += 110; } } diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index f0f2c66d6f..199bb4d684 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(specularExponent) + fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSpecularExponentMax)) { fS = target - location; fast_normalize(&fS); @@ -984,6 +984,9 @@ protected: } private: + static const SkScalar kSpecularExponentMin; + static const SkScalar kSpecularExponentMax; + SkPoint3 fLocation; SkPoint3 fTarget; SkScalar fSpecularExponent; @@ -995,6 +998,11 @@ 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 { @@ -1985,7 +1993,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 * scale;\n", color); + lightColorBody.appendf("\treturn %s;\n", color); GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); fsBuilder->emitFunction(kVec3f_GrSLType, "lightColor", |