| Index: src/effects/SkLightingImageFilter.cpp
|
| diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
|
| index 0df6f7a76f018e80a734ffde3f650be6c09fc7a9..ae49462b5e1397c6373e7610b7804d15cc3e7daf 100644
|
| --- a/src/effects/SkLightingImageFilter.cpp
|
| +++ b/src/effects/SkLightingImageFilter.cpp
|
| @@ -8,11 +8,10 @@
|
| #include "SkLightingImageFilter.h"
|
| #include "SkBitmap.h"
|
| #include "SkColorPriv.h"
|
| +#include "SkPoint3.h"
|
| #include "SkReadBuffer.h"
|
| -#include "SkWriteBuffer.h"
|
| -#include "SkReadBuffer.h"
|
| -#include "SkWriteBuffer.h"
|
| #include "SkTypes.h"
|
| +#include "SkWriteBuffer.h"
|
|
|
| #if SK_SUPPORT_GPU
|
| #include "GrContext.h"
|
| @@ -47,7 +46,7 @@ void setUniformPoint3(const GrGLProgramDataManager& pdman, UniformHandle uni,
|
|
|
| void setUniformNormal3(const GrGLProgramDataManager& pdman, UniformHandle uni,
|
| const SkPoint3& point) {
|
| - setUniformPoint3(pdman, uni, SkPoint3(point.fX, point.fY, point.fZ));
|
| + setUniformPoint3(pdman, uni, point);
|
| }
|
| #endif
|
|
|
| @@ -69,7 +68,7 @@ public:
|
| const SkPoint3& lightColor) const {
|
| SkScalar colorScale = SkScalarMul(fKD, normal.dot(surfaceTolight));
|
| colorScale = SkScalarClampMax(colorScale, SK_Scalar1);
|
| - SkPoint3 color(lightColor * colorScale);
|
| + SkPoint3 color = lightColor.makeScale(colorScale);
|
| return SkPackARGB32(255,
|
| SkClampMax(SkScalarRoundToInt(color.fX), 255),
|
| SkClampMax(SkScalarRoundToInt(color.fY), 255),
|
| @@ -79,6 +78,10 @@ private:
|
| SkScalar fKD;
|
| };
|
|
|
| +static SkScalar max_component(const SkPoint3& p) {
|
| + return p.x() > p.y() ? (p.x() > p.z() ? p.x() : p.z()) : (p.y() > p.z() ? p.y() : p.z());
|
| +}
|
| +
|
| class SpecularLightingType {
|
| public:
|
| SpecularLightingType(SkScalar ks, SkScalar shininess)
|
| @@ -91,8 +94,8 @@ public:
|
| SkScalar colorScale = SkScalarMul(fKS,
|
| SkScalarPow(normal.dot(halfDir), fShininess));
|
| colorScale = SkScalarClampMax(colorScale, SK_Scalar1);
|
| - SkPoint3 color(lightColor * colorScale);
|
| - return SkPackARGB32(SkClampMax(SkScalarRoundToInt(color.maxComponent()), 255),
|
| + SkPoint3 color = lightColor.makeScale(colorScale);
|
| + return SkPackARGB32(SkClampMax(SkScalarRoundToInt(max_component(color)), 255),
|
| SkClampMax(SkScalarRoundToInt(color.fX), 255),
|
| SkClampMax(SkScalarRoundToInt(color.fY), 255),
|
| SkClampMax(SkScalarRoundToInt(color.fZ), 255));
|
| @@ -107,9 +110,9 @@ inline SkScalar sobel(int a, int b, int c, int d, int e, int f, SkScalar scale)
|
| }
|
|
|
| inline SkPoint3 pointToNormal(SkScalar x, SkScalar y, SkScalar surfaceScale) {
|
| - SkPoint3 vector(SkScalarMul(-x, surfaceScale),
|
| - SkScalarMul(-y, surfaceScale),
|
| - SK_Scalar1);
|
| + SkPoint3 vector = SkPoint3::Make(SkScalarMul(-x, surfaceScale),
|
| + SkScalarMul(-y, surfaceScale),
|
| + SK_Scalar1);
|
| vector.normalize();
|
| return vector;
|
| }
|
| @@ -712,10 +715,11 @@ public:
|
| static SkLight* UnflattenLight(SkReadBuffer& buffer);
|
|
|
| protected:
|
| - SkLight(SkColor color)
|
| - : fColor(SkIntToScalar(SkColorGetR(color)),
|
| - SkIntToScalar(SkColorGetG(color)),
|
| - SkIntToScalar(SkColorGetB(color))) {}
|
| + SkLight(SkColor color) {
|
| + fColor = SkPoint3::Make(SkIntToScalar(SkColorGetR(color)),
|
| + SkIntToScalar(SkColorGetG(color)),
|
| + SkIntToScalar(SkColorGetB(color)));
|
| + }
|
| SkLight(const SkPoint3& color)
|
| : fColor(color) {}
|
| SkLight(SkReadBuffer& buffer) {
|
| @@ -741,7 +745,7 @@ public:
|
| SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
|
| return fDirection;
|
| };
|
| - SkPoint3 lightColor(const SkPoint3&) const { return color(); }
|
| + const SkPoint3& lightColor(const SkPoint3&) const { return this->color(); }
|
| LightType type() const override { return kDistant_LightType; }
|
| const SkPoint3& direction() const { return fDirection; }
|
| GrGLLight* createGLLight() const override {
|
| @@ -792,13 +796,14 @@ public:
|
| : INHERITED(color), fLocation(location) {}
|
|
|
| SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
|
| - SkPoint3 direction(fLocation.fX - SkIntToScalar(x),
|
| - fLocation.fY - SkIntToScalar(y),
|
| - fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceScale));
|
| + SkPoint3 direction = SkPoint3::Make(fLocation.fX - SkIntToScalar(x),
|
| + fLocation.fY - SkIntToScalar(y),
|
| + fLocation.fZ - SkScalarMul(SkIntToScalar(z),
|
| + surfaceScale));
|
| direction.normalize();
|
| return direction;
|
| };
|
| - SkPoint3 lightColor(const SkPoint3&) const { return color(); }
|
| + const SkPoint3& lightColor(const SkPoint3&) const { return this->color(); }
|
| LightType type() const override { return kPoint_LightType; }
|
| const SkPoint3& location() const { return fLocation; }
|
| GrGLLight* createGLLight() const override {
|
| @@ -824,7 +829,9 @@ 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(location2.fX, location2.fY, SkScalarAve(locationZ.fX, locationZ.fY));
|
| + SkPoint3 location = SkPoint3::Make(location2.fX,
|
| + location2.fY,
|
| + SkScalarAve(locationZ.fX, locationZ.fY));
|
| return new SkPointLight(location, color());
|
| }
|
|
|
| @@ -872,12 +879,14 @@ 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(location2.fX, location2.fY, SkScalarAve(locationZ.fX, locationZ.fY));
|
| + SkPoint3 location = SkPoint3::Make(location2.fX, location2.fY,
|
| + SkScalarAve(locationZ.fX, locationZ.fY));
|
| SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY);
|
| matrix.mapPoints(&target2, 1);
|
| SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ);
|
| matrix.mapVectors(&targetZ, 1);
|
| - SkPoint3 target(target2.fX, target2.fY, SkScalarAve(targetZ.fX, targetZ.fY));
|
| + SkPoint3 target = SkPoint3::Make(target2.fX, target2.fY,
|
| + SkScalarAve(targetZ.fX, targetZ.fY));
|
| SkPoint3 s = target - location;
|
| s.normalize();
|
| return new SkSpotLight(location,
|
| @@ -891,23 +900,24 @@ public:
|
| }
|
|
|
| SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
|
| - SkPoint3 direction(fLocation.fX - SkIntToScalar(x),
|
| - fLocation.fY - SkIntToScalar(y),
|
| - fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceScale));
|
| + SkPoint3 direction = SkPoint3::Make(fLocation.fX - SkIntToScalar(x),
|
| + fLocation.fY - SkIntToScalar(y),
|
| + fLocation.fZ - SkScalarMul(SkIntToScalar(z),
|
| + surfaceScale));
|
| direction.normalize();
|
| return direction;
|
| };
|
| SkPoint3 lightColor(const SkPoint3& surfaceToLight) const {
|
| SkScalar cosAngle = -surfaceToLight.dot(fS);
|
| - if (cosAngle < fCosOuterConeAngle) {
|
| - return SkPoint3(0, 0, 0);
|
| - }
|
| - SkScalar scale = SkScalarPow(cosAngle, fSpecularExponent);
|
| - if (cosAngle < fCosInnerConeAngle) {
|
| - scale = SkScalarMul(scale, cosAngle - fCosOuterConeAngle);
|
| - return color() * SkScalarMul(scale, fConeScale);
|
| + SkScalar scale = 0;
|
| + if (cosAngle >= fCosOuterConeAngle) {
|
| + scale = SkScalarPow(cosAngle, fSpecularExponent);
|
| + if (cosAngle < fCosInnerConeAngle) {
|
| + scale = SkScalarMul(scale, cosAngle - fCosOuterConeAngle);
|
| + scale *= fConeScale;
|
| + }
|
| }
|
| - return color() * scale;
|
| + return this->color().makeScale(scale);
|
| }
|
| GrGLLight* createGLLight() const override {
|
| #if SK_SUPPORT_GPU
|
| @@ -1386,9 +1396,9 @@ GrFragmentProcessor* SkSpecularLightingImageFilter::getFragmentProcessor(
|
|
|
| namespace {
|
| SkPoint3 random_point3(SkRandom* random) {
|
| - return SkPoint3(SkScalarToFloat(random->nextSScalar1()),
|
| - SkScalarToFloat(random->nextSScalar1()),
|
| - SkScalarToFloat(random->nextSScalar1()));
|
| + return SkPoint3::Make(SkScalarToFloat(random->nextSScalar1()),
|
| + SkScalarToFloat(random->nextSScalar1()),
|
| + SkScalarToFloat(random->nextSScalar1()));
|
| }
|
|
|
| SkLight* create_random_light(SkRandom* random) {
|
| @@ -1883,14 +1893,13 @@ void GrGLLight::emitLightColorUniform(GrGLFPBuilder* builder) {
|
| "LightColor");
|
| }
|
|
|
| -void GrGLLight::emitLightColor(GrGLFPBuilder* builder,
|
| - const char *surfaceToLight) {
|
| +void GrGLLight::emitLightColor(GrGLFPBuilder* builder, const char *surfaceToLight) {
|
| builder->getFragmentShaderBuilder()->codeAppend(builder->getUniformCStr(this->lightColorUni()));
|
| }
|
|
|
| -void GrGLLight::setData(const GrGLProgramDataManager& pdman,
|
| - const SkLight* light) const {
|
| - setUniformPoint3(pdman, fColorUni, light->color() * SkScalarInvert(SkIntToScalar(255)));
|
| +void GrGLLight::setData(const GrGLProgramDataManager& pdman, const SkLight* light) const {
|
| + setUniformPoint3(pdman, fColorUni,
|
| + light->color().makeScale(SkScalarInvert(SkIntToScalar(255))));
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|