// This is the SIP interface definition for QPointArray.
//
// Copyright (c) 2007
// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk>
// 
// This file is part of PyQt.
// 
// This copy of PyQt is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2, or (at your option) any later
// version.
// 
// PyQt is supplied 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 General Public License for more
// details.
// 
// You should have received a copy of the GNU General Public License along with
// PyQt; see the file LICENSE.  If not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


%ExportedDoc
<Sect2><Title>QPointArray</Title>
<FuncSynopsis>
        <FuncDef><Function>QPointArray</Function></FuncDef>
        <ParamDef>int <Parameter>nPoints</Parameter></ParamDef>
        <ParamDef>const QCOORD *<Parameter>points</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes a single parameter which is a list of points.
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>point</Function></FuncDef>
        <ParamDef>uint <Parameter>i</Parameter></ParamDef>
        <ParamDef>int *<Parameter>x</Parameter></ParamDef>
        <ParamDef>int *<Parameter>y</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes the single parameter <Literal>i</Literal> and returns the
<Literal>x</Literal> and <Literal>y</Literal> values as a tuple.
</Para>

<FuncSynopsis>
        <FuncDef>bool <Function>putPoints</Function></FuncDef>
        <ParamDef>int <Parameter>index</Parameter></ParamDef>
        <ParamDef>int <Parameter>nPoints</Parameter></ParamDef>
        <ParamDef>const QCOORD *<Parameter>points</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes two parameters, <Literal>index</Literal> and a list of points.
</Para>

<FuncSynopsis>
        <FuncDef>bool <Function>putPoints</Function></FuncDef>
        <ParamDef>int <Parameter>index</Parameter></ParamDef>
        <ParamDef>int <Parameter>nPoints</Parameter></ParamDef>
        <ParamDef>int <Parameter>firstx</Parameter></ParamDef>
        <ParamDef>int <Parameter>firsty</Parameter></ParamDef>
        <ParamDef>...</ParamDef>
</FuncSynopsis>
<Para>
Not implemented.
</Para>

<FuncSynopsis>
        <FuncDef>bool <Function>setPoints</Function></FuncDef>
        <ParamDef>int <Parameter>nPoints</Parameter></ParamDef>
        <ParamDef>const QCOORD *<Parameter>points</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes a single parameter which is a list of points.
</Para>

<FuncSynopsis>
        <FuncDef>bool <Function>setPoints</Function></FuncDef>
        <ParamDef>int <Parameter>nPoints</Parameter></ParamDef>
        <ParamDef>int <Parameter>firstx</Parameter></ParamDef>
        <ParamDef>int <Parameter>firsty</Parameter></ParamDef>
        <ParamDef>...</ParamDef>
</FuncSynopsis>
<Para>
Not implemented.
</Para>
</Sect2>
%End


class QPointArray
{
%TypeHeaderCode
#include <qpointarray.h>
%End

%TypeCode
// Convert a list of numbers to an array on QCOORDs on the heap.

static QCOORD *getPoints(int nrpnts,PyObject *pntlist)
{
	QCOORD *pnts, *pp;

	if ((pnts = (QCOORD *)sipMalloc(nrpnts * sizeof (QCOORD))) == NULL)
		return NULL;

	// Convert the list.

	pp = pnts;

	for (int i = 0; i < nrpnts; ++i)
	{
		*pp++ = (QCOORD)PyInt_AsLong(PyList_GetItem(pntlist,i));

		if (PyErr_Occurred() != NULL)
		{
			sipFree((ANY *)pnts);
			return NULL;
		}
	}

	return pnts;
}
%End

public:
	QPointArray();
	QPointArray(int);
	QPointArray(const QPointArray &);
	QPointArray(const QRect &,bool = 0);

	QPointArray(SIP_PYLIST) [(int,const QCOORD *)];
%MethodCode
		// The Python interface is a list of QCOORDs.

		int nrpnts;
		QCOORD *pnts;

		nrpnts = PyList_GET_SIZE(a0);

		if ((pnts = getPoints(nrpnts,a0)) == NULL)
			sipIsErr = 1;
		else
		{
			// No wrapper class for QPointArray.

			Py_BEGIN_ALLOW_THREADS
			sipCpp = new QPointArray(nrpnts / 2,pnts);
			Py_END_ALLOW_THREADS

			sipFree((ANY *)pnts);
		}
%End

	QPointArray copy() const;
	void translate(int,int);
	QRect boundingRect() const;

	void point(uint,int *,int *) const;
	// This is hidden by the above.  It would probably be better to remove
	// the one above, but that would break backwards compatibility.
	//QPoint point(uint) const;
	void setPoint(uint,int,int);
	void setPoint(uint,const QPoint &);

	bool setPoints(SIP_PYLIST);
%MethodCode
		int nrpnts;
		QCOORD *pnts;

		nrpnts = PyList_GET_SIZE(a0);

		if ((pnts = getPoints(nrpnts,a0)) == NULL)
			sipIsErr = 1;
		else
		{
			Py_BEGIN_ALLOW_THREADS
			sipRes = sipCpp -> setPoints(nrpnts / 2,pnts);
			Py_END_ALLOW_THREADS

			sipFree((ANY *)pnts);
		}
%End

//	bool setPoints(int,int,int,...);

	bool putPoints(int,SIP_PYLIST);
%MethodCode
		int nrpnts;
		QCOORD *pnts;

		nrpnts = PyList_GET_SIZE(a1);

		if ((pnts = getPoints(nrpnts,a1)) == NULL)
			sipIsErr = 1;
		else
		{
			Py_BEGIN_ALLOW_THREADS
			sipRes = sipCpp -> putPoints(a0,nrpnts / 2,pnts);
			Py_END_ALLOW_THREADS

			sipFree((ANY *)pnts);
		}
%End

//	bool putPoints(int,int,int,int,...);
%If (Qt_3_0_0 -)
	bool putPoints(int,int,const QPointArray &,int = 0);
%End

%If (- Qt_2_00)
	QPoint at(uint) const;
%End

	void makeArc(int,int,int,int,int,int);
	void makeEllipse(int,int,int,int);
%If (Qt_TRANSFORMATIONS)
%If (Qt_2_00 -)
	void makeArc(int,int,int,int,int,int,const QWMatrix &);
%End
%End
%If (- Qt_3_0_0)
	QPointArray quadBezier() const;
%End
%If (Qt_3_0_0 -)
	QPointArray cubicBezier() const;
%End

	// These are actually in QArray, which isn't implemented so pretend
	// they are here.

	uint nrefs() const;
	bool isEmpty() const;
	bool isNull() const;
	bool resize(uint);
	uint size() const;
	bool truncate(uint);
	bool fill(const QPoint &,int = -1);
%If (Qt_2_00 -)
	QPoint &at(uint) const;
%End
%If (Qt_2_1_0 -)
	void sort();
	int bsearch(const QPoint &) const;
%End
	int find(const QPoint &,uint = 0) const;
	int contains(const QPoint &) const;
};
