aboutsummaryrefslogtreecommitdiffstats
path: root/include/HaikuGL/GLView.h
blob: b848578f67af7d71bab7c6292d4d02f3447876bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*
 * Copyright 2008-2013, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * This header defines BGLView, the base class making up
 * the Haiku GL Kit.
 *
 */
#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 <Bitmap.h>
#include <DirectWindow.h>
#include <View.h>
#include <Window.h>
#include <WindowScreen.h>


struct glview_direct_info;
class BGLRenderer;
class GLRendererRoster;

class BGLView : public BView {
public:
							BGLView(BRect rect, const char* name,
								ulong resizingMode, ulong mode,
								ulong options);
	virtual					~BGLView();

			void			LockGL();
			void			UnlockGL();
			void			SwapBuffers();
			void			SwapBuffers(bool vSync);

			BView*			EmbeddedView(); // deprecated, returns NULL
			void*			GetGLProcAddress(const char* procName);

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

	// Mesa's GLenum is uint where Be's ones was ulong!
	virtual	void			ErrorCallback(unsigned long errorCode);

	virtual void			Draw(BRect updateRect);
	virtual void			AttachedToWindow();
	virtual void			AllAttached();
	virtual void			DetachedFromWindow();
	virtual void			AllDetached();

	virtual void			FrameResized(float newWidth, float newHeight);
	virtual status_t		Perform(perform_code d, void *arg);

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

	virtual void			MessageReceived(BMessage *message);
	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);

			void			DirectConnected(direct_buffer_info *info);
			void			EnableDirectMode(bool enabled);

			void*			getGC()	{ return fGc; } // ???

	virtual void			GetPreferredSize(float* width, float* height);

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			_DitherFront();
			bool			_ConfirmDither();
			void			_Draw(BRect rect);
			void			_CallDirectConnected();

			void*			fGc;
			uint32			fOptions;
			uint32			fDitherCount;
			BLocker			fDrawLock;
			BLocker			fDisplayLock;
			glview_direct_info* fClipInfo;

			BGLRenderer*	fRenderer;
			GLRendererRoster* fRoster;

			BBitmap*		fDitherMap;
			BRect			fBounds;
			int16*			fErrorBuffer[2];
			uint64			_reserved[8];

			void			_LockDraw();
			void			_UnlockDraw();

// BeOS compatibility
private:
							BGLView(BRect rect, char* name,
								ulong resizingMode, ulong mode,
								ulong options);
};


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();
							// Mesa's GLenum is uint where Be's ones was ulong!
	virtual	void			ErrorCallback(unsigned long errorCode);

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

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

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

	virtual BHandler*		ResolveSpecifier(BMessage *message,
								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*			fGc;
			long			fOptions;
			BLocker			fDrawLock;

			int32			fColorSpace;
			uint32			fScreenMode;

			uint64			_reserved[7];
};

#endif // __cplusplus

#endif // BGLVIEW_H