1 /* 2 * Copyright 2021 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkSVGFeLightSource_DEFINED 9 #define SkSVGFeLightSource_DEFINED 10 11 #include "include/core/SkPoint3.h" 12 #include "include/core/SkRefCnt.h" 13 #include "include/private/base/SkAPI.h" 14 #include "include/private/base/SkDebug.h" 15 #include "modules/svg/include/SkSVGHiddenContainer.h" 16 #include "modules/svg/include/SkSVGNode.h" 17 #include "modules/svg/include/SkSVGTypes.h" 18 #include "src/base/SkTLazy.h" 19 20 class SK_API SkSVGFeLightSource : public SkSVGHiddenContainer { 21 public: appendChild(sk_sp<SkSVGNode>)22 void appendChild(sk_sp<SkSVGNode>) final { 23 SkDEBUGF("cannot append child nodes to an SVG light source.\n"); 24 } 25 26 protected: SkSVGFeLightSource(SkSVGTag tag)27 explicit SkSVGFeLightSource(SkSVGTag tag) : INHERITED(tag) {} 28 29 private: 30 using INHERITED = SkSVGHiddenContainer; 31 }; 32 33 class SkSVGFeDistantLight final : public SkSVGFeLightSource { 34 public: Make()35 static sk_sp<SkSVGFeDistantLight> Make() { 36 return sk_sp<SkSVGFeDistantLight>(new SkSVGFeDistantLight()); 37 } 38 39 SkPoint3 computeDirection() const; 40 41 SVG_ATTR(Azimuth , SkSVGNumberType, 0) 42 SVG_ATTR(Elevation, SkSVGNumberType, 0) 43 44 private: SkSVGFeDistantLight()45 SkSVGFeDistantLight() : INHERITED(SkSVGTag::kFeDistantLight) {} 46 47 bool parseAndSetAttribute(const char*, const char*) override; 48 49 using INHERITED = SkSVGFeLightSource; 50 }; 51 52 class SkSVGFePointLight final : public SkSVGFeLightSource { 53 public: Make()54 static sk_sp<SkSVGFePointLight> Make() { 55 return sk_sp<SkSVGFePointLight>(new SkSVGFePointLight()); 56 } 57 58 SVG_ATTR(X, SkSVGNumberType, 0) 59 SVG_ATTR(Y, SkSVGNumberType, 0) 60 SVG_ATTR(Z, SkSVGNumberType, 0) 61 62 private: SkSVGFePointLight()63 SkSVGFePointLight() : INHERITED(SkSVGTag::kFePointLight) {} 64 65 bool parseAndSetAttribute(const char*, const char*) override; 66 67 using INHERITED = SkSVGFeLightSource; 68 }; 69 70 class SkSVGFeSpotLight final : public SkSVGFeLightSource { 71 public: Make()72 static sk_sp<SkSVGFeSpotLight> Make() { 73 return sk_sp<SkSVGFeSpotLight>(new SkSVGFeSpotLight()); 74 } 75 76 SVG_ATTR(X , SkSVGNumberType, 0) 77 SVG_ATTR(Y , SkSVGNumberType, 0) 78 SVG_ATTR(Z , SkSVGNumberType, 0) 79 SVG_ATTR(PointsAtX , SkSVGNumberType, 0) 80 SVG_ATTR(PointsAtY , SkSVGNumberType, 0) 81 SVG_ATTR(PointsAtZ , SkSVGNumberType, 0) 82 SVG_ATTR(SpecularExponent, SkSVGNumberType, 1) 83 SVG_OPTIONAL_ATTR(LimitingConeAngle,SkSVGNumberType)84 SVG_OPTIONAL_ATTR(LimitingConeAngle, SkSVGNumberType) 85 86 private: 87 SkSVGFeSpotLight() : INHERITED(SkSVGTag::kFeSpotLight) {} 88 89 bool parseAndSetAttribute(const char*, const char*) override; 90 91 using INHERITED = SkSVGFeLightSource; 92 }; 93 94 #endif // SkSVGFeLightSource_DEFINED 95