Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

Issue 2198263002: Image filters: force near-zero floating point parameters to zero. Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkLightingImageFilter.h" 8 #include "SkLightingImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 SkScalar fKD; 92 SkScalar fKD;
93 }; 93 };
94 94
95 static SkScalar max_component(const SkPoint3& p) { 95 static SkScalar max_component(const SkPoint3& p) {
96 return p.x() > p.y() ? (p.x() > p.z() ? p.x() : p.z()) : (p.y() > p.z() ? p. y() : p.z()); 96 return p.x() > p.y() ? (p.x() > p.z() ? p.x() : p.z()) : (p.y() > p.z() ? p. y() : p.z());
97 } 97 }
98 98
99 class SpecularLightingType { 99 class SpecularLightingType {
100 public: 100 public:
101 SpecularLightingType(SkScalar ks, SkScalar shininess) 101 SpecularLightingType(SkScalar ks, SkScalar shininess)
102 : fKS(ks), fShininess(shininess) {} 102 : fKS(SkScalarNormalize(ks)), fShininess(SkScalarNormalize(shininess)) { }
103 SkPMColor light(const SkPoint3& normal, const SkPoint3& surfaceTolight, 103 SkPMColor light(const SkPoint3& normal, const SkPoint3& surfaceTolight,
104 const SkPoint3& lightColor) const { 104 const SkPoint3& lightColor) const {
105 SkPoint3 halfDir(surfaceTolight); 105 SkPoint3 halfDir(surfaceTolight);
106 halfDir.fZ += SK_Scalar1; // eye position is always (0, 0, 1) 106 halfDir.fZ += SK_Scalar1; // eye position is always (0, 0, 1)
107 fast_normalize(&halfDir); 107 fast_normalize(&halfDir);
108 SkScalar colorScale = SkScalarMul(fKS, 108 SkScalar colorScale = SkScalarMul(fKS,
109 SkScalarPow(normal.dot(halfDir), fShininess)); 109 SkScalarPow(normal.dot(halfDir), fShininess));
110 colorScale = SkScalarClampMax(colorScale, SK_Scalar1); 110 colorScale = SkScalarClampMax(colorScale, SK_Scalar1);
111 SkPoint3 color = lightColor.makeScale(colorScale); 111 SkPoint3 color = lightColor.makeScale(colorScale);
112 return SkPackARGB32(SkClampMax(SkScalarRoundToInt(max_component(color)), 255), 112 return SkPackARGB32(SkClampMax(SkScalarRoundToInt(max_component(color)), 255),
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 lightBitmap<LightingType, LightType, UncheckedPixelFetcher>( 309 lightBitmap<LightingType, LightType, UncheckedPixelFetcher>(
310 lightingType, light, src, dst, surfaceScale, bounds); 310 lightingType, light, src, dst, surfaceScale, bounds);
311 } else { 311 } else {
312 lightBitmap<LightingType, LightType, DecalPixelFetcher>( 312 lightBitmap<LightingType, LightType, DecalPixelFetcher>(
313 lightingType, light, src, dst, surfaceScale, bounds); 313 lightingType, light, src, dst, surfaceScale, bounds);
314 } 314 }
315 } 315 }
316 316
317 SkPoint3 readPoint3(SkReadBuffer& buffer) { 317 SkPoint3 readPoint3(SkReadBuffer& buffer) {
318 SkPoint3 point; 318 SkPoint3 point;
319 point.fX = buffer.readScalar(); 319 point.fX = SkScalarNormalize(buffer.readScalar());
320 point.fY = buffer.readScalar(); 320 point.fY = SkScalarNormalize(buffer.readScalar());
321 point.fZ = buffer.readScalar(); 321 point.fZ = SkScalarNormalize(buffer.readScalar());
322 buffer.validate(SkScalarIsFinite(point.fX) && 322 buffer.validate(SkScalarIsFinite(point.fX) &&
323 SkScalarIsFinite(point.fY) && 323 SkScalarIsFinite(point.fY) &&
324 SkScalarIsFinite(point.fZ)); 324 SkScalarIsFinite(point.fZ));
325 return point; 325 return point;
326 }; 326 };
327 327
328 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { 328 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) {
329 buffer.writeScalar(point.fX); 329 buffer.writeScalar(point.fX);
330 buffer.writeScalar(point.fY); 330 buffer.writeScalar(point.fY);
331 buffer.writeScalar(point.fZ); 331 buffer.writeScalar(point.fZ);
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 void flattenLight(SkWriteBuffer& buffer) const; 768 void flattenLight(SkWriteBuffer& buffer) const;
769 static SkImageFilterLight* UnflattenLight(SkReadBuffer& buffer); 769 static SkImageFilterLight* UnflattenLight(SkReadBuffer& buffer);
770 770
771 protected: 771 protected:
772 SkImageFilterLight(SkColor color) { 772 SkImageFilterLight(SkColor color) {
773 fColor = SkPoint3::Make(SkIntToScalar(SkColorGetR(color)), 773 fColor = SkPoint3::Make(SkIntToScalar(SkColorGetR(color)),
774 SkIntToScalar(SkColorGetG(color)), 774 SkIntToScalar(SkColorGetG(color)),
775 SkIntToScalar(SkColorGetB(color))); 775 SkIntToScalar(SkColorGetB(color)));
776 } 776 }
777 SkImageFilterLight(const SkPoint3& color) 777 SkImageFilterLight(const SkPoint3& color)
778 : fColor(color) {} 778 : fColor(color.makeDenormalsZero()) {}
779 SkImageFilterLight(SkReadBuffer& buffer) { 779 SkImageFilterLight(SkReadBuffer& buffer) {
780 fColor = readPoint3(buffer); 780 fColor = readPoint3(buffer);
781 } 781 }
782 782
783 virtual void onFlattenLight(SkWriteBuffer& buffer) const = 0; 783 virtual void onFlattenLight(SkWriteBuffer& buffer) const = 0;
784 784
785 785
786 private: 786 private:
787 typedef SkRefCnt INHERITED; 787 typedef SkRefCnt INHERITED;
788 SkPoint3 fColor; 788 SkPoint3 fColor;
789 }; 789 };
790 790
791 /////////////////////////////////////////////////////////////////////////////// 791 ///////////////////////////////////////////////////////////////////////////////
792 792
793 class SkDistantLight : public SkImageFilterLight { 793 class SkDistantLight : public SkImageFilterLight {
794 public: 794 public:
795 SkDistantLight(const SkPoint3& direction, SkColor color) 795 SkDistantLight(const SkPoint3& direction, SkColor color)
796 : INHERITED(color), fDirection(direction) { 796 : INHERITED(color), fDirection(direction.makeDenormalsZero()) {
797 } 797 }
798 798
799 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { 799 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const {
800 return fDirection; 800 return fDirection;
801 }; 801 };
802 const SkPoint3& lightColor(const SkPoint3&) const { return this->color(); } 802 const SkPoint3& lightColor(const SkPoint3&) const { return this->color(); }
803 LightType type() const override { return kDistant_LightType; } 803 LightType type() const override { return kDistant_LightType; }
804 const SkPoint3& direction() const { return fDirection; } 804 const SkPoint3& direction() const { return fDirection; }
805 GrGLLight* createGLLight() const override { 805 GrGLLight* createGLLight() const override {
806 #if SK_SUPPORT_GPU 806 #if SK_SUPPORT_GPU
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 const SkPoint3& target() const { return fTarget; } 989 const SkPoint3& target() const { return fTarget; }
990 SkScalar specularExponent() const { return fSpecularExponent; } 990 SkScalar specularExponent() const { return fSpecularExponent; }
991 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; } 991 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; }
992 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; } 992 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; }
993 SkScalar coneScale() const { return fConeScale; } 993 SkScalar coneScale() const { return fConeScale; }
994 const SkPoint3& s() const { return fS; } 994 const SkPoint3& s() const { return fS; }
995 995
996 SkSpotLight(SkReadBuffer& buffer) : INHERITED(buffer) { 996 SkSpotLight(SkReadBuffer& buffer) : INHERITED(buffer) {
997 fLocation = readPoint3(buffer); 997 fLocation = readPoint3(buffer);
998 fTarget = readPoint3(buffer); 998 fTarget = readPoint3(buffer);
999 fSpecularExponent = buffer.readScalar(); 999 fSpecularExponent = SkScalarNormalize(buffer.readScalar());
1000 fCosOuterConeAngle = buffer.readScalar(); 1000 fCosOuterConeAngle = SkScalarNormalize(buffer.readScalar());
1001 fCosInnerConeAngle = buffer.readScalar(); 1001 fCosInnerConeAngle = SkScalarNormalize(buffer.readScalar());
1002 fConeScale = buffer.readScalar(); 1002 fConeScale = SkScalarNormalize(buffer.readScalar());
1003 fS = readPoint3(buffer); 1003 fS = readPoint3(buffer);
1004 buffer.validate(SkScalarIsFinite(fSpecularExponent) && 1004 buffer.validate(SkScalarIsFinite(fSpecularExponent) &&
1005 SkScalarIsFinite(fCosOuterConeAngle) && 1005 SkScalarIsFinite(fCosOuterConeAngle) &&
1006 SkScalarIsFinite(fCosInnerConeAngle) && 1006 SkScalarIsFinite(fCosInnerConeAngle) &&
1007 SkScalarIsFinite(fConeScale)); 1007 SkScalarIsFinite(fConeScale));
1008 } 1008 }
1009 protected: 1009 protected:
1010 SkSpotLight(const SkPoint3& location, 1010 SkSpotLight(const SkPoint3& location,
1011 const SkPoint3& target, 1011 const SkPoint3& target,
1012 SkScalar specularExponent, 1012 SkScalar specularExponent,
1013 SkScalar cosOuterConeAngle, 1013 SkScalar cosOuterConeAngle,
1014 SkScalar cosInnerConeAngle, 1014 SkScalar cosInnerConeAngle,
1015 SkScalar coneScale, 1015 SkScalar coneScale,
1016 const SkPoint3& s, 1016 const SkPoint3& s,
1017 const SkPoint3& color) 1017 const SkPoint3& color)
1018 : INHERITED(color), 1018 : INHERITED(color),
1019 fLocation(location), 1019 fLocation(location.makeDenormalsZero()),
1020 fTarget(target), 1020 fTarget(target.makeDenormalsZero()),
1021 fSpecularExponent(specularExponent), 1021 fSpecularExponent(SkScalarNormalize(specularExponent)),
1022 fCosOuterConeAngle(cosOuterConeAngle), 1022 fCosOuterConeAngle(SkScalarNormalize(cosOuterConeAngle)),
1023 fCosInnerConeAngle(cosInnerConeAngle), 1023 fCosInnerConeAngle(SkScalarNormalize(cosInnerConeAngle)),
1024 fConeScale(coneScale), 1024 fConeScale(SkScalarNormalize(coneScale)),
1025 fS(s) 1025 fS(s.makeDenormalsZero())
1026 { 1026 {
1027 } 1027 }
1028 void onFlattenLight(SkWriteBuffer& buffer) const override { 1028 void onFlattenLight(SkWriteBuffer& buffer) const override {
1029 writePoint3(fLocation, buffer); 1029 writePoint3(fLocation, buffer);
1030 writePoint3(fTarget, buffer); 1030 writePoint3(fTarget, buffer);
1031 buffer.writeScalar(fSpecularExponent); 1031 buffer.writeScalar(fSpecularExponent);
1032 buffer.writeScalar(fCosOuterConeAngle); 1032 buffer.writeScalar(fCosOuterConeAngle);
1033 buffer.writeScalar(fCosInnerConeAngle); 1033 buffer.writeScalar(fCosInnerConeAngle);
1034 buffer.writeScalar(fConeScale); 1034 buffer.writeScalar(fConeScale);
1035 writePoint3(fS, buffer); 1035 writePoint3(fS, buffer);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 return nullptr; 1095 return nullptr;
1096 } 1096 }
1097 } 1097 }
1098 /////////////////////////////////////////////////////////////////////////////// 1098 ///////////////////////////////////////////////////////////////////////////////
1099 1099
1100 SkLightingImageFilter::SkLightingImageFilter(sk_sp<SkImageFilterLight> light, 1100 SkLightingImageFilter::SkLightingImageFilter(sk_sp<SkImageFilterLight> light,
1101 SkScalar surfaceScale, 1101 SkScalar surfaceScale,
1102 sk_sp<SkImageFilter> input, const C ropRect* cropRect) 1102 sk_sp<SkImageFilter> input, const C ropRect* cropRect)
1103 : INHERITED(&input, 1, cropRect) 1103 : INHERITED(&input, 1, cropRect)
1104 , fLight(std::move(light)) 1104 , fLight(std::move(light))
1105 , fSurfaceScale(surfaceScale / 255) { 1105 , fSurfaceScale(SkScalarNormalize(surfaceScale / 255)) {
1106 } 1106 }
1107 1107
1108 SkLightingImageFilter::~SkLightingImageFilter() {} 1108 SkLightingImageFilter::~SkLightingImageFilter() {}
1109 1109
1110 sk_sp<SkImageFilter> SkLightingImageFilter::MakeDistantLitDiffuse(const SkPoint3 & direction, 1110 sk_sp<SkImageFilter> SkLightingImageFilter::MakeDistantLitDiffuse(const SkPoint3 & direction,
1111 SkColor lightC olor, 1111 SkColor lightC olor,
1112 SkScalar surfa ceScale, 1112 SkScalar surfa ceScale,
1113 SkScalar kd, 1113 SkScalar kd,
1114 sk_sp<SkImageF ilter> input, 1114 sk_sp<SkImageF ilter> input,
1115 const CropRect * cropRect) { 1115 const CropRect * cropRect) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 return sk_sp<SkImageFilter>(new SkDiffuseLightingImageFilter(std::move(light ), surfaceScale, 1211 return sk_sp<SkImageFilter>(new SkDiffuseLightingImageFilter(std::move(light ), surfaceScale,
1212 kd, std::move(i nput), cropRect)); 1212 kd, std::move(i nput), cropRect));
1213 } 1213 }
1214 1214
1215 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(sk_sp<SkImageFilterLi ght> light, 1215 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(sk_sp<SkImageFilterLi ght> light,
1216 SkScalar surfaceScale , 1216 SkScalar surfaceScale ,
1217 SkScalar kd, 1217 SkScalar kd,
1218 sk_sp<SkImageFilter> input, 1218 sk_sp<SkImageFilter> input,
1219 const CropRect* cropR ect) 1219 const CropRect* cropR ect)
1220 : INHERITED(std::move(light), surfaceScale, std::move(input), cropRect) 1220 : INHERITED(std::move(light), surfaceScale, std::move(input), cropRect)
1221 , fKD(kd) { 1221 , fKD(SkScalarNormalize(kd)) {
1222 } 1222 }
1223 1223
1224 sk_sp<SkFlattenable> SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buff er) { 1224 sk_sp<SkFlattenable> SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buff er) {
1225 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); 1225 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
1226 sk_sp<SkImageFilterLight> light(SkImageFilterLight::UnflattenLight(buffer)); 1226 sk_sp<SkImageFilterLight> light(SkImageFilterLight::UnflattenLight(buffer));
1227 SkScalar surfaceScale = buffer.readScalar(); 1227 SkScalar surfaceScale = buffer.readScalar();
1228 SkScalar kd = buffer.readScalar(); 1228 SkScalar kd = buffer.readScalar();
1229 return Make(std::move(light), surfaceScale, kd, common.getInput(0), &common. cropRect()); 1229 return Make(std::move(light), surfaceScale, kd, common.getInput(0), &common. cropRect());
1230 } 1230 }
1231 1231
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 std::move(inpu t), cropRect)); 1372 std::move(inpu t), cropRect));
1373 } 1373 }
1374 1374
1375 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(sk_sp<SkImageFilter Light> light, 1375 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(sk_sp<SkImageFilter Light> light,
1376 SkScalar surfaceSca le, 1376 SkScalar surfaceSca le,
1377 SkScalar ks, 1377 SkScalar ks,
1378 SkScalar shininess, 1378 SkScalar shininess,
1379 sk_sp<SkImageFilter > input, 1379 sk_sp<SkImageFilter > input,
1380 const CropRect* cro pRect) 1380 const CropRect* cro pRect)
1381 : INHERITED(std::move(light), surfaceScale, std::move(input), cropRect) 1381 : INHERITED(std::move(light), surfaceScale, std::move(input), cropRect)
1382 , fKS(ks) 1382 , fKS(SkScalarNormalize(ks))
1383 , fShininess(shininess) { 1383 , fShininess(SkScalarNormalize(shininess)) {
1384 } 1384 }
1385 1385
1386 sk_sp<SkFlattenable> SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buf fer) { 1386 sk_sp<SkFlattenable> SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buf fer) {
1387 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); 1387 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
1388 sk_sp<SkImageFilterLight> light(SkImageFilterLight::UnflattenLight(buffer)); 1388 sk_sp<SkImageFilterLight> light(SkImageFilterLight::UnflattenLight(buffer));
1389 SkScalar surfaceScale = buffer.readScalar(); 1389 SkScalar surfaceScale = buffer.readScalar();
1390 SkScalar ks = buffer.readScalar(); 1390 SkScalar ks = buffer.readScalar();
1391 SkScalar shine = buffer.readScalar(); 1391 SkScalar shine = buffer.readScalar();
1392 return Make(std::move(light), surfaceScale, ks, shine, common.getInput(0), 1392 return Make(std::move(light), surfaceScale, ks, shine, common.getInput(0),
1393 &common.cropRect()); 1393 &common.cropRect());
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 }; 1696 };
1697 1697
1698 GrLightingEffect::GrLightingEffect(GrTexture* texture, 1698 GrLightingEffect::GrLightingEffect(GrTexture* texture,
1699 const SkImageFilterLight* light, 1699 const SkImageFilterLight* light,
1700 SkScalar surfaceScale, 1700 SkScalar surfaceScale,
1701 const SkMatrix& matrix, 1701 const SkMatrix& matrix,
1702 BoundaryMode boundaryMode, 1702 BoundaryMode boundaryMode,
1703 const SkIRect* srcBounds) 1703 const SkIRect* srcBounds)
1704 : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(tex ture)) 1704 : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(tex ture))
1705 , fLight(light) 1705 , fLight(light)
1706 , fSurfaceScale(surfaceScale) 1706 , fSurfaceScale(SkScalarNormalize(surfaceScale))
1707 , fFilterMatrix(matrix) 1707 , fFilterMatrix(matrix)
1708 , fBoundaryMode(boundaryMode) 1708 , fBoundaryMode(boundaryMode)
1709 , fDomain(create_domain(texture, srcBounds, GrTextureDomain::kDecal_Mode)) { 1709 , fDomain(create_domain(texture, srcBounds, GrTextureDomain::kDecal_Mode)) {
1710 fLight->ref(); 1710 fLight->ref();
1711 if (light->requiresFragmentPosition()) { 1711 if (light->requiresFragmentPosition()) {
1712 this->setWillReadFragmentPosition(); 1712 this->setWillReadFragmentPosition();
1713 } 1713 }
1714 } 1714 }
1715 1715
1716 GrLightingEffect::~GrLightingEffect() { 1716 GrLightingEffect::~GrLightingEffect() {
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
2170 2170
2171 fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); 2171 fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight);
2172 } 2172 }
2173 2173
2174 #endif 2174 #endif
2175 2175
2176 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) 2176 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
2177 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) 2177 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
2178 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) 2178 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
2179 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 2179 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698