diff options
Diffstat (limited to 'karbon/core/vcomposite.h')
| -rw-r--r-- | karbon/core/vcomposite.h | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/karbon/core/vcomposite.h b/karbon/core/vcomposite.h new file mode 100644 index 000000000..e786294be --- /dev/null +++ b/karbon/core/vcomposite.h @@ -0,0 +1,244 @@ +/* This file is part of the KDE project + Copyright (C) 2001, 2002, 2003 The Karbon Developers + + 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 __VCOMPOSITE_H__ +#define __VCOMPOSITE_H__ + + +#include <qptrlist.h> + +#include <KoPoint.h> + +#include "vobject.h" +#include "svgpathparser.h" +#include "vfillrule.h" +#include <koffice_export.h> + +class QDomElement; +class VPainter; +class VSegment; +class VVisitor; +class VSubpath; + +typedef QPtrList<VSubpath> VSubpathList; +typedef QPtrListIterator<VSubpath> VSubpathListIterator; + + +/** + * A composite path consists of one or many subpaths. + */ + +class KARBONBASE_EXPORT VPath : public VObject, SVGPathParser +{ +public: + VPath( VObject* parent, VState state = normal ); + VPath( const VPath& path ); + virtual ~VPath(); + + virtual DCOPObject* dcopObject(); + + /** + * Returns the knot of the last segment of the last subpath. + */ + const KoPoint& currentPoint() const; + + + bool moveTo( const KoPoint& p ); + bool lineTo( const KoPoint& p ); + + /* + curveTo(): + + p1 p2 + O ____ O + : _/ \_ : + :/ \: + x x + currP p3 + */ + + bool curveTo( + const KoPoint& p1, const KoPoint& p2, const KoPoint& p3 ); + + /* + curve1To(): + + p2 + ____ O + __/ \ : + / \: + x x + currP p3 + */ + + bool curve1To( const KoPoint& p2, const KoPoint& p3 ); + + /* + curve2To(): + + p1 + O ____ + : / \__ + :/ \ + x x + currP p3 + */ + + bool curve2To( const KoPoint& p1, const KoPoint& p3 ); + + /** + * A convenience function to aproximate a circular arc with a + * bezier curve. Input: 2 tangent vectors and a radius (same as in PostScript). + */ + + /* + arcTo(): + + p1 x....__--x....x p2 + : _/ + : / + :/ + | + x + | + | + x currP + */ + bool arcTo( const KoPoint& p1, const KoPoint& p2, double r ); + + /** + * Closes the current subpath. + */ + void close(); + + bool isClosed() const; + /** + * Combines two composite paths. For example, the letter "O" is a combination + * of a larger and a smaller ellipitical path. + */ + void combine( const VPath& path ); + + /** + * Adds a path to the composite path. + */ + void combinePath( const VSubpath& path ); + + + /** + * Returns true if point p is located inside the composite. + */ + bool pointIsInside( const KoPoint& p ) const; + + + /** + * Returns true if the segment intersects this composite. + */ + bool intersects( const VSegment& segment ) const; + + + const VSubpathList& paths() const + { + return m_paths; + } + + virtual const KoRect& boundingBox() const; + + + VFillRule fillMode() const; + + // TODO remove these functions. + VFillRule fillRule() const + { + return m_fillRule; + } + + void setFillRule( VFillRule fillRule ) + { + m_fillRule = fillRule; + } + + + virtual void draw( VPainter *painter, const KoRect* rect = 0L ) const; + + bool drawCenterNode() const + { + return m_drawCenterNode; + } + + void setDrawCenterNode( bool drawCenterNode = true ) + { + m_drawCenterNode = drawCenterNode; + } + + + virtual void save( QDomElement& element ) const; + virtual void saveOasis( KoStore *store, KoXmlWriter *docWriter, KoGenStyles &mainStyles, int &index ) const; + virtual void load( const QDomElement& element ); + virtual bool loadOasis( const QDomElement &element, KoOasisLoadingContext &context ); + + virtual VPath* clone() const; + + virtual void accept( VVisitor& visitor ); + + void transform( const QString &transform ); + void transformOasis( const QString &transform ); + + static QWMatrix parseTransform( const QString &transform ); + + void transform( const QWMatrix &mat ) + { + m_matrix *= mat; + } + + + void loadSvgPath( const QString & ); + void saveSvgPath( QString & ) const; + +protected: + QString buildSvgTransform() const; + QString buildSvgTransform( const QWMatrix &mat ) const; + QString buildOasisTransform() const; + QString buildOasisTransform( const QWMatrix &mat ) const; + + void transformByViewbox( const QDomElement &element, QString viewbox ); + + /// For svg path data parsing. + virtual void svgMoveTo( double x1, double y1, bool abs = true ); + virtual void svgLineTo( double x1, double y1, bool abs = true ); + virtual void svgCurveToCubic( double x1, double y1, double x2, double y2, double x, double y, bool abs = true ); + virtual void svgClosePath(); + + virtual void saveOasisFill( KoGenStyles &mainStyles, KoGenStyle &stylesojectauto ) const; + QWMatrix parseOasisTransform( const QString &transform ); + +protected: + QWMatrix m_matrix; + +private: + /** + * List of subpaths. + */ + VSubpathList m_paths; + + /// Should a center node be drawn? + bool m_drawCenterNode; + VFillRule m_fillRule : 1; +}; + +#endif |
