// This is the SIP interface definition for QPainter.
//
// Copyright (c) 2003
// 	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>QPainter</Title>
<FuncSynopsis>
        <FuncDef>QRect <Function>boundingRect</Function></FuncDef>
        <ParamDef>int <Parameter>x</Parameter></ParamDef>
        <ParamDef>int <Parameter>y</Parameter></ParamDef>
        <ParamDef>int <Parameter>w</Parameter></ParamDef>
        <ParamDef>int <Parameter>h</Parameter></ParamDef>
        <ParamDef>int <Parameter>flags</Parameter></ParamDef>
        <ParamDef>const char *<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>char **<Parameter>intern</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
The <Literal>intern</Literal> parameter is not supported.
</Para>

<FuncSynopsis>
        <FuncDef>QRect <Function>boundingRect</Function></FuncDef>
        <ParamDef>const QRect&</ParamDef>
        <ParamDef>int <Parameter>flags</Parameter></ParamDef>
        <ParamDef>const char *<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>char **<Parameter>intern</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
The <Literal>intern</Literal> parameter is not supported.
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>drawText</Function></FuncDef>
        <ParamDef>int <Parameter>x</Parameter></ParamDef>
        <ParamDef>int <Parameter>y</Parameter></ParamDef>
        <ParamDef>int <Parameter>w</Parameter></ParamDef>
        <ParamDef>int <Parameter>h</Parameter></ParamDef>
        <ParamDef>int <Parameter>flags</Parameter></ParamDef>
        <ParamDef>const char *<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>QRect *<Parameter>br</Parameter> = 0</ParamDef>
        <ParamDef>char **<Parameter>intern</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
The <Literal>intern</Literal> parameter is not supported.
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>drawText</Function></FuncDef>
        <ParamDef>const QRect&</ParamDef>
        <ParamDef>int <Parameter>flags</Parameter></ParamDef>
        <ParamDef>const char *<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>QRect *<Parameter>br</Parameter> = 0</ParamDef>
        <ParamDef>char **<Parameter>intern</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
The <Literal>intern</Literal> parameter is not supported.
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>setTabArray</Function></FuncDef>
        <ParamDef>int *<Parameter>ta</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes a single parameter which is a list of tab stops.
</Para>

<FuncSynopsis>
        <FuncDef>int *<Function>tabArray</Function></FuncDef>
        <ParamDef></ParamDef>
</FuncSynopsis>
<Para>
This returns a list of tab stops.
</Para>
</Sect2>
%End


%HeaderCode
#include <qpainter.h>
%End


%If (- Qt_2_00)

enum BGMode {
	TransparentMode,
	OpaqueMode
};

enum PaintUnit {
	PixelUnit,
	LoMetricUnit,
	HiMetricUnit,
	LoEnglishUnit,
	HiEnglishUnit,
	TwipsUnit
};


class QPainter
{
%HeaderCode
#include <qpainter.h>
%End

public:
	QPainter();
	QPainter(const QPaintDevice *);
	QPainter(const QPaintDevice *,const QWidget *);

	bool begin(const QPaintDevice *);
	bool begin(const QPaintDevice *,const QWidget *);
	bool end();
	QPaintDevice *device() const;
	static void redirect(QPaintDevice *,QPaintDevice *);
	bool isActive() const;
	void flush();
	void save();
	void restore();
	QFontMetrics fontMetrics() const;
	QFontInfo fontInfo() const;
	const QFont &font() const;
	void setFont(const QFont&);
	const QPen &pen() const;
	void setPen(const QPen &);
	void setPen(PenStyle);
	void setPen(const QColor &);
	const QBrush &brush() const;
	void setBrush(const QBrush &);
	void setBrush(BrushStyle);
	void setBrush(const QColor &);
	const QColor &backgroundColor() const;
	void setBackgroundColor(const QColor &);
	BGMode backgroundMode() const;
	void setBackgroundMode(BGMode);
	RasterOp rasterOp() const;
	void setRasterOp(RasterOp);
	const QPoint &brushOrigin() const;
	void setBrushOrigin(int,int);
	void setBrushOrigin(const QPoint &);

	bool hasViewXForm() const;
	bool hasWorldXForm() const;

