Line data Source code
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 : #include "mozilla/dom/SVGGradientElement.h"
8 :
9 : #include "mozilla/ArrayUtils.h"
10 : #include "mozilla/dom/SVGAnimatedTransformList.h"
11 : #include "mozilla/dom/SVGRadialGradientElementBinding.h"
12 : #include "mozilla/dom/SVGLinearGradientElementBinding.h"
13 : #include "nsCOMPtr.h"
14 : #include "nsGkAtoms.h"
15 : #include "nsSVGElement.h"
16 :
17 0 : NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(LinearGradient)
18 0 : NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(RadialGradient)
19 :
20 : namespace mozilla {
21 : namespace dom {
22 :
23 : //--------------------- Gradients------------------------
24 :
25 : nsSVGEnumMapping SVGGradientElement::sSpreadMethodMap[] = {
26 : {&nsGkAtoms::pad, SVG_SPREADMETHOD_PAD},
27 : {&nsGkAtoms::reflect, SVG_SPREADMETHOD_REFLECT},
28 : {&nsGkAtoms::repeat, SVG_SPREADMETHOD_REPEAT},
29 : {nullptr, 0}
30 : };
31 :
32 : nsSVGElement::EnumInfo SVGGradientElement::sEnumInfo[2] =
33 : {
34 : { &nsGkAtoms::gradientUnits,
35 : sSVGUnitTypesMap,
36 : SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
37 : },
38 : { &nsGkAtoms::spreadMethod,
39 : sSpreadMethodMap,
40 : SVG_SPREADMETHOD_PAD
41 : }
42 : };
43 :
44 : nsSVGElement::StringInfo SVGGradientElement::sStringInfo[2] =
45 : {
46 : { &nsGkAtoms::href, kNameSpaceID_None, true },
47 : { &nsGkAtoms::href, kNameSpaceID_XLink, true }
48 : };
49 :
50 : //----------------------------------------------------------------------
51 : // Implementation
52 :
53 0 : SVGGradientElement::SVGGradientElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
54 0 : : SVGGradientElementBase(aNodeInfo)
55 : {
56 0 : }
57 :
58 : //----------------------------------------------------------------------
59 : // nsSVGElement methods
60 :
61 : nsSVGElement::EnumAttributesInfo
62 0 : SVGGradientElement::GetEnumInfo()
63 : {
64 : return EnumAttributesInfo(mEnumAttributes, sEnumInfo,
65 0 : ArrayLength(sEnumInfo));
66 : }
67 :
68 : nsSVGElement::StringAttributesInfo
69 0 : SVGGradientElement::GetStringInfo()
70 : {
71 : return StringAttributesInfo(mStringAttributes, sStringInfo,
72 0 : ArrayLength(sStringInfo));
73 : }
74 :
75 : already_AddRefed<SVGAnimatedEnumeration>
76 0 : SVGGradientElement::GradientUnits()
77 : {
78 0 : return mEnumAttributes[GRADIENTUNITS].ToDOMAnimatedEnum(this);
79 : }
80 :
81 : already_AddRefed<SVGAnimatedTransformList>
82 0 : SVGGradientElement::GradientTransform()
83 : {
84 : // We're creating a DOM wrapper, so we must tell GetAnimatedTransformList
85 : // to allocate the SVGAnimatedTransformList if it hasn't already done so:
86 : return SVGAnimatedTransformList::GetDOMWrapper(
87 0 : GetAnimatedTransformList(DO_ALLOCATE), this);
88 : }
89 :
90 : already_AddRefed<SVGAnimatedEnumeration>
91 0 : SVGGradientElement::SpreadMethod()
92 : {
93 0 : return mEnumAttributes[SPREADMETHOD].ToDOMAnimatedEnum(this);
94 : }
95 :
96 : already_AddRefed<SVGAnimatedString>
97 0 : SVGGradientElement::Href()
98 : {
99 0 : return mStringAttributes[HREF].IsExplicitlySet()
100 : ? mStringAttributes[HREF].ToDOMAnimatedString(this)
101 0 : : mStringAttributes[XLINK_HREF].ToDOMAnimatedString(this);
102 : }
103 :
104 : //----------------------------------------------------------------------
105 : // nsIContent methods
106 :
107 : NS_IMETHODIMP_(bool)
108 0 : SVGGradientElement::IsAttributeMapped(const nsIAtom* name) const
109 : {
110 : static const MappedAttributeEntry* const map[] = {
111 : sColorMap,
112 : sGradientStopMap
113 : };
114 :
115 0 : return FindAttributeDependence(name, map) ||
116 0 : SVGGradientElementBase::IsAttributeMapped(name);
117 : }
118 :
119 : //---------------------Linear Gradients------------------------
120 :
121 : JSObject*
122 0 : SVGLinearGradientElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
123 : {
124 0 : return SVGLinearGradientElementBinding::Wrap(aCx, this, aGivenProto);
125 : }
126 :
127 : nsSVGElement::LengthInfo SVGLinearGradientElement::sLengthInfo[4] =
128 : {
129 : { &nsGkAtoms::x1, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
130 : { &nsGkAtoms::y1, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
131 : { &nsGkAtoms::x2, 100, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
132 : { &nsGkAtoms::y2, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
133 : };
134 :
135 : //----------------------------------------------------------------------
136 : // Implementation
137 :
138 0 : SVGLinearGradientElement::SVGLinearGradientElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
139 0 : : SVGLinearGradientElementBase(aNodeInfo)
140 : {
141 0 : }
142 :
143 : //----------------------------------------------------------------------
144 : // nsIDOMNode methods
145 :
146 0 : NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGLinearGradientElement)
147 :
148 : //----------------------------------------------------------------------
149 :
150 : already_AddRefed<SVGAnimatedLength>
151 0 : SVGLinearGradientElement::X1()
152 : {
153 0 : return mLengthAttributes[ATTR_X1].ToDOMAnimatedLength(this);
154 : }
155 :
156 : already_AddRefed<SVGAnimatedLength>
157 0 : SVGLinearGradientElement::Y1()
158 : {
159 0 : return mLengthAttributes[ATTR_Y1].ToDOMAnimatedLength(this);
160 : }
161 :
162 : already_AddRefed<SVGAnimatedLength>
163 0 : SVGLinearGradientElement::X2()
164 : {
165 0 : return mLengthAttributes[ATTR_X2].ToDOMAnimatedLength(this);
166 : }
167 :
168 : already_AddRefed<SVGAnimatedLength>
169 0 : SVGLinearGradientElement::Y2()
170 : {
171 0 : return mLengthAttributes[ATTR_Y2].ToDOMAnimatedLength(this);
172 : }
173 :
174 : //----------------------------------------------------------------------
175 : // nsSVGElement methods
176 :
177 : nsSVGAnimatedTransformList*
178 0 : SVGGradientElement::GetAnimatedTransformList(uint32_t aFlags)
179 : {
180 0 : if (!mGradientTransform && (aFlags & DO_ALLOCATE)) {
181 0 : mGradientTransform = new nsSVGAnimatedTransformList();
182 : }
183 0 : return mGradientTransform;
184 : }
185 :
186 : nsSVGElement::LengthAttributesInfo
187 0 : SVGLinearGradientElement::GetLengthInfo()
188 : {
189 : return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
190 0 : ArrayLength(sLengthInfo));
191 : }
192 :
193 : //-------------------------- Radial Gradients ----------------------------
194 :
195 : JSObject*
196 0 : SVGRadialGradientElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
197 : {
198 0 : return SVGRadialGradientElementBinding::Wrap(aCx, this, aGivenProto);
199 : }
200 :
201 : nsSVGElement::LengthInfo SVGRadialGradientElement::sLengthInfo[6] =
202 : {
203 : { &nsGkAtoms::cx, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
204 : { &nsGkAtoms::cy, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
205 : { &nsGkAtoms::r, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::XY },
206 : { &nsGkAtoms::fx, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
207 : { &nsGkAtoms::fy, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
208 : { &nsGkAtoms::fr, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::XY },
209 : };
210 :
211 : //----------------------------------------------------------------------
212 : // Implementation
213 :
214 0 : SVGRadialGradientElement::SVGRadialGradientElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
215 0 : : SVGRadialGradientElementBase(aNodeInfo)
216 : {
217 0 : }
218 :
219 : //----------------------------------------------------------------------
220 : // nsIDOMNode methods
221 :
222 0 : NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGRadialGradientElement)
223 :
224 : //----------------------------------------------------------------------
225 :
226 : already_AddRefed<SVGAnimatedLength>
227 0 : SVGRadialGradientElement::Cx()
228 : {
229 0 : return mLengthAttributes[ATTR_CX].ToDOMAnimatedLength(this);
230 : }
231 :
232 : already_AddRefed<SVGAnimatedLength>
233 0 : SVGRadialGradientElement::Cy()
234 : {
235 0 : return mLengthAttributes[ATTR_CY].ToDOMAnimatedLength(this);
236 : }
237 :
238 : already_AddRefed<SVGAnimatedLength>
239 0 : SVGRadialGradientElement::R()
240 : {
241 0 : return mLengthAttributes[ATTR_R].ToDOMAnimatedLength(this);
242 : }
243 :
244 : already_AddRefed<SVGAnimatedLength>
245 0 : SVGRadialGradientElement::Fx()
246 : {
247 0 : return mLengthAttributes[ATTR_FX].ToDOMAnimatedLength(this);
248 : }
249 :
250 : already_AddRefed<SVGAnimatedLength>
251 0 : SVGRadialGradientElement::Fy()
252 : {
253 0 : return mLengthAttributes[ATTR_FY].ToDOMAnimatedLength(this);
254 : }
255 :
256 : already_AddRefed<SVGAnimatedLength>
257 0 : SVGRadialGradientElement::Fr()
258 : {
259 0 : return mLengthAttributes[ATTR_FR].ToDOMAnimatedLength(this);
260 : }
261 :
262 : //----------------------------------------------------------------------
263 : // nsSVGElement methods
264 :
265 : nsSVGElement::LengthAttributesInfo
266 0 : SVGRadialGradientElement::GetLengthInfo()
267 : {
268 : return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
269 0 : ArrayLength(sLengthInfo));
270 : }
271 :
272 : } // namespace dom
273 : } // namespace mozilla
|