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 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
|
/*
** ClanLib SDK
** Copyright (c) 1997-2005 The ClanLib Team
**
** This software is provided 'as-is', without any express or implied
** warranty. In no event will the authors be held liable for any damages
** arising from the use of this software.
**
** Permission is granted to anyone to use this software for any purpose,
** including commercial applications, and to alter it and redistribute it
** freely, subject to the following restrictions:
**
** 1. The origin of this software must not be misrepresented; you must not
** claim that you wrote the original software. If you use this software
** in a product, an acknowledgment in the product documentation would be
** appreciated but is not required.
** 2. Altered source versions must be plainly marked as such, and must not be
** misrepresented as being the original software.
** 3. This notice may not be removed or altered from any source distribution.
**
** Note: Some of the libraries ClanLib may link to may have additional
** requirements or restrictions.
**
** File Author(s):
**
** Magnus Norddahl
** (if your name is missing here, please add it)
*/
#ifndef header_canvas_opengl
#define header_canvas_opengl
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef WIN32
#include <windows.h>
#endif
#include "Display/canvas_generic.h"
#ifdef WIN32
#ifndef WGL_DRAW_TO_PBUFFER_ARB
#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
#define WGL_PBUFFER_LARGEST_ARB 0x2033
#define WGL_PBUFFER_WIDTH_ARB 0x2034
#define WGL_PBUFFER_HEIGHT_ARB 0x2035
#define WGL_PBUFFER_LOST_ARB 0x2036
DECLARE_HANDLE(HPBUFFERARB);
#endif
#else
#ifdef __APPLE__
#include "AGL/display_window_opengl.h"
#include <AGL/agl.h>
#else
#include "GLX/display_window_opengl.h"
#ifndef GLX_MAX_PBUFFER_WIDTH_SGIX
#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
#define GLX_PBUFFER_BIT_SGIX 0x00000004
#define GLX_WIDTH_SGIX 0x801D
#define GLX_HEIGHT_SGIX 0x801E
#define GLX_EVENT_MASK_SGIX 0x801F
#define GLX_DAMAGED_SGIX 0x8020
#define GLX_SAVED_SGIX 0x8021
#endif
#ifndef GLX_DRAWABLE_TYPE_SGIX
#define GLX_DRAWABLE_TYPE_SGIX 0x8010
#define GLX_RENDER_TYPE_SGIX 0x8011
#define GLX_X_RENDERABLE_SGIX 0x8012
typedef __GLXFBConfigRec * GLXFBConfigSGIX;
#endif
#endif
#endif
class CL_Surface_Target_OpenGL;
class CL_Canvas_OpenGL : public CL_Canvas_Generic
{
//! Construction:
public:
CL_Canvas_OpenGL();
virtual ~CL_Canvas_OpenGL();
//! Attributes:
public:
virtual CL_GraphicContext *get_gc();
virtual CL_PixelBuffer get_pixeldata(const CL_Rect &area);
virtual int get_width() const;
virtual int get_height() const;
#ifdef WIN32
HPBUFFERARB get_pbuffer() { return pbuffer; }
HGLRC get_pbuffer_context() { return pbuffer_context; }
HDC get_pbuffer_dc() { return pbuffer_dc; }
#else
#ifdef __APPLE__
AGLPbuffer get_pbuffer() { return pbuffer; }
AGLContext get_pbuffer_context() { return pbuffer_context; }
#else
GLXPbuffer get_pbuffer() { return pbuffer; }
GLXContext get_pbuffer_context() { return pbuffer_context; }
#endif
#endif
//! Operations:
public:
virtual void set_pixeldata(const CL_Point &dest, const CL_Rect &src, const CL_PixelBuffer &data);
virtual void select_surface(CL_Surface_Generic *surface);
virtual void sync_surface();
void sync_pbuffer();
void sync_texture();
void set_pbuffer_modified();
//! Implementation:
private:
CL_Surface_Target_OpenGL *selected_surface;
CL_GraphicContext *gc;
//: OpenGL ARB PBuffer sync flags:
bool pbuffer_changed, texture_changed;
#ifdef WIN32
HPBUFFERARB pbuffer;
HGLRC pbuffer_context;
HDC pbuffer_dc;
#else
#ifdef __APPLE__
AGLPbuffer pbuffer;
AGLContext pbuffer_context;
#else
GLXPbuffer pbuffer;
GLXContext pbuffer_context;
#endif
#endif
// OpenGL pbuffer binding evilness:
#ifdef WIN32
typedef HPBUFFERARB (APIENTRY *ptr_wglCreatePbufferARB)(
HDC hDC,
int iPixelFormat,
int iWidth,
int iHeight,
const int *piAttribList);
typedef HDC (APIENTRY *ptr_wglGetPbufferDCARB)(
HPBUFFERARB hPbuffer);
typedef int (APIENTRY *ptr_wglReleasePbufferDCARB)(
HPBUFFERARB hPbuffer,
HDC hDC);
typedef BOOL (APIENTRY *ptr_wglDestroyPbufferARB)(
HPBUFFERARB hPbuffer);
typedef BOOL (APIENTRY *ptr_wglQueryPbufferARB)(
HPBUFFERARB hPbuffer,
int iAttribute,
int *piValue);
static ptr_wglCreatePbufferARB wglCreatePbufferARB;
static ptr_wglGetPbufferDCARB wglGetPbufferDCARB;
static ptr_wglReleasePbufferDCARB wglReleasePbufferDCARB;
static ptr_wglDestroyPbufferARB wglDestroyPbufferARB;
static ptr_wglQueryPbufferARB wglQueryPbufferARB;
#else
#ifndef __APPLE__
typedef GLXPbuffer (*ptr_glXCreateGLXPbufferSGIX)(
Display *dpy,
GLXFBConfig config,
unsigned int width,
unsigned int height,
int *attrib_list);
typedef void (*ptr_glXDestroyGLXPbufferSGIX)(
Display *dpy,
GLXPbuffer pbuf);
typedef void (*ptr_glXQueryGLXPbufferSGIX)(
Display *dpy,
GLXPbuffer pbuf,
int attribute,
unsigned int *value);
typedef void (*ptr_glXSelectEventSGIX)(
Display *dpy,
GLXDrawable drawable,
unsigned long mask);
typedef void (*ptr_glXGetSelectedEventSGIX)(
Display *dpy,
GLXDrawable drawable,
unsigned long *mask);
typedef GLXFBConfigSGIX *(*ptr_glXChooseFBConfigSGIX)(
Display *dpy,
int screen,
const int *attrib_list,
int *nelements);
typedef GLXContext (*ptr_glXCreateContextWithConfigSGIX)(
Display *dpy,
GLXFBConfig config,
int render_type,
GLXContext share_list,
Bool direct);
static ptr_glXCreateGLXPbufferSGIX glXCreateGLXPbufferSGIX;
static ptr_glXDestroyGLXPbufferSGIX glXDestroyGLXPbufferSGIX;
static ptr_glXQueryGLXPbufferSGIX glXQueryGLXPbufferSGIX;
static ptr_glXSelectEventSGIX glXSelectEventSGIX;
static ptr_glXGetSelectedEventSGIX glXGetSelectedEventSGIX;
static ptr_glXChooseFBConfigSGIX glXChooseFBConfigSGIX;
static ptr_glXCreateContextWithConfigSGIX glXCreateContextWithConfigSGIX;
#endif
#endif
};
#endif
|