	void setViewXForm(bool);
	QRect window() const;
	void setWindow(const QRect &);
	void setWindow(int,int,int,int);
	QRect viewport() const;
	void setViewport(const QRect &);
	void setViewport(int,int,int,int);

	void setWorldXForm(bool);
	const QWMatrix &worldMatrix() const;
	void setWorldMatrix(const QWMatrix &,bool = 0);

	void scale(float,float);
	void shear(float,float);
	void rotate(float);

	void translate(float,float);
	void resetXForm();

	QPoint xForm(QPoint &) const;
	QRect xForm(QRect &) const;
	QPointArray xForm(QPointArray &) const;
	QPointArray xForm(QPointArray &,int,int) const;
	QPoint xFormDev(QPoint &) const;
	QRect xFormDev(QRect &) const;
	QPointArray xFormDev(QPointArray &) const;
	QPointArray xFormDev(QPointArray &,int,int) const;
	void setClipping(bool);
	bool hasClipping() const;
	const QRegion &clipRegion() const;
	void setClipRect(const QRect &);
	void setClipRect(int,int,int,int);
	void setClipRegion(const QRegion &);
	void drawPoint(int,int);
	void drawPoint(const QPoint &);
	void drawPoints(const QPointArray &,int,int = -1);
	void moveTo(int,int);
	void moveTo(const QPoint &);
	void lineTo(int,int);
	void lineTo(const QPoint &);
	void drawLine(int,int,int,int);
	void drawLine(const QPoint &,const QPoint &);
	void drawRect(int,int,int,int);
	void drawRect(const QRect &);
	void drawWinFocusRect(int,int,int,int);
	void drawWinFocusRect(int,int,int,int,const QColor &);
	void drawWinFocusRect(const QRect &);
	void drawWinFocusRect(const QRect &,const QColor &);
	void drawRoundRect(int,int,int,int,int,int);
	void drawRoundRect(const QRect &,int,int);
	void drawEllipse(int,int,int,int);
	void drawEllipse(const QRect &);
	void drawArc(int,int,int,int,int,int);
	void drawArc(const QRect &,int,int);
	void drawPie(int,int,int,int,int,int);
	void drawPie(const QRect &,int,int);
	void drawChord(int,int,int,int,int,int);
	void drawChord(const QRect &,int,int);
	void drawLineSegments(const QPointArray &,int = 0,int = -1);
	void drawPolyline(const QPointArray &,int = 0,int = -1);
	void drawPolygon(const QPointArray &,bool = 0,int = 0,int = -1);
	void drawQuadBezier(const QPointArray &,int = 0);
	void drawPixmap(int,int,const QPixmap &,int = 0,int = 0,int = -1,int = -1);
	void drawPixmap(const QPoint &,const QPixmap &,const QRect &);
	void drawPixmap(const QPoint &,const QPixmap &);
	void drawImage(int,int,const QImage &,int = 0,int = 0,int = -1,int = -1);
	void drawImage(const QPoint &,const QImage &,const QRect &);
	void drawImage(const QPoint &,const QImage &);
	void drawTiledPixmap(int,int,int,int,const QPixmap &,int = 0,int = 0);
	void drawTiledPixmap(const QRect &,const QPixmap &,const QPoint &);
	void drawTiledPixmap(const QRect &,const QPixmap &);
	void drawPicture(const QPicture &);
	void fillRect(int,int,int,int,const QBrush &);
	void fillRect(const QRect &,const QBrush &);
	void eraseRect(int,int,int,int);
	void eraseRect(const QRect &);
	void drawText(int,int,char *,int = -1);
	void drawText(const QPoint &,const char *,int = -1);
	void drawText(int,int,int,int,int,const char *,int = -1,QRect * = 0);
	void drawText(const QRect &,int,const char *,int = -1,QRect * = 0);
	QRect boundingRect(int,int,int,int,int,const char *,int = -1);
	QRect boundingRect(const QRect &,int,const char *,int = -1);
	int tabStops() const;
	void setTabStops(int);

	int *tabArray() const;
%MemberCode
		// The Python interface returns a list of ints.

		QPainter *ptr;

