// This is the SIP interface definition for QWMatrix.
//
// 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>QWMatrix</Title>
<Para>
The Python <Literal>==</Literal>, <Literal>!=</Literal> and
<Literal>*=</Literal> operators are supported.
</Para>

<FuncSynopsis>
        <FuncDef>QWMatrix <Function>invert</Function> const</FuncDef>
        <ParamDef>bool *<Parameter>invertible</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
This takes no parameters and returns a tuple of the <Literal>QWMatrix</Literal>
result and the <Literal>invertible</Literal> value.
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>map</Function> const</FuncDef>
        <ParamDef>int <Parameter>x</Parameter></ParamDef>
        <ParamDef>int <Parameter>y</Parameter></ParamDef>
        <ParamDef>int *<Parameter>tx</Parameter></ParamDef>
        <ParamDef>int *<Parameter>ty</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes the <Literal>x</Literal> and <Literal>y</Literal> parameters and
returns a tuple containing the <Literal>tx</Literal> and <Literal>ty</Literal>
values.
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>map</Function> const</FuncDef>
        <ParamDef>float <Parameter>x</Parameter></ParamDef>
        <ParamDef>float <Parameter>y</Parameter></ParamDef>
        <ParamDef>float *<Parameter>tx</Parameter></ParamDef>
        <ParamDef>float *<Parameter>ty</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes the <Literal>x</Literal> and <Literal>y</Literal> parameters and
returns a tuple containing the <Literal>tx</Literal> and <Literal>ty</Literal>
values. (Qt v1.x)
</Para>

<FuncSynopsis>
        <FuncDef>void <Function>map</Function> const</FuncDef>
        <ParamDef>double <Parameter>x</Parameter></ParamDef>
        <ParamDef>double <Parameter>y</Parameter></ParamDef>
        <ParamDef>double *<Parameter>tx</Parameter></ParamDef>
        <ParamDef>double *<Parameter>ty</Parameter></ParamDef>
</FuncSynopsis>
<Para>
This takes the <Literal>x</Literal> and <Literal>y</Literal> parameters and
returns a tuple containing the <Literal>tx</Literal> and <Literal>ty</Literal>
values. (Qt v2+)
</Para>
</Sect2>
%End


class QWMatrix
{
%TypeHeaderCode
#include <qwmatrix.h>
%End

public:
	QWMatrix();
%If (- Qt_2_00)
	QWMatrix(float,float,float,float,float,float);
%End
%If (Qt_2_00 -)
	QWMatrix(double,double,double,double,double,double);
%End

	void map(int /Constrained/,int /Constrained/,int *,int *) const;

%If (Qt_3_0_0 -)
	QRect mapRect(const QRect &) const;
%End

	QPoint map(const QPoint &) const;
	QRect map(const QRect &); const
	QPointArray map(const QPointArray &) const;
%If (Qt_3_1_0 -)
	QRegion map(const QRegion &) const;
	QRegion mapToRegion(const QRect &) const;
	QPointArray mapToPolygon(const QRect &) const;
%End

	void reset();
%If (Qt_3_0_0 -)
	bool isIdentity() const;

	bool isInvertible() const;
%End
%If (Qt_3_1_0 -)
	double det() const;
%End

	QWMatrix invert(bool * = 0) const;

	bool operator==(const QWMatrix &) const;
	bool operator!=(const QWMatrix &) const;
	QWMatrix &operator*=(const QWMatrix &);

%If (Qt_3_0_0 -)
	// These aren't documented but are used in Qt examples.
	QPoint operator*(const QPoint &) const;
	QRegion operator*(const QRect &) const;
	QRegion operator*(const QRegion &) const;
	QPointArray operator*(const QPointArray &) const;
%End

%If (Qt_3_1_0 -)
	enum TransformationMode {
		Points,
		Areas
	};

	static void setTransformationMode(TransformationMode);
	static TransformationMode transformationMode();
%End

%If (- Qt_2_00)
	void setMatrix(float,float,float,float,float,float);
	float m11();
	float m12();
	float m21();
	float m22();
	float dx();
	float dy();

	void map(float,float,float *,float *) const;

	QWMatrix &translate(float,float);
	QWMatrix &scale(float,float);
	QWMatrix &shear(float,float);
	QWMatrix &rotate(float);
%End

%If (Qt_2_00 -)
	void setMatrix(double,double,double,double,double,double);
	double m11();
	double m12();
	double m21();
	double m22();
	double dx();
	double dy();

	void map(double,double,double *,double *) const;

	QWMatrix &translate(double,double);
	QWMatrix &scale(double,double);
	QWMatrix &shear(double,double);
	QWMatrix &rotate(double);
%End
};
