| 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 |