		if (sipParseArgs(&sipArgsParsed,sipArgs,"m",sipThisObj,sipClass_QPainter,&ptr))
		{
			int len, *tabs;
			PyObject *tablist;

			Py_BEGIN_ALLOW_THREADS
			tabs = ptr -> tabArray();
			Py_END_ALLOW_THREADS

			len = 0;

			if (tabs != NULL)
			{
				int *tp = tabs;

				do
					++len;
				while (*tp++ != 0);
			}

			if ((tablist = PyList_New(len)) == NULL)
				return NULL;

			if (tabs != NULL)
			{
				int *tp = tabs;

				len = 0;

				do
				{
					if (PyList_SetItem(tablist,len,PyInt_FromLong((long)*tp)) < 0)
					{
						Py_DECREF(tablist);
						return NULL;
					}

					++len;
				}
				while (*tp++ != 0);
			}

			return tablist;
		}
%End

	void setTabArray(int *);
%MemberCode
		// The Python interface takes a list of ints.

		PyObject *tablist;
		QPainter *ptr;

		if (sipParseArgs(&sipArgsParsed,sipArgs,"mL",sipThisObj,sipClass_QPainter,&ptr,&tablist))
		{
			int len, *tabs, *tp;

			len = PyList_GET_SIZE(tablist);

			// Allocate space for the array.  Note, this memory is
			// never reclaimed.

			if ((tabs = (int *)sipMalloc(len * sizeof (int))) == NULL)
				return NULL;

			// Convert the list.

			tp = tabs;

			for (int i = 0; i < len; ++i)
			{
				*tp++ = (int)PyInt_AsLong(PyList_GET_ITEM(tablist,i));

				if (PyErr_Occurred() != NULL)
					return NULL;
			}

			Py_BEGIN_ALLOW_THREADS
			ptr -> setTabArray(tabs);
			Py_END_ALLOW_THREADS

			Py_INCREF(Py_None);
			return Py_None;
		}
%End

	HANDLE handle() const;
	static void initialize();
	static void cleanup();

private:
	QPainter(const QPainter &);
};

%End

%If (Qt_2_00 -)

class QPainter : Qt
{
%HeaderCode
#include <qpainter.h>
%End

public:
%If (Qt_3_0_0 -)
	enum CoordinateMode {
		CoordDevice,
		CoordPainter
	};
%End

	QPainter();
%If (- Qt_3_0_0)
	QPainter(const QPaintDevice *);
	QPainter(const QPaintDevice *,const QWidget *);
%End
%If (Qt_3_0_0 -)
	QPainter(const QPaintDevice *,bool = 0);
	QPainter(const QPaintDevice *,const QWidget *,bool = 0);
%End

%If (- Qt_3_0_0)
	bool begin(const QPaintDevice *);
	bool begin(const QPaintDevice *,const QWidget *);
%End
%If (Qt_3_0_0 -)
	bool begin(const QPaintDevice *,bool = 0);
	bool begin(const QPaintDevice *,const QWidget *,bool = 0);
%End
	bool end();
	QPaintDevice *device() const;

	static void redirect(QPaintDevice *,QPaintDevice *);

	bool isActive() const;

%If (Qt_3_0_0 -)
	void flush(const QRegion &,CoordinateMode = CoordDevice);
%End
	void flush();
	void save();
	void restore();

	QFontMetrics fontMetrics() const;
	QFontInfo fontInfo() const;

	const QFont &font() const;
	void setFont(const QFont&);
	const QPen &pen() const;
	void setPen(const QPen &);
	void setPen(PenStyle);
	void setPen(const QColor &);
	const QBrush &brush() const;
	void setBrush(const QBrush &);
	void setBrush(BrushStyle);
	void setBrush(const QColor &);
%If (Qt_2_1_0 -)
	// The omission of this from Qt/Embedded is probably a bug.
%End

	const QColor &backgroundColor() const;
	void setBackgroundColor(const QColor &);
	BGMode backgroundMode() const;
	void setBackgroundMode(BGMode);
	RasterOp rasterOp() const;
	void setRasterOp(RasterOp);
	const QPoint &brushOrigin() const;
	void setBrushOrigin(int,int);
	void setBrushOrigin(const QPoint &);

	bool hasViewXForm() const;
	bool hasWorldXForm() const;

%If (Qt_TRANSFORMATIONS)
	void setViewXForm(bool);
	QRect window() const;
	void setWindow(const QRect &);
	void setWindow(int,int,int,int);
	QRect viewport() const;
	void setViewport(const QRect &);
	void setViewport(int,int,int,int);

