xref: /aosp_15_r20/external/skia/modules/svg/include/SkSVGFeLightSource.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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