- fallback to non-sRGB visuals if the context creation failed (GLX-only)

- added new glutGet query: GLUT_WINDOW_SRGB (untested on windows)


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1842 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
jtsiomb 2018-04-02 03:16:50 +00:00
parent 20e9df4141
commit 89c58f2256
4 changed files with 43 additions and 0 deletions

View File

@ -92,6 +92,8 @@
#define GLUT_ALLOW_NEGATIVE_WINDOW_POSITION 0x0207 /* GLUT doesn't allow negative window positions by default */ #define GLUT_ALLOW_NEGATIVE_WINDOW_POSITION 0x0207 /* GLUT doesn't allow negative window positions by default */
#define GLUT_WINDOW_SRGB 0x007D
/* /*
* New tokens for glutInitDisplayMode. * New tokens for glutInitDisplayMode.
* Only one GLUT_AUXn bit may be used at a time. * Only one GLUT_AUXn bit may be used at a time.

View File

@ -46,7 +46,14 @@ extern void fghComputeWindowRectFromClientArea_UseStyle( RECT *clientRect, const
* #include <GL/wglext.h> * #include <GL/wglext.h>
* So we copy the necessary parts out of it to support the multisampling query * So we copy the necessary parts out of it to support the multisampling query
*/ */
#ifndef WGL_SAMPLES_ARB
#define WGL_SAMPLES_ARB 0x2042 #define WGL_SAMPLES_ARB 0x2042
#endif
#ifndef WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB
#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
#endif
typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
#if defined(_WIN32_WCE) #if defined(_WIN32_WCE)
# include <Aygshell.h> # include <Aygshell.h>
@ -284,6 +291,25 @@ int fgPlatformGlutGet ( GLenum eWhat )
#endif /* defined(_WIN32_WCE) */ #endif /* defined(_WIN32_WCE) */
return 0; return 0;
case GLUT_WINDOW_SRGB:
if( fgStructure.CurrentWindow != NULL ) {
static int attr = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB;
static PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB;
HDC hdc = fgStructure.CurrentWindow->Window.pContext.Device;
int ipixfmt = GetPixelFormat(hdc);
int val;
if(!wglGetPixelFormatAttribivARB) {
if(!(wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)wglGetProcAddress("wglGetPixelFormatAttribivARB"))) {
return 0;
}
}
if(wglGetPixelFormatAttribivARB(hdc, ipixfmt, 0, 1, &attr, &val)) {
return val;
}
}
return 0;
default: default:
fgWarning( "glutGet(): missing enum handle %d", eWhat ); fgWarning( "glutGet(): missing enum handle %d", eWhat );
break; break;

View File

@ -83,6 +83,7 @@ int fghPlatformGlutGetGLX ( GLenum eWhat )
GLX_QUERY( GLUT_WINDOW_ACCUM_BLUE_SIZE, GLX_ACCUM_BLUE_SIZE ); GLX_QUERY( GLUT_WINDOW_ACCUM_BLUE_SIZE, GLX_ACCUM_BLUE_SIZE );
GLX_QUERY( GLUT_WINDOW_ACCUM_ALPHA_SIZE, GLX_ACCUM_ALPHA_SIZE ); GLX_QUERY( GLUT_WINDOW_ACCUM_ALPHA_SIZE, GLX_ACCUM_ALPHA_SIZE );
GLX_QUERY( GLUT_WINDOW_STEREO, GLX_STEREO ); GLX_QUERY( GLUT_WINDOW_STEREO, GLX_STEREO );
GLX_QUERY( GLUT_WINDOW_SRGB, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB);
# undef GLX_QUERY # undef GLX_QUERY

View File

@ -182,6 +182,8 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
fgState.DisplayMode |= GLUT_DOUBLE ; fgState.DisplayMode |= GLUT_DOUBLE ;
fghChooseConfig(&WINDOW_CONFIG); fghChooseConfig(&WINDOW_CONFIG);
fgState.DisplayMode &= ~GLUT_DOUBLE; fgState.DisplayMode &= ~GLUT_DOUBLE;
if( WINDOW_CONFIG ) goto done_retry;
} }
#endif #endif
@ -190,8 +192,20 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
fgState.DisplayMode &= ~GLUT_MULTISAMPLE ; fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;
fghChooseConfig(&WINDOW_CONFIG); fghChooseConfig(&WINDOW_CONFIG);
fgState.DisplayMode |= GLUT_MULTISAMPLE; fgState.DisplayMode |= GLUT_MULTISAMPLE;
if( WINDOW_CONFIG ) goto done_retry;
}
if( fgState.DisplayMode & GLUT_SRGB )
{
fgState.DisplayMode &= ~GLUT_SRGB ;
fghChooseConfig(&WINDOW_CONFIG);
fgState.DisplayMode |= GLUT_SRGB;
if( WINDOW_CONFIG ) goto done_retry;
} }
} }
done_retry:
FREEGLUT_INTERNAL_ERROR_EXIT( WINDOW_CONFIG != NULL, FREEGLUT_INTERNAL_ERROR_EXIT( WINDOW_CONFIG != NULL,
"FBConfig with necessary capabilities not found", "fgOpenWindow" ); "FBConfig with necessary capabilities not found", "fgOpenWindow" );