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/SVGMaskElement.h"
12 #include "mozilla/dom/SVGMaskElementBinding.h"
13
14 NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(Mask)
15
16 namespace mozilla {
17 namespace dom {
18
19 JSObject*
WrapNode(JSContext * aCx,JS::Handle<JSObject * > aGivenProto)20 SVGMaskElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
21 {
22 return SVGMaskElementBinding::Wrap(aCx, this, aGivenProto);
23 }
24
25 //--------------------- Masks ------------------------
26
27 nsSVGElement::LengthInfo SVGMaskElement::sLengthInfo[4] =
28 {
29 { &nsGkAtoms::x, -10, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
30 { &nsGkAtoms::y, -10, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
31 { &nsGkAtoms::width, 120, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
32 { &nsGkAtoms::height, 120, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
33 };
34
35 nsSVGElement::EnumInfo SVGMaskElement::sEnumInfo[2] =
36 {
37 { &nsGkAtoms::maskUnits,
38 sSVGUnitTypesMap,
39 SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
40 },
41 { &nsGkAtoms::maskContentUnits,
42 sSVGUnitTypesMap,
43 SVG_UNIT_TYPE_USERSPACEONUSE
44 }
45 };
46
47 //----------------------------------------------------------------------
48 // Implementation
49
SVGMaskElement(already_AddRefed<mozilla::dom::NodeInfo> & aNodeInfo)50 SVGMaskElement::SVGMaskElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
51 : SVGMaskElementBase(aNodeInfo)
52 {
53 }
54
55 //----------------------------------------------------------------------
56 // nsIDOMNode method
57
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGMaskElement)58 NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGMaskElement)
59
60 //----------------------------------------------------------------------
61
62 already_AddRefed<SVGAnimatedEnumeration>
63 SVGMaskElement::MaskUnits()
64 {
65 return mEnumAttributes[MASKUNITS].ToDOMAnimatedEnum(this);
66 }
67
68 already_AddRefed<SVGAnimatedEnumeration>
MaskContentUnits()69 SVGMaskElement::MaskContentUnits()
70 {
71 return mEnumAttributes[MASKCONTENTUNITS].ToDOMAnimatedEnum(this);
72 }
73
74 already_AddRefed<SVGAnimatedLength>
X()75 SVGMaskElement::X()
76 {
77 return mLengthAttributes[ATTR_X].ToDOMAnimatedLength(this);
78 }
79
80 already_AddRefed<SVGAnimatedLength>
Y()81 SVGMaskElement::Y()
82 {
83 return mLengthAttributes[ATTR_Y].ToDOMAnimatedLength(this);
84 }
85
86 already_AddRefed<SVGAnimatedLength>
Width()87 SVGMaskElement::Width()
88 {
89 return mLengthAttributes[ATTR_WIDTH].ToDOMAnimatedLength(this);
90 }
91
92 already_AddRefed<SVGAnimatedLength>
Height()93 SVGMaskElement::Height()
94 {
95 return mLengthAttributes[ATTR_HEIGHT].ToDOMAnimatedLength(this);
96 }
97
98 //----------------------------------------------------------------------
99 // nsSVGElement methods
100
101 /* virtual */ bool
HasValidDimensions() const102 SVGMaskElement::HasValidDimensions() const
103 {
104 return (!mLengthAttributes[ATTR_WIDTH].IsExplicitlySet() ||
105 mLengthAttributes[ATTR_WIDTH].GetAnimValInSpecifiedUnits() > 0) &&
106 (!mLengthAttributes[ATTR_HEIGHT].IsExplicitlySet() ||
107 mLengthAttributes[ATTR_HEIGHT].GetAnimValInSpecifiedUnits() > 0);
108 }
109
110 nsSVGElement::LengthAttributesInfo
GetLengthInfo()111 SVGMaskElement::GetLengthInfo()
112 {
113 return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
114 ArrayLength(sLengthInfo));
115 }
116
117 nsSVGElement::EnumAttributesInfo
GetEnumInfo()118 SVGMaskElement::GetEnumInfo()
119 {
120 return EnumAttributesInfo(mEnumAttributes, sEnumInfo,
121 ArrayLength(sEnumInfo));
122 }
123
124 //----------------------------------------------------------------------
125 // nsIContent methods
126
NS_IMETHODIMP_(bool)127 NS_IMETHODIMP_(bool)
128 SVGMaskElement::IsAttributeMapped(const nsIAtom* name) const
129 {
130 static const MappedAttributeEntry* const map[] = {
131 sColorMap,
132 sFEFloodMap,
133 sFillStrokeMap,
134 sFiltersMap,
135 sFontSpecificationMap,
136 sGradientStopMap,
137 sGraphicsMap,
138 sMarkersMap,
139 sMaskMap,
140 sTextContentElementsMap,
141 sViewportsMap
142 };
143
144 return FindAttributeDependence(name, map) ||
145 SVGMaskElementBase::IsAttributeMapped(name);
146 }
147
148 } // namespace dom
149 } // namespace mozilla
150