/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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/. */ #ifndef mozilla_dom_SVGPathElement_h #define mozilla_dom_SVGPathElement_h #include "mozilla/gfx/2D.h" #include "mozilla/RefPtr.h" #include "nsSVGNumber2.h" #include "nsSVGPathGeometryElement.h" #include "SVGAnimatedPathSegList.h" #include "DOMSVGPathSeg.h" nsresult NS_NewSVGPathElement(nsIContent **aResult, already_AddRefed&& aNodeInfo); typedef nsSVGPathGeometryElement SVGPathElementBase; namespace mozilla { class nsISVGPoint; namespace dom { class SVGPathElement final : public SVGPathElementBase { friend class nsSVGPathFrame; typedef mozilla::gfx::Path Path; protected: friend nsresult (::NS_NewSVGPathElement(nsIContent **aResult, already_AddRefed&& aNodeInfo)); virtual JSObject* WrapNode(JSContext *cx, JS::Handle aGivenProto) override; explicit SVGPathElement(already_AddRefed& aNodeInfo); public: // DOM memory reporter participant NS_DECL_SIZEOF_EXCLUDING_THIS // nsIContent interface NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* name) const override; // nsSVGSVGElement methods: virtual bool HasValidDimensions() const override; // nsSVGPathGeometryElement methods: virtual bool AttributeDefinesGeometry(const nsIAtom *aName) override; virtual bool IsMarkable() override; virtual void GetMarkPoints(nsTArray *aMarks) override; virtual already_AddRefed BuildPath(PathBuilder* aBuilder) override; /** * This returns a path without the extra little line segments that * ApproximateZeroLengthSubpathSquareCaps can insert if we have square-caps. * See the comment for that function for more info on that. */ virtual already_AddRefed GetOrBuildPathForMeasuring() override; // nsIContent interface virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override; virtual SVGAnimatedPathSegList* GetAnimPathSegList() override { return &mD; } virtual nsIAtom* GetPathDataAttrName() const override { return nsGkAtoms::d; } enum PathLengthScaleForType { eForTextPath, eForStroking }; /** * Gets the ratio of the actual path length to the content author's estimated * length (as provided by the element's 'pathLength' attribute). This * is used to scale stroke dashing, and to scale offsets along a textPath. */ float GetPathLengthScale(PathLengthScaleForType aFor); // WebIDL already_AddRefed PathLength(); float GetTotalLength(); already_AddRefed GetPointAtLength(float distance, ErrorResult& rv); uint32_t GetPathSegAtLength(float distance); already_AddRefed CreateSVGPathSegClosePath(); already_AddRefed CreateSVGPathSegMovetoAbs(float x, float y); already_AddRefed CreateSVGPathSegMovetoRel(float x, float y); already_AddRefed CreateSVGPathSegLinetoAbs(float x, float y); already_AddRefed CreateSVGPathSegLinetoRel(float x, float y); already_AddRefed CreateSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2); already_AddRefed CreateSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2); already_AddRefed CreateSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1); already_AddRefed CreateSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1); already_AddRefed CreateSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag); already_AddRefed CreateSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag); already_AddRefed CreateSVGPathSegLinetoHorizontalAbs(float x); already_AddRefed CreateSVGPathSegLinetoHorizontalRel(float x); already_AddRefed CreateSVGPathSegLinetoVerticalAbs(float y); already_AddRefed CreateSVGPathSegLinetoVerticalRel(float y); already_AddRefed CreateSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2); already_AddRefed CreateSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2); already_AddRefed CreateSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y); already_AddRefed CreateSVGPathSegCurvetoQuadraticSmoothRel(float x, float y); already_AddRefed PathSegList(); already_AddRefed AnimatedPathSegList(); protected: // nsSVGElement method virtual NumberAttributesInfo GetNumberInfo() override; SVGAnimatedPathSegList mD; nsSVGNumber2 mPathLength; static NumberInfo sNumberInfo; }; } // namespace dom } // namespace mozilla #endif // mozilla_dom_SVGPathElement_h