summaryrefslogtreecommitdiffstats
path: root/dom/svg/SVGGradientElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/svg/SVGGradientElement.cpp')
-rw-r--r--dom/svg/SVGGradientElement.cpp266
1 files changed, 266 insertions, 0 deletions
diff --git a/dom/svg/SVGGradientElement.cpp b/dom/svg/SVGGradientElement.cpp
new file mode 100644
index 000000000..1bcac67e6
--- /dev/null
+++ b/dom/svg/SVGGradientElement.cpp
@@ -0,0 +1,266 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/SVGGradientElement.h"
+
+#include "mozilla/ArrayUtils.h"
+#include "mozilla/dom/SVGAnimatedTransformList.h"
+#include "mozilla/dom/SVGRadialGradientElementBinding.h"
+#include "mozilla/dom/SVGLinearGradientElementBinding.h"
+#include "nsCOMPtr.h"
+#include "nsGkAtoms.h"
+#include "nsSVGElement.h"
+
+NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(LinearGradient)
+NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(RadialGradient)
+
+namespace mozilla {
+namespace dom {
+
+//--------------------- Gradients------------------------
+
+nsSVGEnumMapping SVGGradientElement::sSpreadMethodMap[] = {
+ {&nsGkAtoms::pad, SVG_SPREADMETHOD_PAD},
+ {&nsGkAtoms::reflect, SVG_SPREADMETHOD_REFLECT},
+ {&nsGkAtoms::repeat, SVG_SPREADMETHOD_REPEAT},
+ {nullptr, 0}
+};
+
+nsSVGElement::EnumInfo SVGGradientElement::sEnumInfo[2] =
+{
+ { &nsGkAtoms::gradientUnits,
+ sSVGUnitTypesMap,
+ SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+ },
+ { &nsGkAtoms::spreadMethod,
+ sSpreadMethodMap,
+ SVG_SPREADMETHOD_PAD
+ }
+};
+
+nsSVGElement::StringInfo SVGGradientElement::sStringInfo[2] =
+{
+ { &nsGkAtoms::href, kNameSpaceID_None, true },
+ { &nsGkAtoms::href, kNameSpaceID_XLink, true }
+};
+
+//----------------------------------------------------------------------
+// Implementation
+
+SVGGradientElement::SVGGradientElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
+ : SVGGradientElementBase(aNodeInfo)
+{
+}
+
+//----------------------------------------------------------------------
+// nsSVGElement methods
+
+nsSVGElement::EnumAttributesInfo
+SVGGradientElement::GetEnumInfo()
+{
+ return EnumAttributesInfo(mEnumAttributes, sEnumInfo,
+ ArrayLength(sEnumInfo));
+}
+
+nsSVGElement::StringAttributesInfo
+SVGGradientElement::GetStringInfo()
+{
+ return StringAttributesInfo(mStringAttributes, sStringInfo,
+ ArrayLength(sStringInfo));
+}
+
+already_AddRefed<SVGAnimatedEnumeration>
+SVGGradientElement::GradientUnits()
+{
+ return mEnumAttributes[GRADIENTUNITS].ToDOMAnimatedEnum(this);
+}
+
+already_AddRefed<SVGAnimatedTransformList>
+SVGGradientElement::GradientTransform()
+{
+ // We're creating a DOM wrapper, so we must tell GetAnimatedTransformList
+ // to allocate the SVGAnimatedTransformList if it hasn't already done so:
+ return SVGAnimatedTransformList::GetDOMWrapper(
+ GetAnimatedTransformList(DO_ALLOCATE), this);
+}
+
+already_AddRefed<SVGAnimatedEnumeration>
+SVGGradientElement::SpreadMethod()
+{
+ return mEnumAttributes[SPREADMETHOD].ToDOMAnimatedEnum(this);
+}
+
+already_AddRefed<SVGAnimatedString>
+SVGGradientElement::Href()
+{
+ return mStringAttributes[HREF].IsExplicitlySet()
+ ? mStringAttributes[HREF].ToDOMAnimatedString(this)
+ : mStringAttributes[XLINK_HREF].ToDOMAnimatedString(this);
+}
+
+//----------------------------------------------------------------------
+// nsIContent methods
+
+NS_IMETHODIMP_(bool)
+SVGGradientElement::IsAttributeMapped(const nsIAtom* name) const
+{
+ static const MappedAttributeEntry* const map[] = {
+ sColorMap,
+ sGradientStopMap
+ };
+
+ return FindAttributeDependence(name, map) ||
+ SVGGradientElementBase::IsAttributeMapped(name);
+}
+
+//---------------------Linear Gradients------------------------
+
+JSObject*
+SVGLinearGradientElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SVGLinearGradientElementBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsSVGElement::LengthInfo SVGLinearGradientElement::sLengthInfo[4] =
+{
+ { &nsGkAtoms::x1, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
+ { &nsGkAtoms::y1, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
+ { &nsGkAtoms::x2, 100, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
+ { &nsGkAtoms::y2, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
+};
+
+//----------------------------------------------------------------------
+// Implementation
+
+SVGLinearGradientElement::SVGLinearGradientElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
+ : SVGLinearGradientElementBase(aNodeInfo)
+{
+}
+
+//----------------------------------------------------------------------
+// nsIDOMNode methods
+
+NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGLinearGradientElement)
+
+//----------------------------------------------------------------------
+
+already_AddRefed<SVGAnimatedLength>
+SVGLinearGradientElement::X1()
+{
+ return mLengthAttributes[ATTR_X1].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGLinearGradientElement::Y1()
+{
+ return mLengthAttributes[ATTR_Y1].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGLinearGradientElement::X2()
+{
+ return mLengthAttributes[ATTR_X2].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGLinearGradientElement::Y2()
+{
+ return mLengthAttributes[ATTR_Y2].ToDOMAnimatedLength(this);
+}
+
+//----------------------------------------------------------------------
+// nsSVGElement methods
+
+nsSVGAnimatedTransformList*
+SVGGradientElement::GetAnimatedTransformList(uint32_t aFlags)
+{
+ if (!mGradientTransform && (aFlags & DO_ALLOCATE)) {
+ mGradientTransform = new nsSVGAnimatedTransformList();
+ }
+ return mGradientTransform;
+}
+
+nsSVGElement::LengthAttributesInfo
+SVGLinearGradientElement::GetLengthInfo()
+{
+ return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
+ ArrayLength(sLengthInfo));
+}
+
+//-------------------------- Radial Gradients ----------------------------
+
+JSObject*
+SVGRadialGradientElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SVGRadialGradientElementBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsSVGElement::LengthInfo SVGRadialGradientElement::sLengthInfo[5] =
+{
+ { &nsGkAtoms::cx, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
+ { &nsGkAtoms::cy, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
+ { &nsGkAtoms::r, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::XY },
+ { &nsGkAtoms::fx, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::X },
+ { &nsGkAtoms::fy, 50, nsIDOMSVGLength::SVG_LENGTHTYPE_PERCENTAGE, SVGContentUtils::Y },
+};
+
+//----------------------------------------------------------------------
+// Implementation
+
+SVGRadialGradientElement::SVGRadialGradientElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
+ : SVGRadialGradientElementBase(aNodeInfo)
+{
+}
+
+//----------------------------------------------------------------------
+// nsIDOMNode methods
+
+NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGRadialGradientElement)
+
+//----------------------------------------------------------------------
+
+already_AddRefed<SVGAnimatedLength>
+SVGRadialGradientElement::Cx()
+{
+ return mLengthAttributes[ATTR_CX].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGRadialGradientElement::Cy()
+{
+ return mLengthAttributes[ATTR_CY].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGRadialGradientElement::R()
+{
+ return mLengthAttributes[ATTR_R].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGRadialGradientElement::Fx()
+{
+ return mLengthAttributes[ATTR_FX].ToDOMAnimatedLength(this);
+}
+
+already_AddRefed<SVGAnimatedLength>
+SVGRadialGradientElement::Fy()
+{
+ return mLengthAttributes[ATTR_FY].ToDOMAnimatedLength(this);
+}
+
+//----------------------------------------------------------------------
+// nsSVGElement methods
+
+nsSVGElement::LengthAttributesInfo
+SVGRadialGradientElement::GetLengthInfo()
+{
+ return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
+ ArrayLength(sLengthInfo));
+}
+
+} // namespace dom
+} // namespace mozilla