SVGPatternElement.cpp (5779B)
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/SVGPatternElement.h" 8 9 #include "DOMSVGAnimatedTransformList.h" 10 #include "mozilla/AlreadyAddRefed.h" 11 #include "mozilla/dom/SVGLengthBinding.h" 12 #include "mozilla/dom/SVGPatternElementBinding.h" 13 #include "mozilla/dom/SVGUnitTypesBinding.h" 14 #include "nsGkAtoms.h" 15 16 NS_IMPL_NS_NEW_SVG_ELEMENT(Pattern) 17 18 namespace mozilla::dom { 19 20 using namespace SVGUnitTypes_Binding; 21 22 JSObject* SVGPatternElement::WrapNode(JSContext* aCx, 23 JS::Handle<JSObject*> aGivenProto) { 24 return SVGPatternElement_Binding::Wrap(aCx, this, aGivenProto); 25 } 26 27 //--------------------- Patterns ------------------------ 28 29 SVGElement::LengthInfo SVGPatternElement::sLengthInfo[4] = { 30 {nsGkAtoms::x, 0, SVGLength_Binding::SVG_LENGTHTYPE_NUMBER, 31 SVGContentUtils::X}, 32 {nsGkAtoms::y, 0, SVGLength_Binding::SVG_LENGTHTYPE_NUMBER, 33 SVGContentUtils::Y}, 34 {nsGkAtoms::width, 0, SVGLength_Binding::SVG_LENGTHTYPE_NUMBER, 35 SVGContentUtils::X}, 36 {nsGkAtoms::height, 0, SVGLength_Binding::SVG_LENGTHTYPE_NUMBER, 37 SVGContentUtils::Y}, 38 }; 39 40 SVGElement::EnumInfo SVGPatternElement::sEnumInfo[2] = { 41 {nsGkAtoms::patternUnits, sSVGUnitTypesMap, 42 SVG_UNIT_TYPE_OBJECTBOUNDINGBOX}, 43 {nsGkAtoms::patternContentUnits, sSVGUnitTypesMap, 44 SVG_UNIT_TYPE_USERSPACEONUSE}}; 45 46 SVGElement::StringInfo SVGPatternElement::sStringInfo[2] = { 47 {nsGkAtoms::href, kNameSpaceID_None, true}, 48 {nsGkAtoms::href, kNameSpaceID_XLink, true}}; 49 50 //---------------------------------------------------------------------- 51 // Implementation 52 53 SVGPatternElement::SVGPatternElement( 54 already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo) 55 : SVGPatternElementBase(std::move(aNodeInfo)) {} 56 57 //---------------------------------------------------------------------- 58 // nsINode method 59 60 NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGPatternElement) 61 62 //---------------------------------------------------------------------- 63 64 already_AddRefed<SVGAnimatedRect> SVGPatternElement::ViewBox() { 65 return mViewBox.ToSVGAnimatedRect(this); 66 } 67 68 bool SVGPatternElement::IsAttributeMapped(const nsAtom* aAttribute) const { 69 return aAttribute == nsGkAtoms::patternTransform || 70 SVGPatternElementBase::IsAttributeMapped(aAttribute); 71 } 72 73 already_AddRefed<DOMSVGAnimatedPreserveAspectRatio> 74 SVGPatternElement::PreserveAspectRatio() { 75 return mPreserveAspectRatio.ToDOMAnimatedPreserveAspectRatio(this); 76 } 77 78 //---------------------------------------------------------------------- 79 80 already_AddRefed<DOMSVGAnimatedEnumeration> SVGPatternElement::PatternUnits() { 81 return mEnumAttributes[PATTERNUNITS].ToDOMAnimatedEnum(this); 82 } 83 84 already_AddRefed<DOMSVGAnimatedEnumeration> 85 SVGPatternElement::PatternContentUnits() { 86 return mEnumAttributes[PATTERNCONTENTUNITS].ToDOMAnimatedEnum(this); 87 } 88 89 already_AddRefed<DOMSVGAnimatedTransformList> 90 SVGPatternElement::PatternTransform() { 91 // We're creating a DOM wrapper, so we must tell GetAnimatedTransformList 92 // to allocate the DOMSVGAnimatedTransformList if it hasn't already done so: 93 return DOMSVGAnimatedTransformList::GetDOMWrapper( 94 GetAnimatedTransformList(DO_ALLOCATE), this); 95 } 96 97 already_AddRefed<DOMSVGAnimatedLength> SVGPatternElement::X() { 98 return mLengthAttributes[ATTR_X].ToDOMAnimatedLength(this); 99 } 100 101 already_AddRefed<DOMSVGAnimatedLength> SVGPatternElement::Y() { 102 return mLengthAttributes[ATTR_Y].ToDOMAnimatedLength(this); 103 } 104 105 already_AddRefed<DOMSVGAnimatedLength> SVGPatternElement::Width() { 106 return mLengthAttributes[ATTR_WIDTH].ToDOMAnimatedLength(this); 107 } 108 109 already_AddRefed<DOMSVGAnimatedLength> SVGPatternElement::Height() { 110 return mLengthAttributes[ATTR_HEIGHT].ToDOMAnimatedLength(this); 111 } 112 113 already_AddRefed<DOMSVGAnimatedString> SVGPatternElement::Href() { 114 return mStringAttributes[HREF].IsExplicitlySet() || 115 !mStringAttributes[XLINK_HREF].IsExplicitlySet() 116 ? mStringAttributes[HREF].ToDOMAnimatedString(this) 117 : mStringAttributes[XLINK_HREF].ToDOMAnimatedString(this); 118 } 119 120 //---------------------------------------------------------------------- 121 // SVGElement methods 122 123 SVGAnimatedTransformList* SVGPatternElement::GetAnimatedTransformList( 124 uint32_t aFlags) { 125 if (!mPatternTransform && (aFlags & DO_ALLOCATE)) { 126 mPatternTransform = MakeUnique<SVGAnimatedTransformList>(); 127 } 128 return mPatternTransform.get(); 129 } 130 131 /* virtual */ 132 bool SVGPatternElement::HasValidDimensions() const { 133 return mLengthAttributes[ATTR_WIDTH].IsExplicitlySet() && 134 mLengthAttributes[ATTR_WIDTH].GetAnimValInSpecifiedUnits() > 0 && 135 mLengthAttributes[ATTR_HEIGHT].IsExplicitlySet() && 136 mLengthAttributes[ATTR_HEIGHT].GetAnimValInSpecifiedUnits() > 0; 137 } 138 139 SVGElement::LengthAttributesInfo SVGPatternElement::GetLengthInfo() { 140 return LengthAttributesInfo(mLengthAttributes, sLengthInfo, 141 std::size(sLengthInfo)); 142 } 143 144 SVGElement::EnumAttributesInfo SVGPatternElement::GetEnumInfo() { 145 return EnumAttributesInfo(mEnumAttributes, sEnumInfo, std::size(sEnumInfo)); 146 } 147 148 SVGAnimatedViewBox* SVGPatternElement::GetAnimatedViewBox() { 149 return &mViewBox; 150 } 151 152 SVGAnimatedPreserveAspectRatio* 153 SVGPatternElement::GetAnimatedPreserveAspectRatio() { 154 return &mPreserveAspectRatio; 155 } 156 157 SVGElement::StringAttributesInfo SVGPatternElement::GetStringInfo() { 158 return StringAttributesInfo(mStringAttributes, sStringInfo, 159 std::size(sStringInfo)); 160 } 161 162 } // namespace mozilla::dom