/*
- * freeglut_state_mswin.c
+ * fg_state_mswin.c
*
* The Windows-specific state query methods.
*
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).
*/
-extern void fghGetClientArea( RECT *clientRect, const SFG_Window *window );
+extern void fghGetClientArea( RECT *clientRect, const SFG_Window *window, BOOL posIsOutside );
extern void fghGetStyleFromWindow( const SFG_Window *window, DWORD *windowStyle, DWORD *windowExStyle );
extern void fghComputeWindowRectFromClientArea_UseStyle( RECT *clientRect, const DWORD windowStyle, const DWORD windowExStyle, BOOL posIsOutside );
* #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>
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;
case GLUT_WINDOW_Y:
{
/*
- * There is considerable confusion about the "right thing to
- * do" concerning window size and position. GLUT itself is
- * not consistent between Windows and UNIX/X11; since
- * platform independence is a virtue for "freeglut", we
- * decided to break with GLUT's behaviour.
- *
- * Under UNIX/X11, it is apparently not possible to get the
- * window border sizes in order to subtract them off the
- * window's initial position until some time after the window
- * has been created. Therefore we decided on the following
- * behaviour, both under Windows and under UNIX/X11:
+ * NB:
* - When you create a window with position (x,y) and size
* (w,h), the upper left hand corner of the outside of the
* window is at (x,y) and the size of the drawable area is
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.
break;
case GLUT_WINDOW_WIDTH:
- freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
- return fgStructure.CurrentWindow->State.Width;
case GLUT_WINDOW_HEIGHT:
+ {
+ RECT winRect;
freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
- return fgStructure.CurrentWindow->State.Height;
+
+ GetClientRect( fgStructure.CurrentWindow->Window.Handle, &winRect);
+
+ switch( eWhat )
+ {
+ case GLUT_WINDOW_WIDTH: return winRect.right-winRect.left;
+ case GLUT_WINDOW_HEIGHT: return winRect.bottom-winRect.top;
+ }
+ }
+ break;
case GLUT_WINDOW_BORDER_WIDTH :
case GLUT_WINDOW_BORDER_HEIGHT :
/* Also get window rect (including non-client area) */
if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle)
{
- fghGetClientArea(&clientRect,fgStructure.CurrentWindow);
+ fghGetClientArea(&clientRect,fgStructure.CurrentWindow, FALSE);
GetWindowRect(fgStructure.CurrentWindow->Window.Handle,&winRect);
}
else
* all other extra pixels are assumed to be atop the window, forming the caption.
*/
borderWidth = ((winRect.right-winRect.left)-(clientRect.right-clientRect.left))/2;
- captionHeight = (winRect.bottom-winRect.top)-(clientRect.bottom-clientRect.top)-borderWidth*2;
-
+ captionHeight = (winRect.bottom-winRect.top)-(clientRect.bottom-clientRect.top)-borderWidth; /* include top border in caption height */
+
switch( eWhat )
{
case GLUT_WINDOW_BORDER_WIDTH:
#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;
}
default:
fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
+ return -1;
break;
}
-
- /* And now -- the failure. */
- return -1;
}
/*
{
*size = 0;
return NULL;
-}
\ No newline at end of file
+}