// This is the SIP interface definition for QGL, QGLContext, QGLFormat and
// QGLWidget.
//
// 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>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
{
%TypeHeaderCode
#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
{
%TypeHeaderCode
#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
{
%TypeHeaderCode
#include <qgl.h>
%End

public:
	QGLContext(const QGLFormat &,QPaintDevice *);
%If (Qt_3_2_0 -)
	QGLContext(const QGLFormat &);
%End

	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;
%If (Qt_3_2_0 -)
	void setValid(bool);
	void setDevice(QPaintDevice *);
%End

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


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

public:
	QGLWidget(QWidget * /TransferThis/ = 0,const char * = 0,
		  const QGLWidget * = 0,WFlags = 0);
%If (Qt_3_2_0 -)
	QGLWidget(QGLContext * /Transfer/,QWidget * /TransferThis/ = 0,const char * = 0,
		  const QGLWidget * = 0,WFlags = 0);
%End
	QGLWidget(const QGLFormat &,QWidget * /TransferThis/ = 0,
		  const char * = 0,const QGLWidget * = 0,WFlags = 0);

%ConvertToSubClassCode
	sipClass = (sipCpp->inherits(sipName_QGLWidget) ? sipClass_QGLWidget : NULL);
%End

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

	bool isValid() const;
	bool isSharing() const;
	virtual void makeCurrent();
%If (Qt_3_2_0 -)
	void doneCurrent();
%End

	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 * /GetWrapper/,WFlags,const QPoint &,
			      bool = 0);
%MethodCode
		if (sipCpp -> parent() != a0)
			if (a0)
				sipTransferTo(sipSelf,a0Wrapper);
			else
				sipTransferBack(sipSelf);

		Py_BEGIN_ALLOW_THREADS
		sipSelfWasArg ? sipCpp->QGLWidget::reparent(a0, a1, *a2, a3) : sipCpp->reparent(a0, a1, *a2, a3);
		Py_END_ALLOW_THREADS
%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
