You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/ksvg/impl/SVGPathElementImpl.h

193 lines
7.3 KiB

/*
Copyright (C) 2001-2003 KSVG Team
This file is part of the KDE project
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef SVGPathElementImpl_H
#define SVGPathElementImpl_H
#include <tqvaluevector.h>
#include "svgpathparser.h"
#include "ksvg_lookup.h"
#include "SVGShapeImpl.h"
#include "SVGTestsImpl.h"
#include "SVGStylableImpl.h"
#include "SVGLangSpaceImpl.h"
#include "SVGTransformableImpl.h"
#include "SVGAnimatedPathDataImpl.h"
#include "SVGExternalResourcesRequiredImpl.h"
namespace KSVG
{
class SVGPointImpl;
class SVGPathSegImpl;
class SVGPathSegArcAbsImpl;
class SVGPathSegArcRelImpl;
class SVGAnimatedNumberImpl;
class SVGPathSegClosePathImpl;
class SVGPathSegLinetoAbsImpl;
class SVGPathSegLinetoRelImpl;
class SVGPathSegMovetoAbsImpl;
class SVGPathSegMovetoRelImpl;
class SVGPathSegCurvetoCubicAbsImpl;
class SVGPathSegCurvetoCubicRelImpl;
class SVGPathSegLinetoVerticalAbsImpl;
class SVGPathSegLinetoVerticalRelImpl;
class SVGPathSegLinetoHorizontalAbsImpl;
class SVGPathSegLinetoHorizontalRelImpl;
class SVGPathSegCurvetoQuadraticAbsImpl;
class SVGPathSegCurvetoQuadraticRelImpl;
class SVGPathSegCurvetoCubicSmoothAbsImpl;
class SVGPathSegCurvetoCubicSmoothRelImpl;
class SVGPathSegCurvetoQuadraticSmoothAbsImpl;
class SVGPathSegCurvetoQuadraticSmoothRelImpl;
class SVGPathElementImpl : public SVGShapeImpl,
public SVGTestsImpl,
public SVGLangSpaceImpl,
public SVGExternalResourcesRequiredImpl,
public SVGStylableImpl,
public SVGTransformableImpl,
public SVGAnimatedPathDataImpl,
public ::SVGPathParser
{
public:
SVGPathElementImpl(DOM::ElementImpl *impl);
virtual ~SVGPathElementImpl();
SVGAnimatedNumberImpl *pathLength() const;
double getTotalLength();
SVGPointImpl *getPointAtLength(double distance);
unsigned long getPathSegAtLength(double distance);
SVGPathSegClosePathImpl *createSVGPathSegClosePath();
SVGPathSegMovetoAbsImpl *createSVGPathSegMovetoAbs(double x, double y);
SVGPathSegMovetoRelImpl *createSVGPathSegMovetoRel(double x, double y);
SVGPathSegLinetoAbsImpl *createSVGPathSegLinetoAbs(double x, double y);
SVGPathSegLinetoRelImpl *createSVGPathSegLinetoRel(double x, double y);
SVGPathSegCurvetoCubicAbsImpl *createSVGPathSegCurvetoCubicAbs(double x, double y, double x1, double y1, double x2, double y2);
SVGPathSegCurvetoCubicRelImpl *createSVGPathSegCurvetoCubicRel(double x, double y, double x1, double y1, double x2, double y2);
SVGPathSegCurvetoQuadraticAbsImpl *createSVGPathSegCurvetoQuadraticAbs(double x, double y, double x1, double y1);
SVGPathSegCurvetoQuadraticRelImpl *createSVGPathSegCurvetoQuadraticRel(double x, double y, double x1, double y1);
SVGPathSegArcAbsImpl *createSVGPathSegArcAbs(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag);
SVGPathSegArcRelImpl *createSVGPathSegArcRel(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag);
SVGPathSegLinetoHorizontalAbsImpl *createSVGPathSegLinetoHorizontalAbs(double x);
SVGPathSegLinetoHorizontalRelImpl *createSVGPathSegLinetoHorizontalRel(double x);
SVGPathSegLinetoVerticalAbsImpl *createSVGPathSegLinetoVerticalAbs(double y);
SVGPathSegLinetoVerticalRelImpl *createSVGPathSegLinetoVerticalRel(double y);
SVGPathSegCurvetoCubicSmoothAbsImpl *createSVGPathSegCurvetoCubicSmoothAbs(double x, double y, double x2, double y2);
SVGPathSegCurvetoCubicSmoothRelImpl *createSVGPathSegCurvetoCubicSmoothRel(double x, double y, double x2, double y2);
SVGPathSegCurvetoQuadraticSmoothAbsImpl *createSVGPathSegCurvetoQuadraticSmoothAbs(double x, double y);
SVGPathSegCurvetoQuadraticSmoothRelImpl *createSVGPathSegCurvetoQuadraticSmoothRel(double x, double y);
virtual void createItem(KSVGCanvas *c = 0);
virtual SVGRectImpl *getBBox();
class MarkerData
{
public:
struct Marker
{
double x;
double y;
double angle;
};
MarkerData() {}
MarkerData(SVGPathSegListImpl *path);
const Marker& marker(unsigned int i) const { return m_markers[i]; }
unsigned int numMarkers() const { return m_markers.count(); }
private:
struct SegmentData
{
double startx;
double starty;
double dx;
double dy;
double startSlope;
double endSlope;
unsigned int subpathStartIndex;
unsigned int subpathEndIndex;
bool subpathIsClosed;
int type;
};
static bool getStartSlope(TQValueVector<SegmentData> segments, unsigned int i, double *pStartSlope);
static bool getEndSlope(TQValueVector<SegmentData> segments, unsigned int i, double *pEndSlope);
TQValueVector<Marker> m_markers;
};
MarkerData markerData() const { return m_markerData; }
private:
SVGAnimatedNumberImpl *m_pathLength;
MarkerData m_markerData;
virtual void svgMoveTo(double x1, double y1, bool closed, bool abs = true);
virtual void svgLineTo(double x1, double y1, bool abs = true);
virtual void svgLineToHorizontal(double x, bool abs = true);
virtual void svgLineToVertical(double y, bool abs = true);
virtual void svgCurveToCubic(double x1, double y1, double x2, double y2, double x, double y, bool abs = true);
virtual void svgCurveToCubicSmooth(double x, double y, double x2, double y2, bool abs = true);
virtual void svgCurveToQuadratic(double x, double y, double x1, double y1, bool abs = true);
virtual void svgCurveToQuadraticSmooth(double x, double y, bool abs = true);
virtual void svgArcTo(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag, bool abs = true);
virtual void svgClosePath();
public:
KSVG_GET
KSVG_PUT
KSVG_BRIDGE
enum
{
// Properties
D, PathLength,
// Functions
GetTotalLength, GetPointAtLength, GetPathSegAtLength,
CreateSVGPathSegClosePath, CreateSVGPathSegMovetoAbs, CreateSVGPathSegMovetoRel,
CreateSVGPathSegLinetoAbs, CreateSVGPathSegLinetoRel, CreateSVGPathSegCurvetoCubicAbs,
CreateSVGPathSegCurvetoCubicRel, CreateSVGPathSegCurvetoQuadraticAbs,
CreateSVGPathSegCurvetoQuadraticRel, CreateSVGPathSegArcAbs,
CreateSVGPathSegArcRel, CreateSVGPathSegLinetoHorizontalAbs,
CreateSVGPathSegLinetoHorizontalRel, CreateSVGPathSegLinetoVerticalAbs,
CreateSVGPathSegLinetoVerticalRel, CreateSVGPathSegCurvetoCubicSmoothAbs,
CreateSVGPathSegCurvetoCubicSmoothRel, CreateSVGPathSegCurvetoQuadraticSmoothAbs,
CreateSVGPathSegCurvetoQuadraticSmoothRel
};
KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
};
KSVG_REGISTER_ELEMENT(SVGPathElementImpl, "path")
}
KSVG_DEFINE_PROTOTYPE(SVGPathElementImplProto)
KSVG_IMPLEMENT_PROTOFUNC(SVGPathElementImplProtoFunc, SVGPathElementImpl)
#endif