	void setWorldXForm(bool);
	const QWMatrix &worldMatrix() const;
	void setWorldMatrix(const QWMatrix &,bool = 0);

	void saveWorldMatrix();
	void restoreWorldMatrix();

	void scale(double,double);
	void shear(double,double);
	void rotate(double);
%End
	void translate(double,double);
	void resetXForm();
%If (Qt_3_0_0 -)
	double translationX() const;
	double translationY() const;
%End

	QPoint xForm(const QPoint &) const;
	QRect xForm(const QRect &) const;
	QPointArray xForm(const QPointArray &) const;
	QPointArray xForm(const QPointArray &,int,int) const;
	QPoint xFormDev(const QPoint &) const;
	QRect xFormDev(const QRect &) const;
	QPointArray xFormDev(const QPointArray &) const;
	QPointArray xFormDev(const QPointArray &,int,int) const;

	void setClipping(bool);
	bool hasClipping() const;
%If (- Qt_3_0_0)
	const QRegion &clipRegion() const;
	void setClipRect(const QRect &);
	void setClipRect(int,int,int,int);
	void setClipRegion(const QRegion &);
%End
%If (Qt_3_0_0 -)
	QRegion clipRegion(CoordinateMode = CoordDevice) const;
	void setClipRect(const QRect &,CoordinateMode = CoordDevice);
	void setClipRect(int,int,int,int,CoordinateMode = CoordDevice);
	void setClipRegion(const QRegion &,CoordinateMode = CoordDevice);
%End

	void drawPoint(int,int);
	void drawPoint(const QPoint &);
	void drawPoints(const QPointArray &,int,int = -1);
	void moveTo(int,int);
	void moveTo(const QPoint &);
	void lineTo(int,int);
	void lineTo(const QPoint &);
	void drawLine(int,int,int,int);
	void drawLine(const QPoint &,const QPoint &);
	void drawRect(int,int,int,int);
	void drawRect(const QRect &);
	void drawWinFocusRect(int,int,int,int);
	void drawWinFocusRect(int,int,int,int,const QColor &);
	void drawWinFocusRect(const QRect &);
	void drawWinFocusRect(const QRect &,const QColor &);
%If (- Qt_3_0_0)
	void drawRoundRect(int,int,int,int,int,int);
	void drawRoundRect(const QRect &,int,int);
%End
%If (Qt_3_0_0 -)
	void drawRoundRect(int,int,int,int,int = 25,int = 25);
	void drawRoundRect(const QRect &,int = 25,int = 25);
%End
	void drawEllipse(int,int,int,int);
	void drawEllipse(const QRect &);
	void drawArc(int,int,int,int,int,int);
	void drawArc(const QRect &,int,int);
	void drawPie(int,int,int,int,int,int);
	void drawPie(const QRect &,int,int);
	void drawChord(int,int,int,int,int,int);
	void drawChord(const QRect &,int,int);
	void drawLineSegments(const QPointArray &,int = 0,int = -1);
	void drawPolyline(const QPointArray &,int = 0,int = -1);
	void drawPolygon(const QPointArray &,bool = 0,int = 0,int = -1);
%If (- Qt_3_0_0)
	void drawQuadBezier(const QPointArray &,int = 0);
%End
%If (Qt_3_0_0 -)
	void drawConvexPolygon(const QPointArray &,int = 0,int = -1);
	void drawCubicBezier(const QPointArray &,int = 0);
%End
	void drawPixmap(int,int,const QPixmap &,int = 0,int = 0,int = -1,
			int = -1);
	void drawPixmap(const QPoint &,const QPixmap &,const QRect &);
	void drawPixmap(const QPoint &,const QPixmap &);
%If (Qt_3_0_0 -)
	void drawPixmap(const QRect &,const QPixmap &);
%End
%If (- Qt_3_0_0)
	void drawImage(int,int,const QImage &,int = 0,int = 0,int = -1,
		       int = -1);
	void drawImage(const QPoint &,const QImage &,const QRect &);
	void drawImage(const QPoint &,const QImage &);
%End
%If (Qt_3_0_0 -)
	void drawImage(int,int,const QImage &,int = 0,int = 0,int = -1,
		       int = -1,int = 0);
	void drawImage(const QPoint &,const QImage &,const QRect &,int = 0);
	void drawImage(const QPoint &,const QImage &,int = 0);
	void drawImage(const QRect &,const QImage &);
%End
	void drawTiledPixmap(int,int,int,int,const QPixmap &,int = 0,int = 0);
	void drawTiledPixmap(const QRect &,const QPixmap &,const QPoint &);
	void drawTiledPixmap(const QRect &,const QPixmap &);
%If (Qt_PICTURE)
	void drawPicture(const QPicture &);
%If (Qt_3_0_0 -)
	void drawPicture(int,int,const QPicture &);
	void drawPicture(const QPoint &,const QPicture &);
%End
%End

