#pragma once
#include "Path.h"
#include "SVGGeometryElement.h"
#include "SVGNames.h"
#include "SVGPathByteStream.h"
#include "SVGPathSegImpl.h"
namespace WebCore {
class SVGPathSegList;
class SVGPoint;
class SVGPathElement final : public SVGGeometryElement {
WTF_MAKE_ISO_ALLOCATED(SVGPathElement);
public:
static Ref<SVGPathElement> create(const QualifiedName&, Document&);
static Ref<SVGPathSegClosePath> createSVGPathSegClosePath() { return SVGPathSegClosePath::create(); }
static Ref<SVGPathSegMovetoAbs> createSVGPathSegMovetoAbs(float x, float y) { return SVGPathSegMovetoAbs::create(x, y); }
static Ref<SVGPathSegMovetoRel> createSVGPathSegMovetoRel(float x, float y) { return SVGPathSegMovetoRel::create(x, y); }
static Ref<SVGPathSegLinetoAbs> createSVGPathSegLinetoAbs(float x, float y) { return SVGPathSegLinetoAbs::create(x, y); }
static Ref<SVGPathSegLinetoRel> createSVGPathSegLinetoRel(float x, float y) { return SVGPathSegLinetoRel::create(x, y); }
static Ref<SVGPathSegCurvetoCubicAbs> createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2)
{
return SVGPathSegCurvetoCubicAbs::create(x, y, x1, y1, x2, y2);
}
static Ref<SVGPathSegCurvetoCubicRel> createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2)
{
return SVGPathSegCurvetoCubicRel::create(x, y, x1, y1, x2, y2);
}
static Ref<SVGPathSegCurvetoQuadraticAbs> createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1)
{
return SVGPathSegCurvetoQuadraticAbs::create(x, y, x1, y1);
}
static Ref<SVGPathSegCurvetoQuadraticRel> createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1)
{
return SVGPathSegCurvetoQuadraticRel::create(x, y, x1, y1);
}
static Ref<SVGPathSegArcAbs> createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
{
return SVGPathSegArcAbs::create(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
}
static Ref<SVGPathSegArcRel> createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
{
return SVGPathSegArcRel::create(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
}
static Ref<SVGPathSegLinetoHorizontalAbs> createSVGPathSegLinetoHorizontalAbs(float x) { return SVGPathSegLinetoHorizontalAbs::create(x); }
static Ref<SVGPathSegLinetoHorizontalRel> createSVGPathSegLinetoHorizontalRel(float x) { return SVGPathSegLinetoHorizontalRel::create(x); }
static Ref<SVGPathSegLinetoVerticalAbs> createSVGPathSegLinetoVerticalAbs(float y) { return SVGPathSegLinetoVerticalAbs::create(y); }
static Ref<SVGPathSegLinetoVerticalRel> createSVGPathSegLinetoVerticalRel(float y) { return SVGPathSegLinetoVerticalRel::create(y); }
static Ref<SVGPathSegCurvetoCubicSmoothAbs> createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2)
{
return SVGPathSegCurvetoCubicSmoothAbs::create(x, y, x2, y2);
}
static Ref<SVGPathSegCurvetoCubicSmoothRel> createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2)
{
return SVGPathSegCurvetoCubicSmoothRel::create(x, y, x2, y2);
}
static Ref<SVGPathSegCurvetoQuadraticSmoothAbs> createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y)
{
return SVGPathSegCurvetoQuadraticSmoothAbs::create(x, y);
}
static Ref<SVGPathSegCurvetoQuadraticSmoothRel> createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y)
{
return SVGPathSegCurvetoQuadraticSmoothRel::create(x, y);
}
float getTotalLength() const final;
ExceptionOr<Ref<SVGPoint>> getPointAtLength(float distance) const final;
unsigned getPathSegAtLength(float distance) const;
FloatRect getBBox(StyleUpdateStrategy = AllowStyleUpdate) final;
Ref<SVGPathSegList>& pathSegList() { return m_pathSegList->baseVal(); }
RefPtr<SVGPathSegList>& animatedPathSegList() { return m_pathSegList->animVal(); }
RefPtr<SVGPathSegList> normalizedPathSegList() { return nullptr; }
RefPtr<SVGPathSegList> animatedNormalizedPathSegList() { return nullptr; }
const SVGPathByteStream& pathByteStream() const { return m_pathSegList->currentPathByteStream(); }
Path path() const { return m_pathSegList->currentPath(); }
size_t approximateMemoryCost() const final { return m_pathSegList->approximateMemoryCost(); }
private:
SVGPathElement(const QualifiedName&, Document&);
using PropertyRegistry = SVGPropertyOwnerRegistry<SVGPathElement, SVGGeometryElement>;
const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
void parseAttribute(const QualifiedName&, const AtomString&) final;
void svgAttributeChanged(const QualifiedName&) final;
bool isValid() const final { return SVGTests::isValid(); }
bool supportsMarkers() const final { return true; }
RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
Node::InsertedIntoAncestorResult insertedIntoAncestor(InsertionType, ContainerNode&) final;
void removedFromAncestor(RemovalType, ContainerNode&) final;
void invalidateMPathDependencies();
private:
PropertyRegistry m_propertyRegistry { *this };
Ref<SVGAnimatedPathSegList> m_pathSegList { SVGAnimatedPathSegList::create(this) };
};
}