/*******************************************************************************
/
/	File:		GLView.h
/
/	Copyright 1993-98, Be Incorporated, All Rights Reserved.
/
*******************************************************************************/

#ifndef BGLVIEW_H
#define BGLVIEW_H

#include <GL/gl.h>

#define BGL_RGB			0
#define BGL_INDEX		1 
#define BGL_SINGLE		0
#define BGL_DOUBLE		2
#define BGL_DIRECT		0
#define BGL_INDIRECT	4
#define BGL_ACCUM		8
#define BGL_ALPHA		16
#define BGL_DEPTH		32
#define BGL_OVERLAY		64
#define BGL_UNDERLAY	128
#define BGL_STENCIL		512

#ifdef __cplusplus


#include <AppKit.h>
#include <interface/Window.h>
#include <interface/View.h>
#include <interface/Bitmap.h>
#include <game/WindowScreen.h>
#include <game/DirectWindow.h>

class BGLView : public BView {
public:

					BGLView(BRect rect, char *name,
						ulong resizingMode, ulong mode,
						ulong options);
virtual 			~BGLView();

		void		LockGL();
		void		UnlockGL();
		void		SwapBuffers();
		void		SwapBuffers( bool vSync );
		BView *     EmbeddedView();
		status_t    CopyPixelsOut(BPoint source, BBitmap *dest);
		status_t    CopyPixelsIn(BBitmap *source, BPoint dest);
virtual	void        ErrorCallback(unsigned long errorCode); 	// Mesa's GLenum is uint where Be's ones was ulong!
		
virtual	void		Draw(BRect updateRect);

virtual void		AttachedToWindow();
virtual void        AllAttached();
virtual void        DetachedFromWindow();
virtual void        AllDetached();
 
virtual void		FrameResized(float width, float height);
virtual status_t    Perform(perform_code d, void *arg);

	/* The public methods below, for the moment,
	   are just pass-throughs to BView */

virtual status_t    Archive(BMessage *data, bool deep = true) const;

virtual void        MessageReceived(BMessage *msg);
virtual void        SetResizingMode(uint32 mode);

virtual void        Show();
virtual void        Hide();

virtual BHandler   *ResolveSpecifier(BMessage *msg, int32 index,
							BMessage *specifier, int32 form,
							const char *property);
virtual status_t    GetSupportedSuites(BMessage *data);

/* New public functions */
		void		DirectConnected( direct_buffer_info *info );
		void		EnableDirectMode( bool enabled );

		void *		getGC()	{ return m_gc; }
		
private:

virtual void        _ReservedGLView1();
virtual void        _ReservedGLView2(); 
virtual void        _ReservedGLView3(); 
virtual void        _ReservedGLView4(); 
virtual void        _ReservedGLView5(); 
virtual void        _ReservedGLView6(); 
virtual void        _ReservedGLView7(); 
virtual void        _ReservedGLView8(); 

					BGLView(const BGLView &);
					BGLView     &operator=(const BGLView &);

		void        dither_front();
		bool        confirm_dither();
		void        draw(BRect r);
		
		void *		m_gc;
		uint32		m_options;
		uint32      m_ditherCount;
		BLocker		m_drawLock;
		BLocker     m_displayLock;
		void *		m_clip_info;
		void *     	_Unused1;

		BBitmap *   m_ditherMap;
		BRect       m_bounds;
		int16 *     m_errorBuffer[2];
		uint64      _reserved[8];

	/* Direct Window stuff */
private:	
		void 		drawScanline( int x1, int x2, int y, void *data );
static 	void 		scanlineHandler(struct rasStateRec *state, GLint x1, GLint x2);

		void		lock_draw();
		void		unlock_draw();
		bool		validateView();
};



class BGLScreen : public BWindowScreen {
public:
	BGLScreen(char *name,
			ulong screenMode, ulong options,
			status_t *error, bool debug=false);
	~BGLScreen();

	void		LockGL();
	void		UnlockGL();
	void		SwapBuffers();
	virtual void        ErrorCallback(GLenum errorCode);

	virtual void		ScreenConnected(bool connected);
	virtual void		FrameResized(float width, float height);
	virtual status_t    Perform(perform_code d, void *arg);

	/* The public methods below, for the moment,
	   are just pass-throughs to BWindowScreen */

	virtual status_t    Archive(BMessage *data, bool deep = true) const;
	virtual void        MessageReceived(BMessage *msg);

	virtual void        Show();
	virtual void        Hide();

	virtual BHandler   *ResolveSpecifier(BMessage *msg,
                        int32 index,
						BMessage *specifier,
						int32 form,
						const char *property);
	virtual status_t    GetSupportedSuites(BMessage *data);

private:

	virtual void        _ReservedGLScreen1();
	virtual void        _ReservedGLScreen2();
	virtual void        _ReservedGLScreen3();
	virtual void        _ReservedGLScreen4();
	virtual void        _ReservedGLScreen5();
	virtual void        _ReservedGLScreen6();
	virtual void        _ReservedGLScreen7();
	virtual void        _ReservedGLScreen8(); 

	BGLScreen(const BGLScreen &);
	BGLScreen   &operator=(const BGLScreen &);

	void *		m_gc;
	long		m_options;
	BLocker		m_drawLock;
		
	int32		m_colorSpace;
	uint32		m_screen_mode;
		
	uint64      _reserved[7];
};

#endif	// __cplusplus

#endif	// BGLVIEW_H