1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef DOM_SVG_SVGGRADIENTELEMENT_H_
8 #define DOM_SVG_SVGGRADIENTELEMENT_H_
9 
10 #include "SVGAnimatedEnumeration.h"
11 #include "SVGAnimatedLength.h"
12 #include "SVGAnimatedString.h"
13 #include "SVGAnimatedTransformList.h"
14 #include "mozilla/dom/SVGElement.h"
15 #include "mozilla/UniquePtr.h"
16 
17 nsresult NS_NewSVGLinearGradientElement(
18     nsIContent** aResult, already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
19 nsresult NS_NewSVGRadialGradientElement(
20     nsIContent** aResult, already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
21 
22 namespace mozilla {
23 class SVGGradientFrame;
24 class SVGLinearGradientFrame;
25 class SVGRadialGradientFrame;
26 
27 namespace dom {
28 
29 class DOMSVGAnimatedTransformList;
30 
31 //--------------------- Gradients------------------------
32 
33 using SVGGradientElementBase = SVGElement;
34 
35 class SVGGradientElement : public SVGGradientElementBase {
36   friend class mozilla::SVGGradientFrame;
37 
38  protected:
39   explicit SVGGradientElement(
40       already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
41   virtual JSObject* WrapNode(JSContext* aCx,
42                              JS::Handle<JSObject*> aGivenProto) override = 0;
43 
44  public:
45   virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override = 0;
46 
47   // nsIContent
48   NS_IMETHOD_(bool) IsAttributeMapped(const nsAtom* aAttribute) const override;
49 
50   virtual SVGAnimatedTransformList* GetAnimatedTransformList(
51       uint32_t aFlags = 0) override;
GetTransformListAttrName()52   virtual nsStaticAtom* GetTransformListAttrName() const override {
53     return nsGkAtoms::gradientTransform;
54   }
55 
56   // WebIDL
57   already_AddRefed<DOMSVGAnimatedEnumeration> GradientUnits();
58   already_AddRefed<DOMSVGAnimatedTransformList> GradientTransform();
59   already_AddRefed<DOMSVGAnimatedEnumeration> SpreadMethod();
60   already_AddRefed<DOMSVGAnimatedString> Href();
61 
62  protected:
63   virtual EnumAttributesInfo GetEnumInfo() override;
64   virtual StringAttributesInfo GetStringInfo() override;
65 
66   enum { GRADIENTUNITS, SPREADMETHOD };
67   SVGAnimatedEnumeration mEnumAttributes[2];
68   static SVGEnumMapping sSpreadMethodMap[];
69   static EnumInfo sEnumInfo[2];
70 
71   enum { HREF, XLINK_HREF };
72   SVGAnimatedString mStringAttributes[2];
73   static StringInfo sStringInfo[2];
74 
75   // SVGGradientElement values
76   UniquePtr<SVGAnimatedTransformList> mGradientTransform;
77 };
78 
79 //---------------------Linear Gradients------------------------
80 
81 using SVGLinearGradientElementBase = SVGGradientElement;
82 
83 class SVGLinearGradientElement : public SVGLinearGradientElementBase {
84   friend class mozilla::SVGLinearGradientFrame;
85   friend nsresult(::NS_NewSVGLinearGradientElement(
86       nsIContent** aResult,
87       already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo));
88 
89  protected:
90   explicit SVGLinearGradientElement(
91       already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
92   virtual JSObject* WrapNode(JSContext* aCx,
93                              JS::Handle<JSObject*> aGivenProto) override;
94 
95  public:
96   virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override;
97 
98   // WebIDL
99   already_AddRefed<DOMSVGAnimatedLength> X1();
100   already_AddRefed<DOMSVGAnimatedLength> Y1();
101   already_AddRefed<DOMSVGAnimatedLength> X2();
102   already_AddRefed<DOMSVGAnimatedLength> Y2();
103 
104  protected:
105   virtual LengthAttributesInfo GetLengthInfo() override;
106 
107   enum { ATTR_X1, ATTR_Y1, ATTR_X2, ATTR_Y2 };
108   SVGAnimatedLength mLengthAttributes[4];
109   static LengthInfo sLengthInfo[4];
110 };
111 
112 //-------------------------- Radial Gradients ----------------------------
113 
114 using SVGRadialGradientElementBase = SVGGradientElement;
115 
116 class SVGRadialGradientElement : public SVGRadialGradientElementBase {
117   friend class mozilla::SVGRadialGradientFrame;
118   friend nsresult(::NS_NewSVGRadialGradientElement(
119       nsIContent** aResult,
120       already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo));
121 
122  protected:
123   explicit SVGRadialGradientElement(
124       already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
125   virtual JSObject* WrapNode(JSContext* aCx,
126                              JS::Handle<JSObject*> aGivenProto) override;
127 
128  public:
129   virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override;
130 
131   // WebIDL
132   already_AddRefed<DOMSVGAnimatedLength> Cx();
133   already_AddRefed<DOMSVGAnimatedLength> Cy();
134   already_AddRefed<DOMSVGAnimatedLength> R();
135   already_AddRefed<DOMSVGAnimatedLength> Fx();
136   already_AddRefed<DOMSVGAnimatedLength> Fy();
137   already_AddRefed<DOMSVGAnimatedLength> Fr();
138 
139  protected:
140   virtual LengthAttributesInfo GetLengthInfo() override;
141 
142   enum { ATTR_CX, ATTR_CY, ATTR_R, ATTR_FX, ATTR_FY, ATTR_FR };
143   SVGAnimatedLength mLengthAttributes[6];
144   static LengthInfo sLengthInfo[6];
145 };
146 
147 }  // namespace dom
148 }  // namespace mozilla
149 
150 #endif  // DOM_SVG_SVGGRADIENTELEMENT_H_
151