diff options
Diffstat (limited to 'svx/inc/svx/xpoly.hxx')
-rw-r--r-- | svx/inc/svx/xpoly.hxx | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/svx/inc/svx/xpoly.hxx b/svx/inc/svx/xpoly.hxx new file mode 100644 index 000000000000..78523a9bb16d --- /dev/null +++ b/svx/inc/svx/xpoly.hxx @@ -0,0 +1,215 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _XPOLY_HXX +#define _XPOLY_HXX + +// include --------------------------------------------------------------- + +#include <tools/solar.h> +#include <basegfx/polygon/b2dpolypolygon.hxx> +#include "svx/svxdllapi.h" + +class Point; +class Rectangle; +class SvStream; +class Polygon; +class PolyPolygon; +class OutputDevice; + +/************************************************************************/ + +#define XPOLYPOLY_APPEND 0xFFFF +#define XPOLY_APPEND 0xFFFF + +#define XPOLY_MAXPOINTS 0xFFF0 /* Auch fuer die 32-Bitter etwas Luft lassen */ + +/************************************************************************/ +// Punktstile im XPolygon: +// NORMAL : Anfangs- oder Endpunkt einer Kurve oder Linie +// SMOOTH : Glatter Uebergang zwischen Kurven +// SYMMTR : glatter und symmetrischer Uebergang zwischen Kurven +// CONTROL: Kontrollpunkt einer Bezierkurve + +enum XPolyFlags { XPOLY_NORMAL, XPOLY_SMOOTH, XPOLY_CONTROL, XPOLY_SYMMTR }; + + +/************************************************************************* +|* +|* Klasse XPolygon; hat neben dem Point-Array noch ein Array mit Flags, +|* die Informationen ueber den jeweiligen Punkt enthalten +|* +\************************************************************************/ + +class ImpXPolygon; + +class SVX_DLLPUBLIC XPolygon +{ +protected: + ImpXPolygon* pImpXPolygon; + + // ImpXPolygon-ReferenceCount pruefen und ggf. abkoppeln + void CheckReference(); + + // Hilfsfunktionen fuer Bezierkonvertierung + void SubdivideBezier(sal_uInt16 nPos, sal_Bool bCalcFirst, double fT); + void GenBezArc(const Point& rCenter, long nRx, long nRy, + long nXHdl, long nYHdl, sal_uInt16 nStart, sal_uInt16 nEnd, + sal_uInt16 nQuad, sal_uInt16 nFirst); + sal_Bool CheckAngles(sal_uInt16& nStart, sal_uInt16 nEnd, sal_uInt16& nA1, sal_uInt16& nA2); + +public: + XPolygon( sal_uInt16 nSize=16, sal_uInt16 nResize=16 ); + XPolygon( const XPolygon& rXPoly ); + XPolygon( const Polygon& rPoly ); + XPolygon( const Rectangle& rRect, long nRx = 0, long nRy = 0 ); + XPolygon( const Point& rCenter, long nRx, long nRy, + sal_uInt16 nStartAngle = 0, sal_uInt16 nEndAngle = 3600, + sal_Bool bClose = sal_True ); + + ~XPolygon(); + + void SetSize( sal_uInt16 nSize ); + sal_uInt16 GetSize() const; + + void SetPointCount( sal_uInt16 nPoints ); + sal_uInt16 GetPointCount() const; + + void Insert( sal_uInt16 nPos, const Point& rPt, XPolyFlags eFlags ); + void Insert( sal_uInt16 nPos, const XPolygon& rXPoly ); + void Insert( sal_uInt16 nPos, const Polygon& rPoly ); + void Remove( sal_uInt16 nPos, sal_uInt16 nCount ); + void Move( long nHorzMove, long nVertMove ); + Rectangle GetBoundRect() const; + + const Point& operator[]( sal_uInt16 nPos ) const; + Point& operator[]( sal_uInt16 nPos ); + XPolygon& operator=( const XPolygon& rXPoly ); + sal_Bool operator==( const XPolygon& rXPoly ) const; + sal_Bool operator!=( const XPolygon& rXPoly ) const; + + XPolyFlags GetFlags( sal_uInt16 nPos ) const; + void SetFlags( sal_uInt16 nPos, XPolyFlags eFlags ); + sal_Bool IsControl(sal_uInt16 nPos) const; + sal_Bool IsSmooth(sal_uInt16 nPos) const; + + // Abstand zwischen zwei Punkten + double CalcDistance(sal_uInt16 nP1, sal_uInt16 nP2); + + // Bezierkonvertierungen + void CalcSmoothJoin(sal_uInt16 nCenter, sal_uInt16 nDrag, sal_uInt16 nPnt); + void CalcTangent(sal_uInt16 nCenter, sal_uInt16 nPrev, sal_uInt16 nNext); + void PointsToBezier(sal_uInt16 nFirst); + + // Transformationen + void Translate(const Point& rTrans); + void Rotate(const Point& rCenter, double fSin, double fCos); + void Rotate(const Point& rCenter, sal_uInt16 nAngle); + void Scale(double fSx, double fSy); + void SlantX(long nYRef, double fSin, double fCos); + void SlantY(long nXRef, double fSin, double fCos); + void Distort(const Rectangle& rRefRect, const XPolygon& rDistortedRect); + void Rotate20 (); + + // #116512# convert to basegfx::B2DPolygon and return + basegfx::B2DPolygon getB2DPolygon() const; + + // #116512# constructor to convert from basegfx::B2DPolygon + // #i76339# made explicit + explicit XPolygon(const basegfx::B2DPolygon& rPolygon); +}; + +/************************************************************************* +|* +|* Klasse XPolyPolygon; wie PolyPolygon, nur statt aus Polygonen aus +|* XPolygonen bestehend +|* +\************************************************************************/ + +class ImpXPolyPolygon; + +class SVX_DLLPUBLIC XPolyPolygon +{ +protected: + ImpXPolyPolygon* pImpXPolyPolygon; + + // ImpXPolyPolygon-ReferenceCount pruefen und ggf. abkoppeln + void CheckReference(); + +public: + XPolyPolygon( sal_uInt16 nInitSize = 16, sal_uInt16 nResize = 16 ); + XPolyPolygon( const XPolygon& rXPoly ); + XPolyPolygon( const XPolyPolygon& rXPolyPoly ); + XPolyPolygon( const PolyPolygon& rPolyPoly); + + ~XPolyPolygon(); + + void Insert( const XPolygon& rXPoly, + sal_uInt16 nPos = XPOLYPOLY_APPEND ); + void Insert( const XPolyPolygon& rXPoly, + sal_uInt16 nPos=XPOLYPOLY_APPEND ); + XPolygon Remove( sal_uInt16 nPos ); + XPolygon Replace( const XPolygon& rXPoly, sal_uInt16 nPos ); + const XPolygon& GetObject( sal_uInt16 nPos ) const; + + void Clear(); + sal_uInt16 Count() const; + + void Move( long nHorzMove, long nVertMove ); + Rectangle GetBoundRect() const; + + const XPolygon& operator[]( sal_uInt16 nPos ) const + { return GetObject( nPos ); } + XPolygon& operator[]( sal_uInt16 nPos ); + + XPolyPolygon& operator=( const XPolyPolygon& rXPolyPoly ); + sal_Bool operator==( const XPolyPolygon& rXPolyPoly ) const; + sal_Bool operator!=( const XPolyPolygon& rXPolyPoly ) const; + + // Transformationen + void Translate(const Point& rTrans); + void Rotate(const Point& rCenter, double fSin, double fCos); + void Rotate(const Point& rCenter, sal_uInt16 nAngle); + void Scale(double fSx, double fSy); + void SlantX(long nYRef, double fSin, double fCos); + void SlantY(long nXRef, double fSin, double fCos); + void Distort(const Rectangle& rRefRect, const XPolygon& rDistortedRect); + void Rotate20 (); + + // #116512# convert to basegfx::B2DPolyPolygon and return + basegfx::B2DPolyPolygon getB2DPolyPolygon() const; + + // #116512# constructor to convert from basegfx::B2DPolyPolygon + // #i76339# made explicit + explicit XPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon); +}; + +#endif // _XPOLY_HXX + +// eof + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |