Completed removal of all support for the offscreen rendering.

If you wish to do offscreen supportin a portable manner, you will
no longer be able to do so with current versions of freeglut.


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@481 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
rkrolib 2004-03-15 06:16:47 +00:00
parent a4e8aad90c
commit b3f3ea2cf0
4 changed files with 112 additions and 169 deletions

View File

@ -67,7 +67,6 @@ AC_OUTPUT(\
progs/demos/Fractals_random/Makefile \ progs/demos/Fractals_random/Makefile \
progs/demos/Lorenz/Makefile \ progs/demos/Lorenz/Makefile \
progs/demos/One/Makefile \ progs/demos/One/Makefile \
progs/demos/offscreen/Makefile \
progs/demos/shapes/Makefile \ progs/demos/shapes/Makefile \
src/Makefile \ src/Makefile \
include/Makefile \ include/Makefile \

View File

@ -45,11 +45,6 @@
#define GLUT_CREATE_NEW_CONTEXT 0 #define GLUT_CREATE_NEW_CONTEXT 0
#define GLUT_USE_CURRENT_CONTEXT 1 #define GLUT_USE_CURRENT_CONTEXT 1
/*
* GLUT API Extension macro definitions -- display mode
*/
#define GLUT_OFFSCREEN 0x0400
/* /*
* GLUT API Extension macro definitions -- the glutGet parameters * GLUT API Extension macro definitions -- the glutGet parameters
*/ */

View File

@ -376,7 +376,6 @@ struct tagSFG_WindowState
GLboolean IsGameMode; /* Is this the game mode window? */ GLboolean IsGameMode; /* Is this the game mode window? */
GLboolean NeedToResize; /* Do we need to resize the window? */ GLboolean NeedToResize; /* Do we need to resize the window? */
GLboolean IsOffscreen; /* Tags a `window' as on/offscreen. */
}; };

View File

