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 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 virtual LightType type() const = 0; | 522 virtual LightType type() const = 0; |
520 const SkPoint3& color() const { return fColor; } | 523 const SkPoint3& color() const { return fColor; } |
521 virtual GrGLLight* createGLLight() const = 0; | 524 virtual GrGLLight* createGLLight() const = 0; |
522 virtual bool isEqual(const SkLight& other) const { | 525 virtual bool isEqual(const SkLight& other) const { |
523 return fColor == other.fColor; | 526 return fColor == other.fColor; |
524 } | 527 } |
525 // Called to know whether the generated GrGLLight will require access to the
fragment position. | 528 // Called to know whether the generated GrGLLight will require access to the
fragment position. |
526 virtual bool requiresFragmentPosition() const = 0; | 529 virtual bool requiresFragmentPosition() const = 0; |
527 virtual SkLight* transform(const SkMatrix& matrix) const = 0; | 530 virtual SkLight* transform(const SkMatrix& matrix) const = 0; |
528 | 531 |
| 532 SK_DEFINE_FLATTENABLE_TYPE(SkLight) |
| 533 |
529 protected: | 534 protected: |
530 SkLight(SkColor color) | 535 SkLight(SkColor color) |
531 : fColor(SkIntToScalar(SkColorGetR(color)), | 536 : fColor(SkIntToScalar(SkColorGetR(color)), |
532 SkIntToScalar(SkColorGetG(color)), | 537 SkIntToScalar(SkColorGetG(color)), |
533 SkIntToScalar(SkColorGetB(color))) {} | 538 SkIntToScalar(SkColorGetB(color))) {} |
534 SkLight(const SkPoint3& color) | 539 SkLight(const SkPoint3& color) |
535 : fColor(color) {} | 540 : fColor(color) {} |
536 SkLight(SkFlattenableReadBuffer& buffer) | 541 SkLight(SkFlattenableReadBuffer& buffer) |
537 : INHERITED(buffer) { | 542 : INHERITED(buffer) { |
538 fColor = readPoint3(buffer); | 543 fColor = readPoint3(buffer); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 | 738 |
734 protected: | 739 protected: |
735 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 740 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
736 fLocation = readPoint3(buffer); | 741 fLocation = readPoint3(buffer); |
737 fTarget = readPoint3(buffer); | 742 fTarget = readPoint3(buffer); |
738 fSpecularExponent = buffer.readScalar(); | 743 fSpecularExponent = buffer.readScalar(); |
739 fCosOuterConeAngle = buffer.readScalar(); | 744 fCosOuterConeAngle = buffer.readScalar(); |
740 fCosInnerConeAngle = buffer.readScalar(); | 745 fCosInnerConeAngle = buffer.readScalar(); |
741 fConeScale = buffer.readScalar(); | 746 fConeScale = buffer.readScalar(); |
742 fS = readPoint3(buffer); | 747 fS = readPoint3(buffer); |
| 748 buffer.validate(SkScalarIsFinite(fSpecularExponent) && |
| 749 SkScalarIsFinite(fCosOuterConeAngle) && |
| 750 SkScalarIsFinite(fCosInnerConeAngle) && |
| 751 SkScalarIsFinite(fConeScale)); |
743 } | 752 } |
744 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) | 753 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) |
745 : INHERITED(color), | 754 : INHERITED(color), |
746 fLocation(location), | 755 fLocation(location), |
747 fTarget(target), | 756 fTarget(target), |
748 fSpecularExponent(specularExponent), | 757 fSpecularExponent(specularExponent), |
749 fCosOuterConeAngle(cosOuterConeAngle), | 758 fCosOuterConeAngle(cosOuterConeAngle), |
750 fCosInnerConeAngle(cosInnerConeAngle), | 759 fCosInnerConeAngle(cosInnerConeAngle), |
751 fConeScale(coneScale), | 760 fConeScale(coneScale), |
752 fS(s) | 761 fS(s) |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 const SkPoint3& location, const SkPoint3& target, | 863 const SkPoint3& location, const SkPoint3& target, |
855 SkScalar specularExponent, SkScalar cutoffAngle, | 864 SkScalar specularExponent, SkScalar cutoffAngle, |
856 SkColor lightColor, SkScalar surfaceScale, | 865 SkColor lightColor, SkScalar surfaceScale, |
857 SkScalar ks, SkScalar shininess, SkImageFilter* input, const SkIRect* cropRe
ct) { | 866 SkScalar ks, SkScalar shininess, SkImageFilter* input, const SkIRect* cropRe
ct) { |
858 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 867 return SkNEW_ARGS(SkSpecularLightingImageFilter, |
859 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), | 868 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), |
860 surfaceScale, ks, shininess, input, cropRect)); | 869 surfaceScale, ks, shininess, input, cropRect)); |
861 } | 870 } |
862 | 871 |
863 SkLightingImageFilter::~SkLightingImageFilter() { | 872 SkLightingImageFilter::~SkLightingImageFilter() { |
864 fLight->unref(); | 873 SkSafeUnref(fLight); |
865 } | 874 } |
866 | 875 |
867 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) | 876 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
868 : INHERITED(buffer) | 877 : INHERITED(buffer) |
869 { | 878 { |
870 fLight = buffer.readFlattenableT<SkLight>(); | 879 fLight = buffer.readFlattenableT<SkLight>(); |
871 fSurfaceScale = buffer.readScalar(); | 880 fSurfaceScale = buffer.readScalar(); |
| 881 buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
872 } | 882 } |
873 | 883 |
874 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { | 884 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
875 this->INHERITED::flatten(buffer); | 885 this->INHERITED::flatten(buffer); |
876 buffer.writeFlattenable(fLight); | 886 buffer.writeFlattenable(fLight); |
877 buffer.writeScalar(fSurfaceScale); | 887 buffer.writeScalar(fSurfaceScale); |
878 } | 888 } |
879 | 889 |
880 /////////////////////////////////////////////////////////////////////////////// | 890 /////////////////////////////////////////////////////////////////////////////// |
881 | 891 |
882 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const SkIRect* cropRect = N
ULL) | 892 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const SkIRect* cropRect = N
ULL) |
883 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 893 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
884 fKD(kd) | 894 fKD(kd) |
885 { | 895 { |
886 } | 896 } |
887 | 897 |
888 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) | 898 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) |
889 : INHERITED(buffer) | 899 : INHERITED(buffer) |
890 { | 900 { |
891 fKD = buffer.readScalar(); | 901 fKD = buffer.readScalar(); |
| 902 buffer.validate(SkScalarIsFinite(fKD)); |
892 } | 903 } |
893 | 904 |
894 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { | 905 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { |
895 this->INHERITED::flatten(buffer); | 906 this->INHERITED::flatten(buffer); |
896 buffer.writeScalar(fKD); | 907 buffer.writeScalar(fKD); |
897 } | 908 } |
898 | 909 |
899 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, | 910 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, |
900 const SkBitmap& src, | 911 const SkBitmap& src, |
901 const SkMatrix& ctm, | 912 const SkMatrix& ctm, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 fKS(ks), | 970 fKS(ks), |
960 fShininess(shininess) | 971 fShininess(shininess) |
961 { | 972 { |
962 } | 973 } |
963 | 974 |
964 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) | 975 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) |
965 : INHERITED(buffer) | 976 : INHERITED(buffer) |
966 { | 977 { |
967 fKS = buffer.readScalar(); | 978 fKS = buffer.readScalar(); |
968 fShininess = buffer.readScalar(); | 979 fShininess = buffer.readScalar(); |
| 980 buffer.validate(SkScalarIsFinite(fKS) && |
| 981 SkScalarIsFinite(fShininess)); |
969 } | 982 } |
970 | 983 |
971 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { | 984 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { |
972 this->INHERITED::flatten(buffer); | 985 this->INHERITED::flatten(buffer); |
973 buffer.writeScalar(fKS); | 986 buffer.writeScalar(fKS); |
974 buffer.writeScalar(fShininess); | 987 buffer.writeScalar(fShininess); |
975 } | 988 } |
976 | 989 |
977 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, | 990 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, |
978 const SkBitmap& src, | 991 const SkBitmap& src, |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1559 | 1572 |
1560 #endif | 1573 #endif |
1561 | 1574 |
1562 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1575 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
1563 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1576 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
1564 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1577 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
1565 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) | 1578 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) |
1566 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) | 1579 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) |
1567 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) | 1580 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) |
1568 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1581 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |