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.
koffice/karbon/core/vcomposite.h

245 lines
5.2 KiB

/* 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