OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |