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 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 const SkPoint3& s() const { return fS; } | 728 const SkPoint3& s() const { return fS; } |
726 | 729 |
727 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 730 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
728 fLocation = readPoint3(buffer); | 731 fLocation = readPoint3(buffer); |
729 fTarget = readPoint3(buffer); | 732 fTarget = readPoint3(buffer); |
730 fSpecularExponent = buffer.readScalar(); | 733 fSpecularExponent = buffer.readScalar(); |
731 fCosOuterConeAngle = buffer.readScalar(); | 734 fCosOuterConeAngle = buffer.readScalar(); |
732 fCosInnerConeAngle = buffer.readScalar(); | 735 fCosInnerConeAngle = buffer.readScalar(); |
733 fConeScale = buffer.readScalar(); | 736 fConeScale = buffer.readScalar(); |
734 fS = readPoint3(buffer); | 737 fS = readPoint3(buffer); |
| 738 buffer.validate(SkScalarIsFinite(fSpecularExponent) && |
| 739 SkScalarIsFinite(fCosOuterConeAngle) && |
| 740 SkScalarIsFinite(fCosInnerConeAngle) && |
| 741 SkScalarIsFinite(fConeScale)); |
735 } | 742 } |
736 protected: | 743 protected: |
737 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) | 744 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) |
738 : INHERITED(color), | 745 : INHERITED(color), |
739 fLocation(location), | 746 fLocation(location), |
740 fTarget(target), | 747 fTarget(target), |
741 fSpecularExponent(specularExponent), | 748 fSpecularExponent(specularExponent), |
742 fCosOuterConeAngle(cosOuterConeAngle), | 749 fCosOuterConeAngle(cosOuterConeAngle), |
743 fCosInnerConeAngle(cosInnerConeAngle), | 750 fCosInnerConeAngle(cosInnerConeAngle), |
744 fConeScale(coneScale), | 751 fConeScale(coneScale), |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 const SkPoint3& location, const SkPoint3& target, | 876 const SkPoint3& location, const SkPoint3& target, |
870 SkScalar specularExponent, SkScalar cutoffAngle, | 877 SkScalar specularExponent, SkScalar cutoffAngle, |
871 SkColor lightColor, SkScalar surfaceScale, | 878 SkColor lightColor, SkScalar surfaceScale, |
872 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR
ect) { | 879 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR
ect) { |
873 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 880 return SkNEW_ARGS(SkSpecularLightingImageFilter, |
874 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), | 881 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), |
875 surfaceScale, ks, shininess, input, cropRect)); | 882 surfaceScale, ks, shininess, input, cropRect)); |
876 } | 883 } |
877 | 884 |
878 SkLightingImageFilter::~SkLightingImageFilter() { | 885 SkLightingImageFilter::~SkLightingImageFilter() { |
879 fLight->unref(); | 886 SkSafeUnref(fLight); |
880 } | 887 } |
881 | 888 |
882 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) | 889 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
883 : INHERITED(buffer) { | 890 : INHERITED(buffer) { |
884 fLight = SkLight::UnflattenLight(buffer); | 891 fLight = SkLight::UnflattenLight(buffer); |
885 fSurfaceScale = buffer.readScalar(); | 892 fSurfaceScale = buffer.readScalar(); |
| 893 buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
886 } | 894 } |
887 | 895 |
888 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { | 896 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
889 this->INHERITED::flatten(buffer); | 897 this->INHERITED::flatten(buffer); |
890 fLight->flattenLight(buffer); | 898 fLight->flattenLight(buffer); |
891 buffer.writeScalar(fSurfaceScale); | 899 buffer.writeScalar(fSurfaceScale); |
892 } | 900 } |
893 | 901 |
894 /////////////////////////////////////////////////////////////////////////////// | 902 /////////////////////////////////////////////////////////////////////////////// |
895 | 903 |
896 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect =
NULL) | 904 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect =
NULL) |
897 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 905 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
898 fKD(kd) | 906 fKD(kd) |
899 { | 907 { |
900 } | 908 } |
901 | 909 |
902 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) | 910 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) |
903 : INHERITED(buffer) | 911 : INHERITED(buffer) |
904 { | 912 { |
905 fKD = buffer.readScalar(); | 913 fKD = buffer.readScalar(); |
| 914 buffer.validate(SkScalarIsFinite(fKD)); |
906 } | 915 } |
907 | 916 |
908 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { | 917 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { |
909 this->INHERITED::flatten(buffer); | 918 this->INHERITED::flatten(buffer); |
910 buffer.writeScalar(fKD); | 919 buffer.writeScalar(fKD); |
911 } | 920 } |
912 | 921 |
913 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, | 922 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, |
914 const SkBitmap& src, | 923 const SkBitmap& src, |
915 const SkMatrix& ctm, | 924 const SkMatrix& ctm, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
973 fKS(ks), | 982 fKS(ks), |
974 fShininess(shininess) | 983 fShininess(shininess) |
975 { | 984 { |
976 } | 985 } |
977 | 986 |
978 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) | 987 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) |
979 : INHERITED(buffer) | 988 : INHERITED(buffer) |
980 { | 989 { |
981 fKS = buffer.readScalar(); | 990 fKS = buffer.readScalar(); |
982 fShininess = buffer.readScalar(); | 991 fShininess = buffer.readScalar(); |
| 992 buffer.validate(SkScalarIsFinite(fKS) && |
| 993 SkScalarIsFinite(fShininess)); |
983 } | 994 } |
984 | 995 |
985 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { | 996 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { |
986 this->INHERITED::flatten(buffer); | 997 this->INHERITED::flatten(buffer); |
987 buffer.writeScalar(fKS); | 998 buffer.writeScalar(fKS); |
988 buffer.writeScalar(fShininess); | 999 buffer.writeScalar(fShininess); |
989 } | 1000 } |
990 | 1001 |
991 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, | 1002 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, |
992 const SkBitmap& src, | 1003 const SkBitmap& src, |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1570 | 1581 |
1571 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1582 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
1572 } | 1583 } |
1573 | 1584 |
1574 #endif | 1585 #endif |
1575 | 1586 |
1576 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1587 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
1577 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1588 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
1578 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1589 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
1579 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1590 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |