X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmswin%2Ffg_state_mswin.c;h=98468f5f512e6dff9c854f00d7d9d8f58e13f9f1;hb=a0871c21cb859cea6f24802b6828352a211ab102;hp=659ceca75f756f516b7818c72b877ff65b59978d;hpb=637e1260edb9068591665330c32407549ca36535;p=freeglut diff --git a/src/mswin/fg_state_mswin.c b/src/mswin/fg_state_mswin.c index 659ceca..98468f5 100644 --- a/src/mswin/fg_state_mswin.c +++ b/src/mswin/fg_state_mswin.c @@ -1,5 +1,5 @@ /* - * freeglut_state_mswin.c + * fg_state_mswin.c * * The Windows-specific state query methods. * @@ -32,12 +32,12 @@ 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, BOOL wantPosOutside ); +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 ); @@ -46,7 +46,14 @@ extern void fghComputeWindowRectFromClientArea_UseStyle( RECT *clientRect, const * #include * 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 @@ -141,29 +148,27 @@ int fgPlatformGlutGet ( GLenum eWhat ) return returnValue; case GLUT_WINDOW_BUFFER_SIZE: - returnValue = 1 ; /* TODO????? */ - return returnValue; + { + PIXELFORMATDESCRIPTOR pfd; + 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; + + return returnValue; + } case GLUT_WINDOW_STENCIL_SIZE: - returnValue = 0 ; /* TODO????? */ + glGetIntegerv ( GL_STENCIL_BITS, &returnValue ); return returnValue; case GLUT_WINDOW_X: case GLUT_WINDOW_Y: - case GLUT_WINDOW_WIDTH: - case GLUT_WINDOW_HEIGHT: { /* - * 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 @@ -172,45 +177,56 @@ int fgPlatformGlutGet ( GLenum eWhat ) * is happening here for Windows--"freeglut" will return * the size of the drawable area--the (w,h) that you * specified when you created the window--and the coordinates - * of the upper left hand corner of the drawable - * area--which is NOT the (x,y) you specified. + * of the upper left hand corner of the drawable area, i.e. + * of the client rect--which is NOT the (x,y) you specified. */ RECT winRect; + POINT topLeft = {0,0}; freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 ); #if defined(_WIN32_WCE) - GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); + GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect); #else - fghGetClientArea(&winRect,fgStructure.CurrentWindow, FALSE); - if (fgStructure.CurrentWindow->Parent && (eWhat==GLUT_WINDOW_X || eWhat==GLUT_WINDOW_Y)) - { + 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. + * of parent's client area. */ - POINT topleft; - topleft.x = winRect.left; - topleft.y = winRect.top; + ScreenToClient(fgStructure.CurrentWindow->Parent->Window.Handle,&topLeft); - ScreenToClient(fgStructure.CurrentWindow->Parent->Window.Handle,&topleft); - winRect.left = topleft.x; - winRect.top = topleft.y; - } + winRect.left = topLeft.x; + winRect.top = topLeft.y; #endif /* defined(_WIN32_WCE) */ switch( eWhat ) { - case GLUT_WINDOW_X: return winRect.left ; - case GLUT_WINDOW_Y: return winRect.top ; - case GLUT_WINDOW_WIDTH: return winRect.right - winRect.left; - case GLUT_WINDOW_HEIGHT: return winRect.bottom - winRect.top; + case GLUT_WINDOW_X: return winRect.left; + case GLUT_WINDOW_Y: return winRect.top ; + } + } + break; + + case GLUT_WINDOW_WIDTH: + case GLUT_WINDOW_HEIGHT: + { + RECT winRect; + freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 ); + + 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_HEADER_HEIGHT : + case GLUT_WINDOW_BORDER_HEIGHT : #if defined(_WIN32_WCE) return 0; #else @@ -226,15 +242,19 @@ int fgPlatformGlutGet ( GLenum eWhat ) /* Get style of window, or default style */ fghGetStyleFromWindow( fgStructure.CurrentWindow, &windowStyle, &windowExStyle ); - /* Get client area if any window */ + /* Get client area if we have a current window, else use dummy rect */ + /* Also get window rect (including non-client area) */ if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle) - fghGetClientArea(&clientRect,fgStructure.CurrentWindow,FALSE); + { + fghGetClientArea(&clientRect,fgStructure.CurrentWindow, FALSE); + GetWindowRect(fgStructure.CurrentWindow->Window.Handle,&winRect); + } else + { SetRect(&clientRect,0,0,200,200); - - /* Compute window rect (including non-client area) */ - CopyRect(&winRect,&clientRect); - fghComputeWindowRectFromClientArea_UseStyle(&winRect,windowStyle,windowExStyle,FALSE); + CopyRect(&winRect,&clientRect); + fghComputeWindowRectFromClientArea_UseStyle(&winRect,windowStyle,windowExStyle,FALSE); + } /* Calculate border width by taking width of whole window minus width of client area and divide by two * NB: we assume horizontal and vertical borders have the same size, which should always be the case @@ -243,16 +263,13 @@ int fgPlatformGlutGet ( GLenum eWhat ) * 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: - { - return borderWidth; - } - case GLUT_WINDOW_HEADER_HEIGHT: - /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */ + return borderWidth; + case GLUT_WINDOW_BORDER_HEIGHT: return captionHeight; } } @@ -274,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; } @@ -317,11 +353,9 @@ int fgPlatformGlutDeviceGet ( GLenum eWhat ) default: fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat ); + return -1; break; } - - /* And now -- the failure. */ - return -1; } /* @@ -337,4 +371,4 @@ int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size) { *size = 0; return NULL; -} \ No newline at end of file +}