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