- fallback to non-sRGB visuals if the context creation failed (GLX-only)
[freeglut] / src / mswin / fg_state_mswin.c
index aada564..98468f5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * freeglut_state_mswin.c
+ * fg_state_mswin.c
  *
  * The Windows-specific state query methods.
  *
@@ -32,7 +32,7 @@
 extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
                                      unsigned char layer_type );
 
-/* 
+/*
  * Helper functions for getting client area from the window rect
  * and the window rect from the client area given the style of the window
  * (or a valid window pointer from which the style can be queried).
@@ -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>
@@ -146,7 +153,7 @@ int fgPlatformGlutGet ( GLenum eWhat )
         HDC hdc = fgStructure.CurrentWindow->Window.pContext.Device;
         int iPixelFormat = GetPixelFormat( hdc );
         DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
-        
+
         returnValue = pfd.cColorBits;
         if (pfd.iPixelType==PFD_TYPE_RGBA)
             returnValue += pfd.cAlphaBits;
@@ -183,7 +190,7 @@ int fgPlatformGlutGet ( GLenum eWhat )
         GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect);
 #else
         ClientToScreen(fgStructure.CurrentWindow->Window.Handle, &topLeft);
-        
+
         if (fgStructure.CurrentWindow->Parent)
             /* For child window, we should return relative to upper-left
              * of parent's client area.
@@ -257,7 +264,7 @@ int fgPlatformGlutGet ( GLenum eWhat )
              */
             borderWidth   = ((winRect.right-winRect.left)-(clientRect.right-clientRect.left))/2;
             captionHeight = (winRect.bottom-winRect.top)-(clientRect.bottom-clientRect.top)-borderWidth; /* include top border in caption height */
-            
+
             switch( eWhat )
             {
             case GLUT_WINDOW_BORDER_WIDTH:
@@ -284,12 +291,31 @@ 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;
     }
 
-       return -1;
+    return -1;
 }
 
 
@@ -327,11 +353,9 @@ int fgPlatformGlutDeviceGet ( GLenum eWhat )
 
     default:
         fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
+        return -1;
         break;
     }
-
-    /* And now -- the failure. */
-    return -1;
 }
 
 /*
@@ -347,4 +371,4 @@ int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size)
 {
   *size = 0;
   return NULL;
-}
\ No newline at end of file
+}