// This is the SIP interface definition for QGL, QGLContext, QGLFormat and
// QGLWidget.
//
// 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>QGL</Title>
<Para>
<Literal>QGL</Literal> is fully implemented.
</Para>
</Sect2>
 
<Sect2><Title>QGLContext</Title>
<Para>
<Literal>QGLContext</Literal> is fully implemented.
</Para>
</Sect2>
 
<Sect2><Title>QGLFormat</Title>
<Para>
<Literal>QGLFormat</Literal> is fully implemented.
</Para>
</Sect2>
 
<Sect2><Title>QGLWidget</Title>
<Para>
<Literal>QGLWidget</Literal> is fully implemented.
</Para>
</Sect2>
%End


%If (Qt_2_00 -)

const int QGL_VERSION;
const char *QGL_VERSION_STR;

const char *qGLVersion();


class QGL
{
%HeaderCode
#include <qgl.h>
%End

public:
	enum FormatOption {
		DoubleBuffer,
		DepthBuffer,
		Rgba,
		AlphaChannel,
		AccumBuffer,
		StencilBuffer,
		StereoBuffers,
		DirectRendering,
		HasOverlay,
		SingleBuffer,
		NoDepthBuffer,
		ColorIndex,
		NoAlphaChannel,
		NoAccumBuffer,
		NoStencilBuffer,
		NoStereoBuffers,
		IndirectRendering,
		NoOverlay
	};
};


class QGLFormat : QGL
{
%HeaderCode
#include <qgl.h>
%End

public:
	QGLFormat();
	QGLFormat(int,int = 0);

	bool doubleBuffer() const;
	void setDoubleBuffer(bool);
	bool depth() const;
	void setDepth(bool);
	bool rgba() const;
	void setRgba(bool);
	bool alpha() const;
	void setAlpha(bool);
	bool accum() const;
	void setAccum(bool);
	bool stencil() const;
	void setStencil(bool);
	bool stereo() const;
	void setStereo(bool);
	bool directRendering() const;
	void setDirectRendering(bool);
	bool hasOverlay() const;
	void setOverlay(bool);

	int plane() const;
	void setPlane(int);

	void setOption(FormatOption);
	bool testOption(FormatOption) const;
    
	static QGLFormat defaultFormat();
	static void setDefaultFormat(const QGLFormat &);

	static QGLFormat defaultOverlayFormat();
	static void setDefaultOverlayFormat(const QGLFormat &);

	static bool hasOpenGL();
	static bool hasOpenGLOverlays();
};


class QGLContext : QGL
{
%HeaderCode
#include <qgl.h>
%End

public:
	QGLContext(const QGLFormat &,QPaintDevice *);

	virtual bool create(const QGLContext * = 0);
	bool isValid() const;
	bool isSharing() const;
	virtual void reset();

	QGLFormat format() const;
%If (Qt_3_0_0 -)
	QGLFormat requestedFormat() const;
%End
	virtual void setFormat(const QGLFormat &);

	virtual void makeCurrent();
	virtual void swapBuffers() const;

	QPaintDevice *device() const;

	QColor overlayTransparentColor() const;

	static const QGLContext *currentContext();

protected:
	virtual bool chooseContext(const QGLContext * = 0);
	virtual void doneCurrent();
    
%If (WS_X11)
	virtual void *tryVisual(const QGLFormat &,int = 1);
	virtual void *chooseVisual();
%End

	bool deviceIsPixmap() const;
	bool windowCreated() const;
	void setWindowCreated(bool);
	bool initialized() const;
	void setInitialized(bool);
%If (Qt_3_1_0 -)
	void generateFontDisplayLists(const QFont &,int);
%End

	uint colorIndex(const QColor &) const;

private:
	QGLContext();
	QGLContext(const QGLContext &);
};


class QGLWidget : QWidget, QGL
{
%HeaderCode
#include <qgl.h>
%End

public:
	QGLWidget(QWidget * /TransferThis/ = 0,const char * = 0,
		  const QGLWidget * = 0,WFlags = 0);
	QGLWidget(const QGLFormat &,QWidget * /TransferThis/ = 0,
		  const char * = 0,const QGLWidget * = 0,WFlags = 0);

%ConvertToSubClassCode
	// The table of Python class objects indexed by their names.  The table
	// must be sorted by name.

	static sipStringTypeClassMap map[] = {
		{sipName_QGLWidget,		&sipClass_QGLWidget},
	};

	sipClass = sipMapStringToClass(sipCpp -> className(),map,
				       sizeof (map)/sizeof (map[0]));
%End

	void qglColor(const QColor &) const;
	void qglClearColor(const QColor &) const;

	bool isValid() const;
	bool isSharing() const;
	virtual void makeCurrent();

	bool doubleBuffer() const;
	virtual void swapBuffers();

	QGLFormat format() const;

	const QGLContext *context() const;

	virtual QPixmap renderPixmap(int = 0,int = 0,bool = 0);
%If (Qt_3_0_0 -)
	virtual QImage grabFrameBuffer(bool = 0);
%End

	virtual void makeOverlayCurrent();
	const QGLContext *overlayContext() const;

	static QImage convertToGLFormat(const QImage &);

	void setMouseTracking(bool);

%If (Qt_3_0_0 -)
        virtual void reparent(QWidget *,WFlags,const QPoint &,bool = 0);
%MemberCode
#if SIP_MAJOR_NR >= 4
	// FIXME
#else
		sipThisType *sipThis;
		QWidget *a0;
		unsigned a1;
		const QPoint *a2;
		long a3 = 0;

		if (sipParseArgs(&sipArgsParsed,sipArgs,"tJ0iJ1|l",sipThisObj,sipClass_QWidget,&sipThis,sipClass_QWidget,&a0,&a1,sipClass_QPoint,&a2,&a3))
		{
			QGLWidget *ptr;

			if ((ptr = (QGLWidget *)sipGetCppPtr(sipThis,sipClass_QGLWidget)) == NULL)
				return NULL;

			QObject *oparent = ptr -> parent();

			/* Give ownership if it has acquired a parent. */

			if (!oparent && a0)
				sipTransferSelf(sipThis -> sipSelf,1);

			Py_BEGIN_ALLOW_THREADS
			ptr -> QGLWidget::reparent(a0,a1,*a2,(bool)a3);
			Py_END_ALLOW_THREADS

			/* Take ownership if it has lost a parent. */

			if (oparent && !a0)
				sipTransferSelf(sipThis -> sipSelf,0);

			Py_INCREF(Py_None);
			return Py_None;
		}
#endif
%End

	const QGLColormap &colormap() const;
	void setColormap(const QGLColormap &);
%End

%If (Qt_3_1_0 -)
	void renderText(int,int,const QString &,const QFont & = QFont(),
			int = 2000);
	void renderText(double,double,double,const QString &,
			const QFont & = QFont(),int = 2000);
%End

public slots:
	virtual void updateGL();
	virtual void updateOverlayGL();

protected:
	virtual void initializeGL();
	virtual void resizeGL(int,int);
	virtual void paintGL();

	virtual void initializeOverlayGL();
	virtual void resizeOverlayGL(int,int);
	virtual void paintOverlayGL();

	void setAutoBufferSwap(bool);
	bool autoBufferSwap() const;

	void paintEvent(QPaintEvent *);
	void resizeEvent(QResizeEvent *);

	virtual void glInit();
	virtual void glDraw();

private:
	QGLWidget(const QGLWidget &);
};

%End
