// This is the SIP interface definition for TQGL, TQGLContext, TQGLFormat and
// TQGLWidget.
//
// 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>TQGL</Title>
<Para>
<Literal>TQGL</Literal> is fully implemented.
</Para>
</Sect2>
 
<Sect2><Title>TQGLContext</Title>
<Para>
<Literal>TQGLContext</Literal> is fully implemented.
</Para>
</Sect2>
 
<Sect2><Title>TQGLFormat</Title>
<Para>
<Literal>TQGLFormat</Literal> is fully implemented.
</Para>
</Sect2>
 
<Sect2><Title>TQGLWidget</Title>
<Para>
<Literal>TQGLWidget</Literal> is fully implemented.
</Para>
</Sect2>
%End


const int TQGL_VERSION;
const char *TQGL_VERSION_STR;

const char *qGLVersion();


class TQGL
{
%TypeHeaderCode
#include <tqgl.h>
%End

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


class TQGLFormat : TQGL
{
%TypeHeaderCode
#include <tqgl.h>
%End

public:
	TQGLFormat();
	TQGLFormat(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 TQGLFormat defaultFormat();
	static void setDefaultFormat(const TQGLFormat &);

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

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


class TQGLContext : TQGL
{
%TypeHeaderCode
#include <tqgl.h>
%End

public:
	TQGLContext(const TQGLFormat &,TQPaintDevice *);
	TQGLContext(const TQGLFormat &);

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

	TQGLFormat format() const;
	TQGLFormat requestedFormat() const;
	virtual void setFormat(const TQGLFormat &);

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

	TQPaintDevice *device() const;

	TQColor overlayTransparentColor() const;

	static const TQGLContext *currentContext();

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

	bool deviceIsPixmap() const;
	bool windowCreated() const;
	void setWindowCreated(bool);
	bool initialized() const;
	void setInitialized(bool);
	void generateFontDisplayLists(const TQFont &,int);

	uint colorIndex(const TQColor &) const;
	void setValid(bool);
	void setDevice(TQPaintDevice *);

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


class TQGLWidget : TQWidget, TQGL
{
%TypeHeaderCode
#include <tqgl.h>
%End

public:
	TQGLWidget(TQWidget * /TransferThis/ = 0,const char * = 0,
		  const TQGLWidget * = 0,WFlags = 0);
	TQGLWidget(TQGLContext * /Transfer/,TQWidget * /TransferThis/ = 0,const char * = 0,
		  const TQGLWidget * = 0,WFlags = 0);
	TQGLWidget(const TQGLFormat &,TQWidget * /TransferThis/ = 0,
		  const char * = 0,const TQGLWidget * = 0,WFlags = 0);

%ConvertToSubClassCode
	sipClass = (sipCpp->inherits(sipName_TQGLWidget) ? sipClass_TQGLWidget : NULL);
%End

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

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

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

	TQGLFormat format() const;

	const TQGLContext *context() const;

	virtual TQPixmap renderPixmap(int = 0,int = 0,bool = 0);
	virtual TQImage grabFrameBuffer(bool = 0);

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

	static TQImage convertToGLFormat(const TQImage &);

	void setMouseTracking(bool);

	virtual void reparent(TQWidget * /GetWrapper/,WFlags,const TQPoint &,
			      bool = 0);
%MethodCode
		if (sipCpp -> parent() != a0)
			if (a0)
				sipTransferTo(sipSelf,a0Wrapper);
			else
				sipTransferBack(sipSelf);

		Py_BEGIN_ALLOW_THREADS
		sipSelfWasArg ? sipCpp->TQGLWidget::reparent(a0, a1, *a2, a3) : sipCpp->reparent(a0, a1, *a2, a3);
		Py_END_ALLOW_THREADS
%End

	const TQGLColormap &colormap() const;
	void setColormap(const TQGLColormap &);

	void renderText(int,int,const TQString &,const TQFont & = TQFont(),
			int = 2000);
	void renderText(double,double,double,const TQString &,
			const TQFont & = TQFont(),int = 2000);

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(TQPaintEvent *);
	void resizeEvent(TQResizeEvent *);

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

private:
	TQGLWidget(const TQGLWidget &);
};
