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