Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

Issue 1417463006: Revert of Update feSpotLight to match spec (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gm/lighting.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 class GrGLLight; 676 class GrGLLight;
677 677
678 #endif 678 #endif
679 679
680 }; 680 };
681 681
682 /////////////////////////////////////////////////////////////////////////////// 682 ///////////////////////////////////////////////////////////////////////////////
683 683
684 class SkImageFilterLight : public SkRefCnt { 684 class SkImageFilterLight : public SkRefCnt {
685 public: 685 public:
686 686
687 687
688 enum LightType { 688 enum LightType {
689 kDistant_LightType, 689 kDistant_LightType,
690 kPoint_LightType, 690 kPoint_LightType,
691 kSpot_LightType, 691 kSpot_LightType,
692 }; 692 };
693 virtual LightType type() const = 0; 693 virtual LightType type() const = 0;
694 const SkPoint3& color() const { return fColor; } 694 const SkPoint3& color() const { return fColor; }
695 virtual GrGLLight* createGLLight() const = 0; 695 virtual GrGLLight* createGLLight() const = 0;
696 virtual bool isEqual(const SkImageFilterLight& other) const { 696 virtual bool isEqual(const SkImageFilterLight& other) const {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 const SkPointLight& o = static_cast<const SkPointLight&>(other); 813 const SkPointLight& o = static_cast<const SkPointLight&>(other);
814 return INHERITED::isEqual(other) && 814 return INHERITED::isEqual(other) &&
815 fLocation == o.fLocation; 815 fLocation == o.fLocation;
816 } 816 }
817 SkImageFilterLight* transform(const SkMatrix& matrix) const override { 817 SkImageFilterLight* transform(const SkMatrix& matrix) const override {
818 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); 818 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY);
819 matrix.mapPoints(&location2, 1); 819 matrix.mapPoints(&location2, 1);
820 // Use X scale and Y scale on Z and average the result 820 // Use X scale and Y scale on Z and average the result
821 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); 821 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ);
822 matrix.mapVectors(&locationZ, 1); 822 matrix.mapVectors(&locationZ, 1);
823 SkPoint3 location = SkPoint3::Make(location2.fX, 823 SkPoint3 location = SkPoint3::Make(location2.fX,
824 location2.fY, 824 location2.fY,
825 SkScalarAve(locationZ.fX, locationZ.f Y)); 825 SkScalarAve(locationZ.fX, locationZ.f Y));
826 return new SkPointLight(location, color()); 826 return new SkPointLight(location, color());
827 } 827 }
828 828
829 SkPointLight(SkReadBuffer& buffer) : INHERITED(buffer) { 829 SkPointLight(SkReadBuffer& buffer) : INHERITED(buffer) {
830 fLocation = readPoint3(buffer); 830 fLocation = readPoint3(buffer);
831 } 831 }
832 832
833 protected: 833 protected:
834 SkPointLight(const SkPoint3& location, const SkPoint3& color) 834 SkPointLight(const SkPoint3& location, const SkPoint3& color)
(...skipping 13 matching lines...) Expand all
848 class SkSpotLight : public SkImageFilterLight { 848 class SkSpotLight : public SkImageFilterLight {
849 public: 849 public:
850 SkSpotLight(const SkPoint3& location, 850 SkSpotLight(const SkPoint3& location,
851 const SkPoint3& target, 851 const SkPoint3& target,
852 SkScalar specularExponent, 852 SkScalar specularExponent,
853 SkScalar cutoffAngle, 853 SkScalar cutoffAngle,
854 SkColor color) 854 SkColor color)
855 : INHERITED(color), 855 : INHERITED(color),
856 fLocation(location), 856 fLocation(location),
857 fTarget(target), 857 fTarget(target),
858 fSpecularExponent(specularExponent) 858 fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp ecularExponentMax))
859 { 859 {
860 fS = target - location; 860 fS = target - location;
861 fast_normalize(&fS); 861 fast_normalize(&fS);
862 fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); 862 fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle));
863 const SkScalar antiAliasThreshold = 0.016f; 863 const SkScalar antiAliasThreshold = 0.016f;
864 fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; 864 fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold;
865 fConeScale = SkScalarInvert(antiAliasThreshold); 865 fConeScale = SkScalarInvert(antiAliasThreshold);
866 } 866 }
867 867
868 SkImageFilterLight* transform(const SkMatrix& matrix) const override { 868 SkImageFilterLight* transform(const SkMatrix& matrix) const override {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 978
979 const SkSpotLight& o = static_cast<const SkSpotLight&>(other); 979 const SkSpotLight& o = static_cast<const SkSpotLight&>(other);
980 return INHERITED::isEqual(other) && 980 return INHERITED::isEqual(other) &&
981 fLocation == o.fLocation && 981 fLocation == o.fLocation &&
982 fTarget == o.fTarget && 982 fTarget == o.fTarget &&
983 fSpecularExponent == o.fSpecularExponent && 983 fSpecularExponent == o.fSpecularExponent &&
984 fCosOuterConeAngle == o.fCosOuterConeAngle; 984 fCosOuterConeAngle == o.fCosOuterConeAngle;
985 } 985 }
986 986
987 private: 987 private:
988 static const SkScalar kSpecularExponentMin;
989 static const SkScalar kSpecularExponentMax;
990
988 SkPoint3 fLocation; 991 SkPoint3 fLocation;
989 SkPoint3 fTarget; 992 SkPoint3 fTarget;
990 SkScalar fSpecularExponent; 993 SkScalar fSpecularExponent;
991 SkScalar fCosOuterConeAngle; 994 SkScalar fCosOuterConeAngle;
992 SkScalar fCosInnerConeAngle; 995 SkScalar fCosInnerConeAngle;
993 SkScalar fConeScale; 996 SkScalar fConeScale;
994 SkPoint3 fS; 997 SkPoint3 fS;
995 998
996 typedef SkImageFilterLight INHERITED; 999 typedef SkImageFilterLight INHERITED;
997 }; 1000 };
998 1001
1002 // According to the spec, the specular term should be in the range [1, 128] :
1003 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingSpecularExponentAttri bute
1004 const SkScalar SkSpotLight::kSpecularExponentMin = 1.0f;
1005 const SkScalar SkSpotLight::kSpecularExponentMax = 128.0f;
1006
999 /////////////////////////////////////////////////////////////////////////////// 1007 ///////////////////////////////////////////////////////////////////////////////
1000 1008
1001 void SkImageFilterLight::flattenLight(SkWriteBuffer& buffer) const { 1009 void SkImageFilterLight::flattenLight(SkWriteBuffer& buffer) const {
1002 // Write type first, then baseclass, then subclass. 1010 // Write type first, then baseclass, then subclass.
1003 buffer.writeInt(this->type()); 1011 buffer.writeInt(this->type());
1004 writePoint3(fColor, buffer); 1012 writePoint3(fColor, buffer);
1005 this->onFlattenLight(buffer); 1013 this->onFlattenLight(buffer);
1006 } 1014 }
1007 1015
1008 /*static*/ SkImageFilterLight* SkImageFilterLight::UnflattenLight(SkReadBuffer& buffer) { 1016 /*static*/ SkImageFilterLight* SkImageFilterLight::UnflattenLight(SkReadBuffer& buffer) {
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after
1981 SkString lightColorBody; 1989 SkString lightColorBody;
1982 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); 1990 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s);
1983 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); 1991 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter);
1984 lightColorBody.appendf("\t\treturn vec3(0);\n"); 1992 lightColorBody.appendf("\t\treturn vec3(0);\n");
1985 lightColorBody.appendf("\t}\n"); 1993 lightColorBody.appendf("\t}\n");
1986 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); 1994 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent);
1987 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner); 1995 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner);
1988 lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", 1996 lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n",
1989 color, cosOuter, coneScale); 1997 color, cosOuter, coneScale);
1990 lightColorBody.appendf("\t}\n"); 1998 lightColorBody.appendf("\t}\n");
1991 lightColorBody.appendf("\treturn %s * scale;\n", color); 1999 lightColorBody.appendf("\treturn %s;\n", color);
1992 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 2000 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder();
1993 fsBuilder->emitFunction(kVec3f_GrSLType, 2001 fsBuilder->emitFunction(kVec3f_GrSLType,
1994 "lightColor", 2002 "lightColor",
1995 SK_ARRAY_COUNT(gLightColorArgs), 2003 SK_ARRAY_COUNT(gLightColorArgs),
1996 gLightColorArgs, 2004 gLightColorArgs,
1997 lightColorBody.c_str(), 2005 lightColorBody.c_str(),
1998 &fLightColorFunc); 2006 &fLightColorFunc);
1999 2007
2000 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); 2008 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight);
2001 } 2009 }
2002 2010
2003 #endif 2011 #endif
2004 2012
2005 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) 2013 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
2006 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) 2014 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
2007 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) 2015 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
2008 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 2016 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « gm/lighting.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698