	void fillRect(int,int,int,int,const QBrush &);
	void fillRect(const QRect &,const QBrush &);
	void eraseRect(int,int,int,int);
	void eraseRect(const QRect &);

%If (Qt_3_0_0 -)
	enum TextDirection {
		Auto,
		RTL,
		LTR
	};
%End

%If (- Qt_3_0_0)
	void drawText(int,int,const QString &,int = -1);
	void drawText(const QPoint &,const QString &,int = -1);
%End
%If (Qt_3_0_0 -)
	void drawText(int,int,const QString &,int = -1,TextDirection = Auto);
	void drawText(const QPoint &,const QString &,int = -1,
		      TextDirection = Auto);
	void drawText(int,int,const QString &,int,int,TextDirection = Auto);
	void drawText(const QPoint &,const QString &,int,int,
		      TextDirection = Auto);
%End
	void drawText(int,int,int,int,int,const QString &,int = -1,QRect * = 0);
	void drawText(const QRect &,int,const QString &,int = -1,QRect * = 0);

	QRect boundingRect(int,int,int,int,int,const QString &,int = -1);
	QRect boundingRect(const QRect &,int,const QString &,int = -1);
	int tabStops() const;
	void setTabStops(int);

	int *tabArray() const;
%MemberCode
		// The Python interface returns a list of ints.

		QPainter *ptr;

		if (sipParseArgs(&sipArgsParsed,sipArgs,"m",sipThisObj,sipClass_QPainter,&ptr))
		{
			int len, *tabs;
			PyObject *tablist;

			Py_BEGIN_ALLOW_THREADS
			tabs = ptr -> tabArray();
			Py_END_ALLOW_THREADS

			len = 0;

			if (tabs != NULL)
			{
				int *tp = tabs;

				do
					++len;
				while (*tp++ != 0);
			}

			if ((tablist = PyList_New(len)) == NULL)
				return NULL;

			if (tabs != NULL)
			{
				int *tp = tabs;

				len = 0;

				do
				{
					if (PyList_SetItem(tablist,len,PyInt_FromLong((long)*tp)) < 0)
					{
						Py_DECREF(tablist);
						return NULL;
					}

					++len;
				}
				while (*tp++ != 0);
			}

			return tablist;
		}
%End

	void setTabArray(int *);
%MemberCode
		// The Python interface takes a list of ints.

		PyObject *tablist;
		QPainter *ptr;

		if (sipParseArgs(&sipArgsParsed,sipArgs,"mL",sipThisObj,sipClass_QPainter,&ptr,&tablist))
		{
			int len, *tabs, *tp;

			len = PyList_Size(tablist);

			// Allocate space for the array.  Note, this memory is
			// never reclaimed.

			if ((tabs = (int *)sipMalloc(len * sizeof (int))) == NULL)
				return NULL;

			// Convert the list.

			tp = tabs;

			for (int i = 0; i < len; ++i)
			{
				*tp++ = (int)PyInt_AsLong(PyList_GetItem(tablist,i));

				if (PyErr_Occurred() != NULL)
					return NULL;
			}

			Py_BEGIN_ALLOW_THREADS
			ptr -> setTabArray(tabs);
			Py_END_ALLOW_THREADS

			Py_INCREF(Py_None);
			return Py_None;
		}
%End

%If (WS_X11)
	HANDLE handle() const;
%End

	static void initialize();
	static void cleanup();

private:
	QPainter(const QPainter &);
};

%End
