// This is the SIP interface definition for TQPainter.
//
// Copyright (c) 2007
// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk>
// 
// This file is part of PyTQt.
// 
// This copy of PyTQt 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.
// 
// PyTQt 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
// PyTQt; 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>TQPainter</Title>
<FuncSynopsis>
        <FuncDef>TQRect <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>TQRect <Function>boundingRect</Function></FuncDef>
        <ParamDef>const TQRect&</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>TQRect *<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 TQRect&</ParamDef>
        <ParamDef>int <Parameter>flags</Parameter></ParamDef>
        <ParamDef>const char *<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>TQRect *<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


class TQPainter : TQt
{
%TypeHeaderCode
#include <tqpainter.h>
%End

public:
	enum CoordinateMode {
		CoordDevice,
		CoordPainter
	};

	TQPainter();
	TQPainter(const TQPaintDevice *,bool = 0);
	TQPainter(const TQPaintDevice *,const TQWidget *,bool = 0);

	bool begin(const TQPaintDevice *,bool = 0);
	bool begin(const TQPaintDevice *,const TQWidget *,bool = 0);
	bool end();
	TQPaintDevice *device() const;

	static void redirect(TQPaintDevice *,TQPaintDevice *);

	bool isActive() const;

	void flush(const TQRegion &,CoordinateMode = CoordDevice);
	void flush();
	void save();
	void restore();

	TQFontMetrics fontMetrics() const;
	TQFontInfo fontInfo() const;

	const TQFont &font() const;
	void setFont(const TQFont&);
	const TQPen &pen() const;
	void setPen(const TQPen &);
	void setPen(PenStyle);
	void setPen(const TQColor &);
	const TQBrush &brush() const;
	void setBrush(const TQBrush &);
	void setBrush(BrushStyle);
	void setBrush(const TQColor &);

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

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

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

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

	void saveWorldMatrix();
	void restoreWorldMatrix();

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

	TQPoint xForm(const TQPoint &) const;
	TQRect xForm(const TQRect &) const;
	TQPointArray xForm(const TQPointArray &) const;
	TQPointArray xForm(const TQPointArray &,int,int) const;
	TQPoint xFormDev(const TQPoint &) const;
	TQRect xFormDev(const TQRect &) const;
	TQPointArray xFormDev(const TQPointArray &) const;
	TQPointArray xFormDev(const TQPointArray &,int,int) const;

	void setClipping(bool);
	bool hasClipping() const;
	TQRegion clipRegion(CoordinateMode = CoordDevice) const;
	void setClipRect(const TQRect &,CoordinateMode = CoordDevice);
	void setClipRect(int,int,int,int,CoordinateMode = CoordDevice);
	void setClipRegion(const TQRegion &,CoordinateMode = CoordDevice);

