- fallback to non-sRGB visuals if the context creation failed (GLX-only)
authorJohn Tsiombikas <nuclear@member.fsf.org>
Mon, 2 Apr 2018 03:16:50 +0000 (03:16 +0000)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Mon, 2 Apr 2018 03:16:50 +0000 (03:16 +0000)
- added new glutGet query: GLUT_WINDOW_SRGB (untested on windows)

git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1842 7f0cb862-5218-0410-a997-914c9d46530a

include/GL/freeglut_ext.h
src/mswin/fg_state_mswin.c
src/x11/fg_state_x11_glx.c
src/x11/fg_window_x11.c

index 9b0ac50..932a16b 100644 (file)
@@ -92,6 +92,8 @@
 
 #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.
  * Only one GLUT_AUXn bit may be used at a time.
index b8f3e00..98468f5 100644 (file)
@@ -46,7 +46,14 @@ extern void fghComputeWindowRectFromClientArea_UseStyle( RECT *clientRect, const
  *   #include <GL/wglext.h>
  * So we copy the necessary parts out of it to support the multisampling query
  */
+#ifndef WGL_SAMPLES_ARB
 #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)
 #   include <Aygshell.h>
@@ -284,6 +291,25 @@ int fgPlatformGlutGet ( GLenum eWhat )
 #endif /* defined(_WIN32_WCE) */
         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:
         fgWarning( "glutGet(): missing enum handle %d", eWhat );
         break;
index 1b8dd18..2a50e77 100644 (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_ALPHA_SIZE,    GLX_ACCUM_ALPHA_SIZE    );
     GLX_QUERY( GLUT_WINDOW_STEREO,              GLX_STEREO              );
+    GLX_QUERY( GLUT_WINDOW_SRGB,                GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB);
 
 #   undef GLX_QUERY
 
index 90f1966..2736a59 100644 (file)
@@ -182,6 +182,8 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
             fgState.DisplayMode |= GLUT_DOUBLE ;
             fghChooseConfig(&WINDOW_CONFIG);
             fgState.DisplayMode &= ~GLUT_DOUBLE;
+
+            if( WINDOW_CONFIG ) goto done_retry;
         }
 #endif
 
@@ -190,8 +192,20 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
             fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;
             fghChooseConfig(&WINDOW_CONFIG);
             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,
                                   "FBConfig with necessary capabilities not found", "fgOpenWindow" );