// This is the SIP interface definition for QFontMetrics.
//
// 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>QFontMetrics</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 QString &amp;<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>int <Parameter>tabstops</Parameter> = 0</ParamDef>
        <ParamDef>int *<Parameter>tabarray</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
The <Literal>tabarray</Literal> parameter is a Python list of integers.
</Para>

<FuncSynopsis>
        <FuncDef>QSize <Function>size</Function></FuncDef>
        <ParamDef>int <Parameter>flags</Parameter></ParamDef>
        <ParamDef>const QString &amp;<Parameter>str</Parameter></ParamDef>
        <ParamDef>int <Parameter>len</Parameter> = -1</ParamDef>
        <ParamDef>int <Parameter>tabstops</Parameter> = 0</ParamDef>
        <ParamDef>int *<Parameter>tabarray</Parameter> = 0</ParamDef>
</FuncSynopsis>
<Para>
The <Literal>tabarray</Literal> parameter is a Python list of integers.
</Para>
</Sect2>
%End


class QFontMetrics
{
%TypeHeaderCode
#include <qfontmetrics.h>
%End

public:
	QFontMetrics(const QFont &);
%If (Qt_3_2_0 -)
	QFontMetrics(const QFont &,QFont::Script);
%End
	QFontMetrics(const QFontMetrics &);

	int ascent() const;
	int descent() const;
	int height() const;
	int leading() const;
	int lineSpacing() const;
	int minLeftBearing() const;
	int minRightBearing() const;
	int maxWidth() const;
%If (- Qt_2_00)
	bool inFont(char) const;
	int leftBearing(char) const;
	int rightBearing(char) const;
	int width(const char *,int = -1) const;
	int width(char) const;
	QRect boundingRect(const char *,int = -1) const;
	QRect boundingRect(char) const;

	QRect boundingRect(int,int,int,int,int,const char *,int = -1,
			   SIP_PYLIST /AllowNone/ = 0) const;
%MethodCode
		int *tabarray;

		if (intListToArray(a8,&tabarray) < 0)
			sipIsErr = 1;
		else
		{
			Py_BEGIN_ALLOW_THREADS
			sipRes = new QRect(sipCpp -> QFontMetrics::boundingRect(a0,a1,a2,a3,a4,a5,a6,a7,tabarray));
			Py_END_ALLOW_THREADS

			if (tabarray)
				sipFree((ANY *)tabarray);
		}
%End

	QSize size(int,const char *,int = -1,int = 0,
		   SIP_PYLIST /AllowNone/ = 0) const;
%MethodCode
		int *tabarray;

		if (intListToArray(a4,&tabarray) < 0)
			sipIsErr = 1;
		else
		{
			Py_BEGIN_ALLOW_THREADS
			sipRes = new QSize(sipCpp -> QFontMetrics::size(a0,a1,a2,a3,tabarray));
			Py_END_ALLOW_THREADS

			if (tabarray)
				sipFree((ANY *)tabarray);
		}
%End
%End
%If (Qt_2_00 -)
	bool inFont(QChar) const;
	int leftBearing(QChar) const;
	int rightBearing(QChar) const;
	int width(const QString &,int = -1) const;
	int width(QChar) const;
%If (Qt_3_0_0 -)
	int charWidth(const QString &,int) const;
%End
	QRect boundingRect(const QString &,int = -1) const;
	QRect boundingRect(QChar) const;

	QRect boundingRect(int,int,int,int,int,const QString &,int = -1,
			   int = 0,SIP_PYLIST /AllowNone/ = 0) const;
%MethodCode
		int *tabarray;

		if (intListToArray(a8,&tabarray) < 0)
			sipIsErr = 1;
		else
		{
			Py_BEGIN_ALLOW_THREADS
			sipRes = new QRect(sipCpp -> QFontMetrics::boundingRect(a0,a1,a2,a3,a4,*a5,a6,a7,tabarray));
			Py_END_ALLOW_THREADS

			if (tabarray)
				sipFree((ANY *)tabarray);
		}
%End

	QSize size(int,const QString &,int = -1,int = 0,
		   SIP_PYLIST /AllowNone/ = 0) const;
%MethodCode
		int *tabarray;

		if (intListToArray(a4,&tabarray) < 0)
			sipIsErr = 1;
		else
		{
			Py_BEGIN_ALLOW_THREADS
			sipRes = new QSize(sipCpp -> QFontMetrics::size(a0,*a1,a2,a3,tabarray));
			Py_END_ALLOW_THREADS

			if (tabarray)
				sipFree((ANY *)tabarray);
		}
%End
%End

	int underlinePos() const;
%If (Qt_3_2_0 -)
	int overlinePos() const;
%End
	int strikeOutPos() const;
	int lineWidth() const;

%TypeCode
// Convert an optional Python list of integers to a zero terminated array.
// Return a negative value if there was an error.
static int intListToArray(PyObject *pl,int **ap)
{
	int i, nint, *ip;

	// The trivial case.
	if (!pl || pl == Py_None)
	{
		*ap = 0;
		return 0;
	}

	nint = PyList_Size(pl);

	if ((*ap = (int *)sipMalloc((nint + 1) * sizeof (int))) == NULL)
		return -1;

	// Convert the list.
	PyErr_Clear();

	ip = *ap;

	for (i = 0; i < nint; ++i)
	{
		*ip++ = PyInt_AsLong(PyList_GetItem(pl,i));

		if (PyErr_Occurred())
		{
			sipFree((ANY *)*ap);
			return -1;
		}
	}

	// Terminate the list.
	*ip = 0;

	return 0;
}
%End

};
