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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
853 SkImageFilter* SkLightingImageFilter::CreateSpotLitSpecular( | 862 SkImageFilter* SkLightingImageFilter::CreateSpotLitSpecular( |
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 |
| 872 SkFlattenable::Factory SkLightingImageFilter::GetFactory(SkFlattenable::Type typ
e) { |
| 873 switch(type) { |
| 874 case SkFlattenable::kSkDiffuseLightingImageFilter_Type: |
| 875 return SkDiffuseLightingImageFilter::CreateProc; |
| 876 case SkFlattenable::kSkDistantLight_Type: |
| 877 return SkDistantLight::CreateProc; |
| 878 case SkFlattenable::kSkPointLight_Type: |
| 879 return SkPointLight::CreateProc; |
| 880 case SkFlattenable::kSkSpecularLightingImageFilter_Type: |
| 881 return SkSpecularLightingImageFilter::CreateProc; |
| 882 case SkFlattenable::kSkSpotLight_Type: |
| 883 return SkSpotLight::CreateProc; |
| 884 default: |
| 885 break; |
| 886 } |
| 887 return NULL; |
| 888 } |
| 889 |
| 890 SkFlattenable::TypeCheck SkLightingImageFilter::GetTypeCheck(SkFlattenable::Type
type) { |
| 891 switch(type) { |
| 892 case SkFlattenable::kSkDiffuseLightingImageFilter_Type: |
| 893 return SkDiffuseLightingImageFilter::IsA; |
| 894 case SkFlattenable::kSkDistantLight_Type: |
| 895 return SkDistantLight::IsA; |
| 896 case SkFlattenable::kSkPointLight_Type: |
| 897 return SkPointLight::IsA; |
| 898 case SkFlattenable::kSkSpecularLightingImageFilter_Type: |
| 899 return SkSpecularLightingImageFilter::IsA; |
| 900 case SkFlattenable::kSkSpotLight_Type: |
| 901 return SkSpotLight::IsA; |
| 902 default: |
| 903 break; |
| 904 } |
| 905 return NULL; |
| 906 } |
| 907 |
863 SkLightingImageFilter::~SkLightingImageFilter() { | 908 SkLightingImageFilter::~SkLightingImageFilter() { |
864 fLight->unref(); | 909 SkSafeUnref(fLight); |
865 } | 910 } |
866 | 911 |
867 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) | 912 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) |
868 : INHERITED(buffer) | 913 : INHERITED(buffer) |
869 { | 914 { |
870 fLight = buffer.readFlattenableT<SkLight>(); | 915 fLight = buffer.readFlattenableT<SkLight>(); |
871 fSurfaceScale = buffer.readScalar(); | 916 fSurfaceScale = buffer.readScalar(); |
| 917 buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
872 } | 918 } |
873 | 919 |
874 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { | 920 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
875 this->INHERITED::flatten(buffer); | 921 this->INHERITED::flatten(buffer); |
876 buffer.writeFlattenable(fLight); | 922 buffer.writeFlattenable(fLight); |
877 buffer.writeScalar(fSurfaceScale); | 923 buffer.writeScalar(fSurfaceScale); |
878 } | 924 } |
879 | 925 |
880 /////////////////////////////////////////////////////////////////////////////// | 926 /////////////////////////////////////////////////////////////////////////////// |
881 | 927 |
882 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const SkIRect* cropRect = N
ULL) | 928 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const SkIRect* cropRect = N
ULL) |
883 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 929 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
884 fKD(kd) | 930 fKD(kd) |
885 { | 931 { |
886 } | 932 } |
887 | 933 |
888 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) | 934 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) |
889 : INHERITED(buffer) | 935 : INHERITED(buffer) |
890 { | 936 { |
891 fKD = buffer.readScalar(); | 937 fKD = buffer.readScalar(); |
| 938 buffer.validate(SkScalarIsFinite(fKD)); |
892 } | 939 } |
893 | 940 |
894 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { | 941 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { |
895 this->INHERITED::flatten(buffer); | 942 this->INHERITED::flatten(buffer); |
896 buffer.writeScalar(fKD); | 943 buffer.writeScalar(fKD); |
897 } | 944 } |
898 | 945 |
899 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, | 946 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy*, |
900 const SkBitmap& src, | 947 const SkBitmap& src, |
901 const SkMatrix& ctm, | 948 const SkMatrix& ctm, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 fKS(ks), | 1006 fKS(ks), |
960 fShininess(shininess) | 1007 fShininess(shininess) |
961 { | 1008 { |
962 } | 1009 } |
963 | 1010 |
964 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) | 1011 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) |
965 : INHERITED(buffer) | 1012 : INHERITED(buffer) |
966 { | 1013 { |
967 fKS = buffer.readScalar(); | 1014 fKS = buffer.readScalar(); |
968 fShininess = buffer.readScalar(); | 1015 fShininess = buffer.readScalar(); |
| 1016 buffer.validate(SkScalarIsFinite(fKS) && |
| 1017 SkScalarIsFinite(fShininess)); |
969 } | 1018 } |
970 | 1019 |
971 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { | 1020 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { |
972 this->INHERITED::flatten(buffer); | 1021 this->INHERITED::flatten(buffer); |
973 buffer.writeScalar(fKS); | 1022 buffer.writeScalar(fKS); |
974 buffer.writeScalar(fShininess); | 1023 buffer.writeScalar(fShininess); |
975 } | 1024 } |
976 | 1025 |
977 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, | 1026 bool SkSpecularLightingImageFilter::onFilterImage(Proxy*, |
978 const SkBitmap& src, | 1027 const SkBitmap& src, |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1559 | 1608 |
1560 #endif | 1609 #endif |
1561 | 1610 |
1562 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1611 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
1563 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1612 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
1564 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1613 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
1565 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) | 1614 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) |
1566 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) | 1615 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) |
1567 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) | 1616 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) |
1568 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1617 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |