/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the 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
