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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 surfaceToLight = l->surfaceToLight(x, y, m[4], surfaceScale); | 241 surfaceToLight = l->surfaceToLight(x, y, m[4], surfaceScale); |
242 *dptr++ = lightingType.light(bottomRightNormal(m, surfaceScale), surface
ToLight, l->lightColor(surfaceToLight)); | 242 *dptr++ = lightingType.light(bottomRightNormal(m, surfaceScale), surface
ToLight, l->lightColor(surfaceToLight)); |
243 } | 243 } |
244 } | 244 } |
245 | 245 |
246 SkPoint3 readPoint3(SkFlattenableReadBuffer& buffer) { | 246 SkPoint3 readPoint3(SkFlattenableReadBuffer& buffer) { |
247 SkPoint3 point; | 247 SkPoint3 point; |
248 point.fX = buffer.readScalar(); | 248 point.fX = buffer.readScalar(); |
249 point.fY = buffer.readScalar(); | 249 point.fY = buffer.readScalar(); |
250 point.fZ = buffer.readScalar(); | 250 point.fZ = buffer.readScalar(); |
| 251 buffer.validate(SkScalarIsFinite(point.fX) && |
| 252 SkScalarIsFinite(point.fY) && |
| 253 SkScalarIsFinite(point.fZ)); |
251 return point; | 254 return point; |
252 }; | 255 }; |
253 | 256 |
254 void writePoint3(const SkPoint3& point, SkFlattenableWriteBuffer& buffer) { | 257 void writePoint3(const SkPoint3& point, SkFlattenableWriteBuffer& buffer) { |
255 buffer.writeScalar(point.fX); | 258 buffer.writeScalar(point.fX); |
256 buffer.writeScalar(point.fY); | 259 buffer.writeScalar(point.fY); |
257 buffer.writeScalar(point.fZ); | 260 buffer.writeScalar(point.fZ); |
258 }; | 261 }; |
259 | 262 |
260 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { | 263 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 const SkPoint3& s() const { return fS; } | 731 const SkPoint3& s() const { return fS; } |
729 | 732 |
730 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 733 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
731 fLocation = readPoint3(buffer); | 734 fLocation = readPoint3(buffer); |
732 fTarget = readPoint3(buffer); | 735 fTarget = readPoint3(buffer); |
733 fSpecularExponent = buffer.readScalar(); | 736 fSpecularExponent = buffer.readScalar(); |
734 fCosOuterConeAngle = buffer.readScalar(); | 737 fCosOuterConeAngle = buffer.readScalar(); |
735 fCosInnerConeAngle = buffer.readScalar(); | 738 fCosInnerConeAngle = buffer.readScalar(); |
736 fConeScale = buffer.readScalar(); | 739 fConeScale = buffer.readScalar(); |
737 fS = readPoint3(buffer); | 740 fS = readPoint3(buffer); |
| 741 buffer.validate(SkScalarIsFinite(fSpecularExponent) && |
| 742 SkScalarIsFinite(fCosOuterConeAngle) && |
| 743 SkScalarIsFinite(fCosInnerConeAngle) && |
| 744 SkScalarIsFinite(fConeScale)); |
738 } | 745 } |
739 protected: | 746 protected: |
740 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) | 747 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) |
741 : INHERITED(color), | 748 : INHERITED(color), |
742 fLocation(location), | 749 fLocation(location), |
743 fTarget(target), | 750 fTarget(target), |
744 fSpecularExponent(specularExponent), | 751 fSpecularExponent(specularExponent), |
745 fCosOuterConeAngle(cosOuterConeAngle), | 752 fCosOuterConeAngle(cosOuterConeAngle), |
746 fCosInnerConeAngle(cosInnerConeAngle), | 753 fCosInnerConeAngle(cosInnerConeAngle), |
747 fConeScale(coneScale), | 754 fConeScale(coneScale), |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 const SkPoint3& location, const SkPoint3& target, | 879 const SkPoint3& location, const SkPoint3& target, |
873 SkScalar specularExponent, SkScalar cutoffAngle, | 880 SkScalar specularExponent, SkScalar cutoffAngle, |
874 SkColor lightColor, SkScalar surfaceScale, | 881 SkColor lightColor, SkScalar surfaceScale, |
875 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR
ect) { | 882 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR
ect) { |
876 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 883 return SkNEW_ARGS(SkSpecularLightingImageFilter, |
877 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), | 884 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), |
878 surfaceScale, ks, shininess, input, cropRect)); | 885 surfaceScale, ks, shininess, input, cropRect)); |
879 } | 886 } |
880 | 887 |
881 SkLightingImageFilter::~SkLightingImageFilter() { | 888 SkLightingImageFilter::~SkLightingImageFilter() { |
882 fLight->unref(); | 889 SkSafeUnref(fLight); |
883 } | 890 } |
884 | 891 |
885 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) | 892 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
886 : INHERITED(buffer) { | 893 : INHERITED(buffer) { |
887 fLight = SkLight::UnflattenLight(buffer); | 894 fLight = SkLight::UnflattenLight(buffer); |
888 fSurfaceScale = buffer.readScalar(); | 895 fSurfaceScale = buffer.readScalar(); |
| 896 buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
889 } | 897 } |
890 | 898 |
891 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { | 899 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
892 this->INHERITED::flatten(buffer); | 900 this->INHERITED::flatten(buffer); |
893 fLight->flattenLight(buffer); | 901 fLight->flattenLight(buffer); |
894 buffer.writeScalar(fSurfaceScale); | 902 buffer.writeScalar(fSurfaceScale); |
895 } | 903 } |
896 | 904 |
897 /////////////////////////////////////////////////////////////////////////////// | 905 /////////////////////////////////////////////////////////////////////////////// |
898 | 906 |
899 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect =
NULL) | 907 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect =
NULL) |
900 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 908 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
901 fKD(kd) | 909 fKD(kd) |
902 { | 910 { |
903 } | 911 } |
904 | 912 |
905 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) | 913 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) |
906 : INHERITED(buffer) | 914 : INHERITED(buffer) |
907 { | 915 { |
908 fKD = buffer.readScalar(); | 916 fKD = buffer.readScalar(); |
| 917 buffer.validate(SkScalarIsFinite(fKD)); |
909 } | 918 } |
910 | 919 |
911 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { | 920 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { |
912 this->INHERITED::flatten(buffer); | 921 this->INHERITED::flatten(buffer); |
913 buffer.writeScalar(fKD); | 922 buffer.writeScalar(fKD); |
914 } | 923 } |
915 | 924 |
916 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, | 925 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, |
917 const SkBitmap& src, | 926 const SkBitmap& src, |
918 const SkMatrix& ctm, | 927 const SkMatrix& ctm, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 fKS(ks), | 985 fKS(ks), |
977 fShininess(shininess) | 986 fShininess(shininess) |
978 { | 987 { |
979 } | 988 } |
980 | 989 |
981 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) | 990 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) |
982 : INHERITED(buffer) | 991 : INHERITED(buffer) |
983 { | 992 { |
984 fKS = buffer.readScalar(); | 993 fKS = buffer.readScalar(); |
985 fShininess = buffer.readScalar(); | 994 fShininess = buffer.readScalar(); |
| 995 buffer.validate(SkScalarIsFinite(fKS) && |
| 996 SkScalarIsFinite(fShininess)); |
986 } | 997 } |
987 | 998 |
988 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { | 999 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { |
989 this->INHERITED::flatten(buffer); | 1000 this->INHERITED::flatten(buffer); |
990 buffer.writeScalar(fKS); | 1001 buffer.writeScalar(fKS); |
991 buffer.writeScalar(fShininess); | 1002 buffer.writeScalar(fShininess); |
992 } | 1003 } |
993 | 1004 |
994 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, | 1005 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, |
995 const SkBitmap& src, | 1006 const SkBitmap& src, |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1573 | 1584 |
1574 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1585 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
1575 } | 1586 } |
1576 | 1587 |
1577 #endif | 1588 #endif |
1578 | 1589 |
1579 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1590 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
1580 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1591 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
1581 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1592 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
1582 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1593 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |