Chromium Code Reviews| 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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 }; | 257 }; |
| 258 | 258 |
| 259 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { | 259 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { |
| 260 buffer.writeScalar(point.fX); | 260 buffer.writeScalar(point.fX); |
| 261 buffer.writeScalar(point.fY); | 261 buffer.writeScalar(point.fY); |
| 262 buffer.writeScalar(point.fZ); | 262 buffer.writeScalar(point.fZ); |
| 263 }; | 263 }; |
| 264 | 264 |
| 265 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { | 265 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { |
| 266 public: | 266 public: |
| 267 SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, | 267 static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, SkScalar kd, SkImageFilter*, |
| 268 SkScalar kd, SkImageFilter* input, const CropRe ct* cropRect); | 268 const CropRect*); |
| 269 | |
| 269 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi lter) | 270 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi lter) |
| 270 SkScalar kd() const { return fKD; } | 271 SkScalar kd() const { return fKD; } |
| 271 | 272 |
| 272 protected: | 273 protected: |
| 274 SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, | |
| 275 SkScalar kd, SkImageFilter* input, const CropRe ct* cropRect); | |
| 276 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING | |
| 273 explicit SkDiffuseLightingImageFilter(SkReadBuffer& buffer); | 277 explicit SkDiffuseLightingImageFilter(SkReadBuffer& buffer); |
| 278 #endif | |
| 274 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; | 279 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; |
| 275 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 280 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
| 276 SkBitmap* result, SkIPoint* offset) const SK_OVER RIDE; | 281 SkBitmap* result, SkIPoint* offset) const SK_OVER RIDE; |
| 277 #if SK_SUPPORT_GPU | 282 #if SK_SUPPORT_GPU |
| 278 virtual bool asNewEffect(GrEffect** effect, GrTexture*, const SkMatrix& matr ix, | 283 virtual bool asNewEffect(GrEffect** effect, GrTexture*, const SkMatrix& matr ix, |
| 279 const SkIRect& bounds) const SK_OVERRIDE; | 284 const SkIRect& bounds) const SK_OVERRIDE; |
| 280 #endif | 285 #endif |
| 281 | 286 |
| 282 private: | 287 private: |
| 283 typedef SkLightingImageFilter INHERITED; | 288 typedef SkLightingImageFilter INHERITED; |
| 284 SkScalar fKD; | 289 SkScalar fKD; |
| 285 }; | 290 }; |
| 286 | 291 |
| 287 class SkSpecularLightingImageFilter : public SkLightingImageFilter { | 292 class SkSpecularLightingImageFilter : public SkLightingImageFilter { |
| 288 public: | 293 public: |
| 289 SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala r ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropRect); | 294 static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, |
| 295 SkScalar ks, SkScalar shininess, SkImageFilter* , const CropRect*); | |
| 296 | |
| 290 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF ilter) | 297 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF ilter) |
| 291 | 298 |
| 292 SkScalar ks() const { return fKS; } | 299 SkScalar ks() const { return fKS; } |
| 293 SkScalar shininess() const { return fShininess; } | 300 SkScalar shininess() const { return fShininess; } |
| 294 | 301 |
| 295 protected: | 302 protected: |
| 303 SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala r ks, | |
| 304 SkScalar shininess, SkImageFilter* input, cons t CropRect*); | |
| 305 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING | |
| 296 explicit SkSpecularLightingImageFilter(SkReadBuffer& buffer); | 306 explicit SkSpecularLightingImageFilter(SkReadBuffer& buffer); |
| 307 #endif | |
| 297 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; | 308 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; |
| 298 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 309 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
| 299 SkBitmap* result, SkIPoint* offset) const SK_OVER RIDE; | 310 SkBitmap* result, SkIPoint* offset) const SK_OVER RIDE; |
| 300 #if SK_SUPPORT_GPU | 311 #if SK_SUPPORT_GPU |
| 301 virtual bool asNewEffect(GrEffect** effect, GrTexture*, const SkMatrix& matr ix, | 312 virtual bool asNewEffect(GrEffect** effect, GrTexture*, const SkMatrix& matr ix, |
| 302 const SkIRect& bounds) const SK_OVERRIDE; | 313 const SkIRect& bounds) const SK_OVERRIDE; |
| 303 #endif | 314 #endif |
| 304 | 315 |
| 305 private: | 316 private: |
| 306 typedef SkLightingImageFilter INHERITED; | 317 typedef SkLightingImageFilter INHERITED; |
| (...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 826 SkDEBUGFAIL("Unknown LightType."); | 837 SkDEBUGFAIL("Unknown LightType."); |
| 827 buffer.validate(false); | 838 buffer.validate(false); |
| 828 return NULL; | 839 return NULL; |
| 829 } | 840 } |
| 830 } | 841 } |
| 831 /////////////////////////////////////////////////////////////////////////////// | 842 /////////////////////////////////////////////////////////////////////////////// |
| 832 | 843 |
| 833 SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceSca le, | 844 SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceSca le, |
| 834 SkImageFilter* input, const CropRec t* cropRect) | 845 SkImageFilter* input, const CropRec t* cropRect) |
| 835 : INHERITED(1, &input, cropRect), | 846 : INHERITED(1, &input, cropRect), |
| 836 fLight(light), | 847 fLight(SkRef(light)), |
| 837 fSurfaceScale(SkScalarDiv(surfaceScale, SkIntToScalar(255))) | 848 fSurfaceScale(surfaceScale / 255) |
| 838 { | 849 { |
| 839 SkASSERT(fLight); | 850 SkASSERT(fLight); |
| 840 // our caller knows that we take ownership of the light, so we don't | 851 // our caller knows that we take ownership of the light, so we don't |
|
Stephen White
2014/08/18 18:17:26
I think this comment should now be removed, since
reed1
2014/08/18 22:39:16
Done.
| |
| 841 // need to call ref() here. | 852 // need to call ref() here. |
| 842 } | 853 } |
| 843 | 854 |
| 844 SkImageFilter* SkLightingImageFilter::CreateDistantLitDiffuse( | 855 SkImageFilter* SkLightingImageFilter::CreateDistantLitDiffuse(const SkPoint3& di rection, |
| 845 const SkPoint3& direction, SkColor lightColor, SkScalar surfaceScale, | 856 SkColor lightColor , |
| 846 SkScalar kd, SkImageFilter* input, const CropRect* cropRect) { | 857 SkScalar surfaceSc ale, |
| 847 return SkNEW_ARGS(SkDiffuseLightingImageFilter, | 858 SkScalar kd, |
| 848 (SkNEW_ARGS(SkDistantLight, (direction, lightColor)), surfaceScale, kd, | 859 SkImageFilter* inp ut, |
| 849 input, cropRect)); | 860 const CropRect* cr opRect) { |
| 861 SkAutoTUnref<SkLight> light(SkNEW_ARGS(SkDistantLight, (direction, lightColo r))); | |
| 862 return SkDiffuseLightingImageFilter::Create(light, surfaceScale, kd, input, cropRect); | |
| 850 } | 863 } |
| 851 | 864 |
| 852 SkImageFilter* SkLightingImageFilter::CreatePointLitDiffuse( | 865 SkImageFilter* SkLightingImageFilter::CreatePointLitDiffuse(const SkPoint3& loca tion, |
| 853 const SkPoint3& location, SkColor lightColor, SkScalar surfaceScale, | 866 SkColor lightColor, |
| 854 SkScalar kd, SkImageFilter* input, const CropRect* cropRect) { | 867 SkScalar surfaceScal e, |
| 855 return SkNEW_ARGS(SkDiffuseLightingImageFilter, | 868 SkScalar kd, |
| 856 (SkNEW_ARGS(SkPointLight, (location, lightColor)), surfaceScale, kd, | 869 SkImageFilter* input , |
| 857 input, cropRect)); | 870 const CropRect* crop Rect) { |
| 871 SkAutoTUnref<SkLight> light(SkNEW_ARGS(SkPointLight, (location, lightColor)) ); | |
| 872 return SkDiffuseLightingImageFilter::Create(light, surfaceScale, kd, input, cropRect); | |
| 858 } | 873 } |
| 859 | 874 |
| 860 SkImageFilter* SkLightingImageFilter::CreateSpotLitDiffuse( | 875 SkImageFilter* SkLightingImageFilter::CreateSpotLitDiffuse(const SkPoint3& locat ion, |
| 861 const SkPoint3& location, const SkPoint3& target, | 876 const SkPoint3& targe t, |
| 862 SkScalar specularExponent, SkScalar cutoffAngle, | 877 SkScalar specularExpo nent, |
| 863 SkColor lightColor, SkScalar surfaceScale, SkScalar kd, | 878 SkScalar cutoffAngle, |
| 864 SkImageFilter* input, const CropRect* cropRect) { | 879 SkColor lightColor, |
| 865 return SkNEW_ARGS(SkDiffuseLightingImageFilter, | 880 SkScalar surfaceScale , |
| 866 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, | 881 SkScalar kd, |
| 867 cutoffAngle, lightColor)), | 882 SkImageFilter* input, |
| 868 surfaceScale, kd, input, cropRect)); | 883 const CropRect* cropR ect) { |
| 884 SkAutoTUnref<SkLight> light(SkNEW_ARGS(SkSpotLight, (location, target, specu larExponent, | |
| 885 cutoffAngle, lightColor ))); | |
| 886 return SkDiffuseLightingImageFilter::Create(light, surfaceScale, kd, input, cropRect); | |
| 869 } | 887 } |
| 870 | 888 |
| 871 SkImageFilter* SkLightingImageFilter::CreateDistantLitSpecular( | 889 SkImageFilter* SkLightingImageFilter::CreateDistantLitSpecular(const SkPoint3& d irection, |
| 872 const SkPoint3& direction, SkColor lightColor, SkScalar surfaceScale, | 890 SkColor lightColo r, |
| 873 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR ect) { | 891 SkScalar surfaceS cale, |
| 874 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 892 SkScalar ks, |
| 875 (SkNEW_ARGS(SkDistantLight, (direction, lightColor)), | 893 SkScalar shine, |
| 876 surfaceScale, ks, shininess, input, cropRect)); | 894 SkImageFilter* in put, |
| 895 const CropRect* c ropRect) { | |
| 896 SkAutoTUnref<SkLight> light(SkNEW_ARGS(SkDistantLight, (direction, lightColo r))); | |
| 897 return SkSpecularLightingImageFilter::Create(light, surfaceScale, ks, shine, input, cropRect); | |
| 877 } | 898 } |
| 878 | 899 |
| 879 SkImageFilter* SkLightingImageFilter::CreatePointLitSpecular( | 900 SkImageFilter* SkLightingImageFilter::CreatePointLitSpecular(const SkPoint3& loc ation, |
| 880 const SkPoint3& location, SkColor lightColor, SkScalar surfaceScale, | 901 SkColor lightColor, |
| 881 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR ect) { | 902 SkScalar surfaceSca le, |
| 882 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 903 SkScalar ks, |
| 883 (SkNEW_ARGS(SkPointLight, (location, lightColor)), | 904 SkScalar shine, |
| 884 surfaceScale, ks, shininess, input, cropRect)); | 905 SkImageFilter* inpu t, |
| 906 const CropRect* cro pRect) { | |
| 907 SkAutoTUnref<SkLight> light(SkNEW_ARGS(SkPointLight, (location, lightColor)) ); | |
| 908 return SkSpecularLightingImageFilter::Create(light, surfaceScale, ks, shine, input, cropRect); | |
| 885 } | 909 } |
| 886 | 910 |
| 887 SkImageFilter* SkLightingImageFilter::CreateSpotLitSpecular( | 911 SkImageFilter* SkLightingImageFilter::CreateSpotLitSpecular(const SkPoint3& loca tion, |
| 888 const SkPoint3& location, const SkPoint3& target, | 912 const SkPoint3& targ et, |
| 889 SkScalar specularExponent, SkScalar cutoffAngle, | 913 SkScalar specularExp onent, |
| 890 SkColor lightColor, SkScalar surfaceScale, | 914 SkScalar cutoffAngle , |
| 891 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR ect) { | 915 SkColor lightColor, |
| 892 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 916 SkScalar surfaceScal e, |
| 893 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl e, lightColor)), | 917 SkScalar ks, |
| 894 surfaceScale, ks, shininess, input, cropRect)); | 918 SkScalar shine, |
| 919 SkImageFilter* input , | |
| 920 const CropRect* crop Rect) { | |
| 921 SkAutoTUnref<SkLight> light(SkNEW_ARGS(SkSpotLight, (location, target, specu larExponent, | |
| 922 cutoffAngle, lightColor ))); | |
| 923 return SkSpecularLightingImageFilter::Create(light, surfaceScale, ks, shine, input, cropRect); | |
| 895 } | 924 } |
| 896 | 925 |
| 897 SkLightingImageFilter::~SkLightingImageFilter() { | 926 SkLightingImageFilter::~SkLightingImageFilter() {} |
| 898 SkSafeUnref(fLight); | |
| 899 } | |
| 900 | 927 |
| 928 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING | |
| 901 SkLightingImageFilter::SkLightingImageFilter(SkReadBuffer& buffer) | 929 SkLightingImageFilter::SkLightingImageFilter(SkReadBuffer& buffer) |
| 902 : INHERITED(1, buffer) { | 930 : INHERITED(1, buffer) { |
| 903 fLight = SkLight::UnflattenLight(buffer); | 931 fLight.reset(SkLight::UnflattenLight(buffer)); |
| 904 fSurfaceScale = buffer.readScalar(); | 932 fSurfaceScale = buffer.readScalar(); |
| 905 buffer.validate(SkScalarIsFinite(fSurfaceScale)); | 933 buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
| 906 } | 934 } |
| 935 #endif | |
| 907 | 936 |
| 908 void SkLightingImageFilter::flatten(SkWriteBuffer& buffer) const { | 937 void SkLightingImageFilter::flatten(SkWriteBuffer& buffer) const { |
| 909 this->INHERITED::flatten(buffer); | 938 this->INHERITED::flatten(buffer); |
| 910 fLight->flattenLight(buffer); | 939 fLight->flattenLight(buffer); |
| 911 buffer.writeScalar(fSurfaceScale); | 940 buffer.writeScalar(fSurfaceScale * 255); |
| 912 } | 941 } |
| 913 | 942 |
| 914 /////////////////////////////////////////////////////////////////////////////// | 943 /////////////////////////////////////////////////////////////////////////////// |
| 915 | 944 |
| 945 SkImageFilter* SkDiffuseLightingImageFilter::Create(SkLight* light, SkScalar sur faceScale, | |
| 946 SkScalar kd, SkImageFilter* input, const Cro pRect* cropRect) { | |
| 947 if (NULL == light) { | |
| 948 return NULL; | |
| 949 } | |
| 950 if (!SkScalarIsFinite(surfaceScale) || !SkScalarIsFinite(kd)) { | |
| 951 return NULL; | |
| 952 } | |
| 953 // According to the spec, kd can be any non-negative number : | |
| 954 // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement | |
| 955 if (kd < 0) { | |
| 956 return NULL; | |
| 957 } | |
| 958 return SkNEW_ARGS(SkDiffuseLightingImageFilter, (light, surfaceScale, kd, in put, cropRect)); | |
| 959 } | |
| 960 | |
| 916 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect = NULL) | 961 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect = NULL) |
| 917 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 962 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
| 918 // According to the spec, kd can be any non-negative number : | 963 fKD(kd) |
| 919 // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement | |
| 920 fKD(kd < 0 ? 0 : kd) | |
| 921 { | 964 { |
| 922 } | 965 } |
| 923 | 966 |
| 967 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING | |
| 924 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkReadBuffer& buffer) | 968 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkReadBuffer& buffer) |
| 925 : INHERITED(buffer) | 969 : INHERITED(buffer) |
| 926 { | 970 { |
| 927 fKD = buffer.readScalar(); | 971 fKD = buffer.readScalar(); |
| 928 buffer.validate(SkScalarIsFinite(fKD) && (fKD >= 0)); | 972 buffer.validate(SkScalarIsFinite(fKD) && (fKD >= 0)); |
| 929 } | 973 } |
| 974 #endif | |
| 975 | |
| 976 SkFlattenable* SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buffer) { | |
| 977 SK_IMAGEFILTER_UNFLATTEN_COMMON(1); | |
| 978 SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); | |
| 979 SkScalar surfaceScale = buffer.readScalar(); | |
| 980 SkScalar kd = buffer.readScalar(); | |
| 981 return Create(light, surfaceScale, kd, common.inputAt(0), &common.cropRect() ); | |
| 982 } | |
| 930 | 983 |
| 931 void SkDiffuseLightingImageFilter::flatten(SkWriteBuffer& buffer) const { | 984 void SkDiffuseLightingImageFilter::flatten(SkWriteBuffer& buffer) const { |
| 932 this->INHERITED::flatten(buffer); | 985 this->INHERITED::flatten(buffer); |
| 933 buffer.writeScalar(fKD); | 986 buffer.writeScalar(fKD); |
| 934 } | 987 } |
| 935 | 988 |
| 936 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy* proxy, | 989 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy* proxy, |
| 937 const SkBitmap& source, | 990 const SkBitmap& source, |
| 938 const Context& ctx, | 991 const Context& ctx, |
| 939 SkBitmap* dst, | 992 SkBitmap* dst, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 993 if (effect) { | 1046 if (effect) { |
| 994 SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); | 1047 SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); |
| 995 *effect = GrDiffuseLightingEffect::Create(texture, light(), scale, matri x, kd()); | 1048 *effect = GrDiffuseLightingEffect::Create(texture, light(), scale, matri x, kd()); |
| 996 } | 1049 } |
| 997 return true; | 1050 return true; |
| 998 } | 1051 } |
| 999 #endif | 1052 #endif |
| 1000 | 1053 |
| 1001 /////////////////////////////////////////////////////////////////////////////// | 1054 /////////////////////////////////////////////////////////////////////////////// |
| 1002 | 1055 |
| 1056 SkImageFilter* SkSpecularLightingImageFilter::Create(SkLight* light, SkScalar su rfaceScale, | |
| 1057 SkScalar ks, SkScalar shininess, SkImageFilter* input, const Cro pRect* cropRect) { | |
| 1058 if (NULL == light) { | |
| 1059 return NULL; | |
| 1060 } | |
| 1061 if (!SkScalarIsFinite(surfaceScale) || !SkScalarIsFinite(ks) || !SkScalarIsF inite(shininess)) { | |
| 1062 return NULL; | |
| 1063 } | |
| 1064 // According to the spec, ks can be any non-negative number : | |
| 1065 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement | |
| 1066 if (ks < 0) { | |
| 1067 return NULL; | |
| 1068 } | |
| 1069 return SkNEW_ARGS(SkSpecularLightingImageFilter, | |
| 1070 (light, surfaceScale, ks, shininess, input, cropRect)); | |
| 1071 } | |
| 1072 | |
| 1003 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, SkS calar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropRect) | 1073 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, SkS calar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropRect) |
| 1004 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 1074 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
| 1005 // According to the spec, ks can be any non-negative number : | 1075 fKS(ks), |
| 1006 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement | |
| 1007 fKS(ks < 0 ? 0 : ks), | |
| 1008 fShininess(shininess) | 1076 fShininess(shininess) |
| 1009 { | 1077 { |
| 1010 } | 1078 } |
| 1011 | 1079 |
| 1012 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkReadBuffer& buffe r) | 1080 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING |
| 1081 kSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkReadBuffer& buffer ) | |
| 1013 : INHERITED(buffer) | 1082 : INHERITED(buffer) |
| 1014 { | 1083 { |
| 1015 fKS = buffer.readScalar(); | 1084 fKS = buffer.readScalar(); |
| 1016 fShininess = buffer.readScalar(); | 1085 fShininess = buffer.readScalar(); |
| 1017 buffer.validate(SkScalarIsFinite(fKS) && (fKS >= 0) && | 1086 buffer.validate(SkScalarIsFinite(fKS) && (fKS >= 0) && |
| 1018 SkScalarIsFinite(fShininess)); | 1087 SkScalarIsFinite(fShininess)); |
| 1019 } | 1088 } |
| 1089 #endif | |
| 1090 | |
| 1091 SkFlattenable* SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buffer) { | |
| 1092 SK_IMAGEFILTER_UNFLATTEN_COMMON(1); | |
| 1093 SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); | |
| 1094 SkScalar surfaceScale = buffer.readScalar(); | |
| 1095 SkScalar ks = buffer.readScalar(); | |
| 1096 SkScalar shine = buffer.readScalar(); | |
| 1097 return Create(light, surfaceScale, ks, shine, common.inputAt(0), &common.cro pRect()); | |
| 1098 } | |
| 1020 | 1099 |
| 1021 void SkSpecularLightingImageFilter::flatten(SkWriteBuffer& buffer) const { | 1100 void SkSpecularLightingImageFilter::flatten(SkWriteBuffer& buffer) const { |
| 1022 this->INHERITED::flatten(buffer); | 1101 this->INHERITED::flatten(buffer); |
| 1023 buffer.writeScalar(fKS); | 1102 buffer.writeScalar(fKS); |
| 1024 buffer.writeScalar(fShininess); | 1103 buffer.writeScalar(fShininess); |
| 1025 } | 1104 } |
| 1026 | 1105 |
| 1027 bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy, | 1106 bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy, |
| 1028 const SkBitmap& source, | 1107 const SkBitmap& source, |
| 1029 const Context& ctx, | 1108 const Context& ctx, |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1616 | 1695 |
| 1617 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1696 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 1618 } | 1697 } |
| 1619 | 1698 |
| 1620 #endif | 1699 #endif |
| 1621 | 1700 |
| 1622 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1701 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1623 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1702 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1624 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1703 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1625 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1704 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |