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

#ifndef BGLVIEW_H
#define BGLVIEW_H

// added by Brian Paul:
#ifndef BGL_RGB
#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
#endif


#include <GL/gl.h>
#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();

        // Added for Mesa (can't be virtual!)
        void CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height);

	BView *     EmbeddedView();
	status_t    CopyPixelsOut(BPoint source, BBitmap *dest);
	status_t    CopyPixelsIn(BBitmap *source, BPoint dest);

	virtual void        ErrorCallback(unsigned long errorCode); // GLenum errorCode);
		
	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 );

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;
#if OLD_GLVIEW
	BView *		m_embeddedFront;
	BView *     m_embeddedBack;
#else
	void *		m_clip_info;
	void *     	_reserved1;
#endif
	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