	void drawPoint(int,int);
	void drawPoint(const TQPoint &);
	void drawPoints(const TQPointArray &,int,int = -1);
	void moveTo(int,int);
	void moveTo(const TQPoint &);
	void lineTo(int,int);
	void lineTo(const TQPoint &);
	void drawLine(int,int,int,int);
	void drawLine(const TQPoint &,const TQPoint &);
	void drawRect(int,int,int,int);
	void drawRect(const TQRect &);
	void drawWinFocusRect(int,int,int,int);
	void drawWinFocusRect(int,int,int,int,const TQColor &);
	void drawWinFocusRect(const TQRect &);
	void drawWinFocusRect(const TQRect &,const TQColor &);
	void drawRoundRect(int,int,int,int,int = 25,int = 25);
	void drawRoundRect(const TQRect &,int = 25,int = 25);
	void drawEllipse(int,int,int,int);
	void drawEllipse(const TQRect &);
	void drawArc(int,int,int,int,int,int);
	void drawArc(const TQRect &,int,int);
	void drawPie(int,int,int,int,int,int);
	void drawPie(const TQRect &,int,int);
	void drawChord(int,int,int,int,int,int);
	void drawChord(const TQRect &,int,int);
	void drawLineSegments(const TQPointArray &,int = 0,int = -1);
	void drawPolyline(const TQPointArray &,int = 0,int = -1);
	void drawPolygon(const TQPointArray &,bool = 0,int = 0,int = -1);
	void drawConvexPolygon(const TQPointArray &,int = 0,int = -1);
	void drawCubicBezier(const TQPointArray &,int = 0);
	void drawPixmap(int,int,const TQPixmap &,int = 0,int = 0,int = -1,
			int = -1);
	void drawPixmap(const TQPoint &,const TQPixmap &,const TQRect &);
	void drawPixmap(const TQPoint &,const TQPixmap &);
	void drawPixmap(const TQRect &,const TQPixmap &);
	void drawImage(int,int,const TQImage &,int = 0,int = 0,int = -1,
		       int = -1,int = 0);
	void drawImage(const TQPoint &,const TQImage &,const TQRect &,int = 0);
	void drawImage(const TQPoint &,const TQImage &,int = 0);
	void drawImage(const TQRect &,const TQImage &);
	void drawTiledPixmap(int,int,int,int,const TQPixmap &,int = 0,int = 0);
	void drawTiledPixmap(const TQRect &,const TQPixmap &,const TQPoint &);
	void drawTiledPixmap(const TQRect &,const TQPixmap &);
%If (TQt_PICTURE)
	void drawPicture(const TQPicture &);
	void drawPicture(int,int,const TQPicture &);
	void drawPicture(const TQPoint &,const TQPicture &);
%End

	void fillRect(int,int,int,int,const TQBrush &);
	void fillRect(const TQRect &,const TQBrush &);
	void eraseRect(int,int,int,int);
	void eraseRect(const TQRect &);

	enum TextDirection {
		Auto,
		RTL,
		LTR
	};

	void drawText(int,int,const TQString &,int = -1,TextDirection = Auto);
	void drawText(const TQPoint &,const TQString &,int = -1,
		      TextDirection = Auto);
	void drawText(int,int,const TQString &,int,int,TextDirection = Auto);
	void drawText(const TQPoint &,const TQString &,int,int,
		      TextDirection = Auto);
	void drawText(int,int,int,int,int,const TQString &,int = -1,TQRect * = 0);
	void drawText(const TQRect &,int,const TQString &,int = -1,TQRect * = 0);

	TQRect boundingRect(int,int,int,int,int,const TQString &,int = -1);
	TQRect boundingRect(const TQRect &,int,const TQString &,int = -1);
	int tabStops() const;
	void setTabStops(int);

	SIP_PYLIST tabArray() const;
%MethodCode
		int *tabs;

		Py_BEGIN_ALLOW_THREADS
		tabs = sipCpp -> tabArray();
		Py_END_ALLOW_THREADS

		int len = 0;

		if (tabs)
		{
			int *tp = tabs;

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

		if ((sipRes = PyList_New(len)) == NULL)
			sipIsErr = 1;
		else if (tabs)
		{
			int *tp = tabs;

			len = 0;

			do
			{
				if (PyList_SetItem(sipRes,len,PyLong_FromLong((long)*tp)) < 0)
				{
					Py_DECREF(sipRes);
					sipIsErr = 1;
					break;
				}

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

	void setTabArray(SIP_PYLIST);
%MethodCode
		int len, *tabs;

		len = PyList_GET_SIZE(a0);

		// Allocate space for the array.  Note, this memory is never
		// reclaimed.
		if ((tabs = (int *)sipMalloc(len * sizeof (int))) == NULL)
			sipIsErr = 1;
		else
		{
			// Convert the list.

			int *tp = tabs;

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

				if (PyErr_Occurred() != NULL)
				{
					sipFree((void *)tabs);
					sipIsErr = 1;
					break;
				}
			}

			if (!sipIsErr)
			{
				Py_BEGIN_ALLOW_THREADS
				sipCpp -> setTabArray(tabs);
				Py_END_ALLOW_THREADS
			}
		}
%End

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

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

private:
	TQPainter(const TQPainter &);
};
