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/ArrayUtils.h"
8 :
9 : #include "nsCOMPtr.h"
10 : #include "nsGkAtoms.h"
11 : #include "mozilla/dom/SVGAnimatedTransformList.h"
12 : #include "mozilla/dom/SVGPatternElement.h"
13 : #include "mozilla/dom/SVGPatternElementBinding.h"
14 :
15 0 : NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(Pattern)
16 :
17 : namespace mozilla {
18 : namespace dom {
19 :
20 : JSObject*
21 0 : SVGPatternElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
22 : {
23 0 : return SVGPatternElementBinding::Wrap(aCx, this, aGivenProto);
24 : }
25 :
26 : //--------------------- Patterns ------------------------
27 :
28 : nsSVGElement::LengthInfo SVGPatternElement::sLengthInfo[4] =
29 : {
30 : { &nsGkAtoms::x, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
31 : { &nsGkAtoms::y, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
32 : { &nsGkAtoms::width, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
33 : { &nsGkAtoms::height, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
34 : };
35 :
36 : nsSVGElement::EnumInfo SVGPatternElement::sEnumInfo[2] =
37 : {
38 : { &nsGkAtoms::patternUnits,
39 : sSVGUnitTypesMap,
40 : SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
41 : },
42 : { &nsGkAtoms::patternContentUnits,
43 : sSVGUnitTypesMap,
44 : SVG_UNIT_TYPE_USERSPACEONUSE
45 : }
46 : };
47 :
48 : nsSVGElement::StringInfo SVGPatternElement::sStringInfo[2] =
49 : {
50 : { &nsGkAtoms::href, kNameSpaceID_None, true },
51 : { &nsGkAtoms::href, kNameSpaceID_XLink, true }
52 : };
53 :
54 : //----------------------------------------------------------------------
55 : // Implementation
56 :
57 0 : SVGPatternElement::SVGPatternElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
58 0 : : SVGPatternElementBase(aNodeInfo)
59 : {
60 0 : }
61 :
62 : //----------------------------------------------------------------------
63 : // nsIDOMNode method
64 :
65 0 : NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGPatternElement)
66 :
67 : //----------------------------------------------------------------------
68 :
69 : already_AddRefed<SVGAnimatedRect>
70 0 : SVGPatternElement::ViewBox()
71 : {
72 0 : return mViewBox.ToSVGAnimatedRect(this);
73 : }
74 :
75 : already_AddRefed<DOMSVGAnimatedPreserveAspectRatio>
76 0 : SVGPatternElement::PreserveAspectRatio()
77 : {
78 0 : return mPreserveAspectRatio.ToDOMAnimatedPreserveAspectRatio(this);
79 : }
80 :
81 : //----------------------------------------------------------------------
82 :
83 : already_AddRefed<SVGAnimatedEnumeration>
84 0 : SVGPatternElement::PatternUnits()
85 : {
86 0 : return mEnumAttributes[PATTERNUNITS].ToDOMAnimatedEnum(this);
87 : }
88 :
89 : already_AddRefed<SVGAnimatedEnumeration>
90 0 : SVGPatternElement::PatternContentUnits()
91 : {
92 0 : return mEnumAttributes[PATTERNCONTENTUNITS].ToDOMAnimatedEnum(this);
93 : }
94 :
95 : already_AddRefed<SVGAnimatedTransformList>
96 0 : SVGPatternElement::PatternTransform()
97 : {
98 : // We're creating a DOM wrapper, so we must tell GetAnimatedTransformList
99 : // to allocate the SVGAnimatedTransformList if it hasn't already done so:
100 : return SVGAnimatedTransformList::GetDOMWrapper(
101 0 : GetAnimatedTransformList(DO_ALLOCATE), this);
102 : }
103 :
104 : already_AddRefed<SVGAnimatedLength>
105 0 : SVGPatternElement::X()
106 : {
107 0 : return mLengthAttributes[ATTR_X].ToDOMAnimatedLength(this);
108 : }
109 :
110 : already_AddRefed<SVGAnimatedLength>
111 0 : SVGPatternElement::Y()
112 : {
113 0 : return mLengthAttributes[ATTR_Y].ToDOMAnimatedLength(this);
114 : }
115 :
116 : already_AddRefed<SVGAnimatedLength>
117 0 : SVGPatternElement::Width()
118 : {
119 0 : return mLengthAttributes[ATTR_WIDTH].ToDOMAnimatedLength(this);
120 : }
121 :
122 : already_AddRefed<SVGAnimatedLength>
123 0 : SVGPatternElement::Height()
124 : {
125 0 : return mLengthAttributes[ATTR_HEIGHT].ToDOMAnimatedLength(this);
126 : }
127 :
128 : already_AddRefed<SVGAnimatedString>
129 0 : SVGPatternElement::Href()
130 : {
131 0 : return mStringAttributes[HREF].IsExplicitlySet()
132 : ? mStringAttributes[HREF].ToDOMAnimatedString(this)
133 0 : : mStringAttributes[XLINK_HREF].ToDOMAnimatedString(this);
134 : }
135 :
136 : //----------------------------------------------------------------------
137 : // nsIContent methods
138 :
139 : NS_IMETHODIMP_(bool)
140 0 : SVGPatternElement::IsAttributeMapped(const nsIAtom* name) const
141 : {
142 : static const MappedAttributeEntry* const map[] = {
143 : sColorMap,
144 : sFEFloodMap,
145 : sFillStrokeMap,
146 : sFiltersMap,
147 : sFontSpecificationMap,
148 : sGradientStopMap,
149 : sGraphicsMap,
150 : sLightingEffectsMap,
151 : sMarkersMap,
152 : sTextContentElementsMap,
153 : sViewportsMap
154 : };
155 :
156 0 : return FindAttributeDependence(name, map) ||
157 0 : SVGPatternElementBase::IsAttributeMapped(name);
158 : }
159 :
160 : //----------------------------------------------------------------------
161 : // nsSVGElement methods
162 :
163 : nsSVGAnimatedTransformList*
164 0 : SVGPatternElement::GetAnimatedTransformList(uint32_t aFlags)
165 : {
166 0 : if (!mPatternTransform && (aFlags & DO_ALLOCATE)) {
167 0 : mPatternTransform = new nsSVGAnimatedTransformList();
168 : }
169 0 : return mPatternTransform;
170 : }
171 :
172 : /* virtual */ bool
173 0 : SVGPatternElement::HasValidDimensions() const
174 : {
175 0 : return mLengthAttributes[ATTR_WIDTH].IsExplicitlySet() &&
176 0 : mLengthAttributes[ATTR_WIDTH].GetAnimValInSpecifiedUnits() > 0 &&
177 0 : mLengthAttributes[ATTR_HEIGHT].IsExplicitlySet() &&
178 0 : mLengthAttributes[ATTR_HEIGHT].GetAnimValInSpecifiedUnits() > 0;
179 : }
180 :
181 : nsSVGElement::LengthAttributesInfo
182 0 : SVGPatternElement::GetLengthInfo()
183 : {
184 : return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
185 0 : ArrayLength(sLengthInfo));
186 : }
187 :
188 : nsSVGElement::EnumAttributesInfo
189 0 : SVGPatternElement::GetEnumInfo()
190 : {
191 : return EnumAttributesInfo(mEnumAttributes, sEnumInfo,
192 0 : ArrayLength(sEnumInfo));
193 : }
194 :
195 : nsSVGViewBox *
196 0 : SVGPatternElement::GetViewBox()
197 : {
198 0 : return &mViewBox;
199 : }
200 :
201 : SVGAnimatedPreserveAspectRatio *
202 0 : SVGPatternElement::GetPreserveAspectRatio()
203 : {
204 0 : return &mPreserveAspectRatio;
205 : }
206 :
207 : nsSVGElement::StringAttributesInfo
208 0 : SVGPatternElement::GetStringInfo()
209 : {
210 : return StringAttributesInfo(mStringAttributes, sStringInfo,
211 0 : ArrayLength(sStringInfo));
212 : }
213 :
214 : } // namespace dom
215 : } // namespace mozilla
|