@ -308,70 +308,49 @@ void fgOpenWindow( SFG_Window* window, const char* title,
*/ */
assert( window->Window.VisualInfo != NULL ); assert( window->Window.VisualInfo != NULL );
window->State.IsOffscreen = GL_FALSE;
if( fgState.DisplayMode & GLUT_OFFSCREEN ) /*
* XXX HINT: the masks should be updated when adding/removing callbacks.
* XXX This might speed up message processing. Is that true?
* XXX
* XXX A: Not appreciably, but it WILL make it easier to debug.
* XXX Try tracing old GLUT and try tracing freeglut. Old GLUT
* XXX turns off events that it doesn't need and is a whole lot
* XXX more pleasant to trace. (Think mouse-motion! Tons of
* XXX ``bonus'' GUI events stream in.)
*/
winAttr.event_mask =
StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyRelease |
VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |
PointerMotionMask | ButtonMotionMask;
winAttr.background_pixmap = None;
winAttr.background_pixel = 0;
winAttr.border_pixel = 0;
winAttr.colormap = XCreateColormap(
fgDisplay.Display, fgDisplay.RootWindow,
window->Window.VisualInfo->visual, AllocNone
);
mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
if( window->IsMenu )
{ {
window->State.IsOffscreen = GL_TRUE; winAttr.override_redirect = True;
window->Window.Pixmap = XCreatePixmap( mask |= CWOverrideRedirect;
fgDisplay.Display, fgDisplay.RootWindow,
w, h,
window->Window.VisualInfo->depth
);
if( False != window->Window.Pixmap )
{
window->Window.Handle = glXCreateGLXPixmap(
fgDisplay.Display,
window->Window.VisualInfo,
window->Window.Pixmap
);
if( False == window->Window.Handle )
XFreePixmap( fgDisplay.Display, window->Window.Pixmap );
}
} }
else
{
/*
* XXX HINT: the masks should be updated when adding/removing callbacks.
* XXX This might speed up message processing. Is that true?
* XXX
* XXX A: Not appreciably, but it WILL make it easier to debug.
* XXX Try tracing old GLUT and try tracing freeglut. Old GLUT
* XXX turns off events that it doesn't need and is a whole lot
* XXX more pleasant to trace. (Think mouse-motion! Tons of
* XXX ``bonus'' GUI events stream in.)
*/
winAttr.event_mask =
StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyRelease |
VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |
PointerMotionMask | ButtonMotionMask;
winAttr.background_pixmap = None;
winAttr.background_pixel = 0;
winAttr.border_pixel = 0;
winAttr.colormap = XCreateColormap( window->Window.Handle = XCreateWindow(
fgDisplay.Display, fgDisplay.RootWindow, fgDisplay.Display,
window->Window.VisualInfo->visual, AllocNone window->Parent == NULL ? fgDisplay.RootWindow :
); window->Parent->Window.Handle,
x, y, w, h, 0,
window->Window.VisualInfo->depth, InputOutput,
window->Window.VisualInfo->visual, mask,
&winAttr
);
mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
if ( window->IsMenu )
{
winAttr.override_redirect = True;
mask |= CWOverrideRedirect;
}
window->Window.Handle = XCreateWindow(
fgDisplay.Display,
window->Parent == NULL ? fgDisplay.RootWindow :
window->Parent->Window.Handle,
x, y, w, h, 0,
window->Window.VisualInfo->depth, InputOutput,
window->Window.VisualInfo->visual, mask,
&winAttr
);
}
/* /*
* The GLX context creation, possibly trying the direct context rendering * The GLX context creation, possibly trying the direct context rendering
* or else use the current context if the user has so specified * or else use the current context if the user has so specified
@ -453,30 +432,27 @@ void fgOpenWindow( SFG_Window* window, const char* title,
wmHints.flags = StateHint; wmHints.flags = StateHint;
wmHints.initial_state = fgState.ForceIconic ? IconicState : NormalState; wmHints.initial_state = fgState.ForceIconic ? IconicState : NormalState;
if( GL_FALSE == window->State.IsOffscreen ) /*
{ * Prepare the window and iconified window names...
/* */
* Prepare the window and iconified window names... XStringListToTextProperty( (char **) &title, 1, &textProperty );
*/
XStringListToTextProperty( (char **) &title, 1, &textProperty );
XSetWMProperties( XSetWMProperties(
fgDisplay.Display, fgDisplay.Display,
window->Window.Handle, window->Window.Handle,
&textProperty, &textProperty,
&textProperty, &textProperty,
0, 0,
0, 0,
&sizeHints, &sizeHints,
&wmHints, &wmHints,
NULL NULL
); );
XSetWMProtocols( fgDisplay.Display, window->Window.Handle, XSetWMProtocols( fgDisplay.Display, window->Window.Handle,
&fgDisplay.DeleteWindow, 1 ); &fgDisplay.DeleteWindow, 1 );
XMapWindow( fgDisplay.Display, window->Window.Handle ); XMapWindow( fgDisplay.Display, window->Window.Handle );
}
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
@ -588,13 +564,9 @@ void fgCloseWindow( SFG_Window* window )
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
glXDestroyContext( fgDisplay.Display, window->Window.Context ); glXDestroyContext( fgDisplay.Display, window->Window.Context );
if( GL_FALSE == window->State.IsOffscreen ) glXDestroyGLXPixmap( fgDisplay.Display, window->Window.Handle );
XDestroyWindow( fgDisplay.Display, window->Window.Handle ); XFreePixmap( fgDisplay.Display, window->Window.Pixmap );
else
{
glXDestroyGLXPixmap( fgDisplay.Display, window->Window.Handle );
XFreePixmap( fgDisplay.Display, window->Window.Pixmap );
}
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
@ -650,17 +622,15 @@ int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h )
{ {
int ret = 0; int ret = 0;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen ) SFG_Window* window = NULL;
{ SFG_Window* parent = NULL;
SFG_Window* window = NULL;
SFG_Window* parent = NULL; freeglut_assert_ready;
parent = fgWindowByID( parentID );
freeglut_return_val_if_fail( parent != NULL, 0 );
window = fgCreateWindow( parent, "", x, y, w, h, GL_FALSE, GL_FALSE );
ret = window->ID;
freeglut_assert_ready;
parent = fgWindowByID( parentID );
freeglut_return_val_if_fail( parent != NULL, 0 );
window = fgCreateWindow( parent, "", x, y, w, h, GL_FALSE, GL_FALSE );
ret = window->ID;
}
return ret; return ret;
} }
@ -719,19 +689,17 @@ void FGAPIENTRY glutShowWindow( void )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
XMapWindow( fgDisplay.Display, fgStructure.Window->Window.Handle ); XMapWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW ); ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW );
#endif #endif
}
fgStructure.Window->State.Redisplay = GL_TRUE; fgStructure.Window->State.Redisplay = GL_TRUE;
} }
@ -743,25 +711,23 @@ void FGAPIENTRY glutHideWindow( void )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
if( fgStructure.Window->Parent == NULL ) if( fgStructure.Window->Parent == NULL )
XWithdrawWindow( fgDisplay.Display, XWithdrawWindow( fgDisplay.Display,
fgStructure.Window->Window.Handle, fgStructure.Window->Window.Handle,
fgDisplay.Screen ); fgDisplay.Screen );
else else
XUnmapWindow( fgDisplay.Display, XUnmapWindow( fgDisplay.Display,
fgStructure.Window->Window.Handle ); fgStructure.Window->Window.Handle );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
ShowWindow( fgStructure.Window->Window.Handle, SW_HIDE ); ShowWindow( fgStructure.Window->Window.Handle, SW_HIDE );
#endif #endif
}
fgStructure.Window->State.Redisplay = GL_FALSE; fgStructure.Window->State.Redisplay = GL_FALSE;
} }
@ -774,20 +740,18 @@ void FGAPIENTRY glutIconifyWindow( void )
freeglut_assert_window; freeglut_assert_window;
fgStructure.Window->State.Visible = GL_FALSE; fgStructure.Window->State.Visible = GL_FALSE;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
XIconifyWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, XIconifyWindow( fgDisplay.Display, fgStructure.Window->Window.Handle,
fgDisplay.Screen ); fgDisplay.Screen );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
ShowWindow( fgStructure.Window->Window.Handle, SW_MINIMIZE ); ShowWindow( fgStructure.Window->Window.Handle, SW_MINIMIZE );
#endif #endif
}
fgStructure.Window->State.Redisplay = GL_FALSE; fgStructure.Window->State.Redisplay = GL_FALSE;
} }
@ -798,8 +762,7 @@ void FGAPIENTRY glutSetWindowTitle( const char* title )
{ {
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( ! fgStructure.Window->Parent && if( ! fgStructure.Window->Parent )
( GL_FALSE == fgStructure.Window->State.IsOffscreen ) )
{ {
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
@ -834,8 +797,7 @@ void FGAPIENTRY glutSetIconTitle( const char* title )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( ! fgStructure.Window->Parent && if( ! fgStructure.Window->Parent )
GL_FALSE == fgStructure.Window->State.IsOffscreen )
{ {
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
@ -870,13 +832,9 @@ void FGAPIENTRY glutReshapeWindow( int width, int height )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
/* XXX Could delete/create/set-window-id for offscreen. */ fgStructure.Window->State.NeedToResize = GL_TRUE;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen ) fgStructure.Window->State.Width = width ;
{ fgStructure.Window->State.Height = height;
fgStructure.Window->State.NeedToResize = GL_TRUE;
fgStructure.Window->State.Width = width ;
fgStructure.Window->State.Height = height;
}
} }
/* /*
@ -887,16 +845,15 @@ void FGAPIENTRY glutPositionWindow( int x, int y )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
XMoveWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, XMoveWindow( fgDisplay.Display, fgStructure.Window->Window.Handle,
x, y ); x, y );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
{
RECT winRect; RECT winRect;
GetWindowRect( fgStructure.Window->Window.Handle, &winRect ); GetWindowRect( fgStructure.Window->Window.Handle, &winRect );
@ -908,9 +865,9 @@ void FGAPIENTRY glutPositionWindow( int x, int y )
winRect.bottom - winRect.top, winRect.bottom - winRect.top,
TRUE TRUE
); );
}
#endif #endif
}
} }
/* /*
@ -921,23 +878,20 @@ void FGAPIENTRY glutPushWindow( void )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
XLowerWindow( fgDisplay.Display, fgStructure.Window->Window.Handle ); XLowerWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
SetWindowPos( SetWindowPos(
fgStructure.Window->Window.Handle, fgStructure.Window->Window.Handle,
HWND_BOTTOM, HWND_BOTTOM,
0, 0, 0, 0, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE SWP_NOSIZE | SWP_NOMOVE
); );
#endif #endif
}
} }
/* /*
@ -948,23 +902,20 @@ void FGAPIENTRY glutPopWindow( void )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
XRaiseWindow( fgDisplay.Display, fgStructure.Window->Window.Handle ); XRaiseWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
SetWindowPos( SetWindowPos(
fgStructure.Window->Window.Handle, fgStructure.Window->Window.Handle,
HWND_TOP, HWND_TOP,
0, 0, 0, 0, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE SWP_NOSIZE | SWP_NOMOVE
); );
#endif #endif
}
} }
/* /*
@ -975,7 +926,6 @@ void FGAPIENTRY glutFullScreen( void )
freeglut_assert_ready; freeglut_assert_ready;
freeglut_assert_window; freeglut_assert_window;
if( GL_FALSE == fgStructure.Window->State.IsOffscreen )
{ {
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
int x, y; int x, y;