Merge branch 'master' into EGL

Conflicts:
	readme.html
	src/win32_platform.h
	src/x11_platform.h
This commit is contained in:
Camilla Berglund 2012-12-02 16:17:59 +01:00
commit da02844457
11 changed files with 138 additions and 8 deletions

View File

@ -522,6 +522,10 @@ extern "C" {
/*! @brief The number of samples used for default framebuffer multisampling.
*/
#define GLFW_FSAA_SAMPLES 0x0002100E
/*! @brief @c GL_TRUE if the framebuffer should be sRGB capable, or @c GL_FALSE
* otherwise.
*/
#define GLFW_SRGB_CAPABLE 0x0002100F
/*! @brief The @link clients client API @endlink to create a context for.
*/
@ -710,6 +714,16 @@ typedef void* GLFWwindow;
*/
typedef void (* GLFWerrorfun)(int,const char*);
/*! @brief The function signature for window position callbacks.
* @param[in] window The window that the user moved.
* @param[in] x The new x-coordinate, in pixels, of the upper-left corner of
* the client area of the window.
* @param[in] y The new y-coordinate, in pixels, of the upper-left corner of
* the client area of the window.
* @ingroup window
*/
typedef void (* GLFWwindowposfun)(GLFWwindow,int,int);
/*! @brief The function signature for window resize callbacks.
* @param[in] window The window that the user resized.
* @param[in] width The new width, in pixels, of the window.
@ -948,7 +962,7 @@ GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode);
/*! @brief Sets the system gamma ramp to one generated from the specified
* exponent.
* @param[in] The desired exponent.
* @param[in] gamma The desired exponent.
* @ingroup gamma
*/
GLFWAPI void glfwSetGamma(float gamma);
@ -1014,6 +1028,9 @@ GLFWAPI void glfwDefaultWindowHints(void);
* The @ref GLFW_FSAA_SAMPLES hint specifies the desired number of samples to
* use for multisampling.
*
* The @ref GLFW_SRGB_CAPABLE hint specifies whether the framebuffer should be
* sRGB capable.
*
* The @ref GLFW_CLIENT_API hint specifies which client API to create the
* context for. Possible values are @ref GLFW_OPENGL_API and @ref
* GLFW_OPENGL_ES_API.
@ -1042,7 +1059,8 @@ GLFWAPI void glfwDefaultWindowHints(void);
* used by the OpenGL context.
*
* The @ref GLFW_RESIZABLE hint specifies whether the window will be resizable
* by the user. This hint is ignored for fullscreen windows.
* by the user. The window will still be resizable using the @ref
* glfwSetWindowSize function. This hint is ignored for fullscreen windows.
*
* The @ref GLFW_VISIBLE hint specifies whether the window will be initially
* visible. This hint is ignored for fullscreen windows.
@ -1053,7 +1071,9 @@ GLFWAPI void glfwDefaultWindowHints(void);
* Some window hints are hard constraints. These must match the available
* capabilities @em exactly for window and context creation to succeed. Hints
* that are not hard constraints are matched as closely as possible, but the
* resulting window and context may differ from what these hints requested.
* resulting window and context may differ from what these hints requested. To
* find out the actual properties of the created window and context, use the
* @ref glfwGetWindowParam function.
*
* The following window hints are hard constraints:
* @arg @ref GLFW_STEREO
@ -1278,11 +1298,21 @@ GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
*/
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
/*! @brief Sets the position callback for the specified window.
* @param[in] window The window whose callback to set.
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
* callback.
* @ingroup window
*/
GLFWAPI void glfwSetWindowPosCallback(GLFWwindow window, GLFWwindowposfun cbfun);
/*! @brief Sets the size callback for the specified window.
* @param[in] window The window whose callback to set.
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
* callback.
* @ingroup window
*
* This callback is called when the window is resized.
*/
GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfun);
@ -1291,6 +1321,14 @@ GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfu
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
* callback.
* @ingroup window
*
* This callback is called when the user attempts to close the window, i.e.
* clicks the window's close widget or, on Mac OS X, selects @b Quit from the
* application menu. Calling @ref glfwDestroyWindow does not cause this
* callback to be called.
*
* The return value of the close callback becomes the new value of the @ref
* GLFW_CLOSE_REQUESTED window parameter.
*/
GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cbfun);
@ -1299,6 +1337,13 @@ GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cb
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
* callback.
* @ingroup window
*
* This callback is called when the client area of the window needs to be
* redrawn, for example if the window has been exposed after having been
* covered by another window.
*
* @note On compositing window systems such as Mac OS X, where the window
* contents are saved off-screen, this callback may never be called.
*/
GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfun cbfun);
@ -1307,6 +1352,8 @@ GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfu
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
* callback.
* @ingroup window
*
* This callback is called when the window gains or loses focus.
*/
GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cbfun);
@ -1315,6 +1362,8 @@ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cb
* @param[in] cbfun The new callback, or @c NULL to remove the currently set
* callback.
* @ingroup window
*
* This callback is called when the window is iconified or restored.
*/
GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun);
@ -1413,7 +1462,7 @@ GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yof
* set callback.
* @ingroup input
*
* @note The key callback deals with physical keys, with @link keys tokens
* @remarks The key callback deals with physical keys, with @link keys tokens
* @endlink named after their use on the standard US keyboard layout. If you
* want to input text, use the Unicode character callback instead.
*/
@ -1424,8 +1473,8 @@ GLFWAPI void glfwSetKeyCallback(GLFWwindow window, GLFWkeyfun cbfun);
* the currently set callback.
* @ingroup input
*
* @note The Unicode character callback is for text input. If you want to know
* whether a specific key was pressed or released, use the key callback.
* @remarks The Unicode character callback is for text input. If you want to
* know whether a specific key was pressed or released, use the key callback.
*/
GLFWAPI void glfwSetCharCallback(GLFWwindow window, GLFWcharfun cbfun);
@ -1440,6 +1489,9 @@ GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow window, GLFWmousebuttonfun cb
* @param[in] cbfun The new cursor position callback, or @c NULL to remove the
* currently set callback.
* @ingroup input
*
* @remarks The position is relative to the upper-left corner of the client
* area of the window.
*/
GLFWAPI void glfwSetCursorPosCallback(GLFWwindow window, GLFWcursorposfun cbfun);
@ -1492,6 +1544,8 @@ GLFWAPI int glfwGetJoystickButtons(int joy, unsigned char* buttons, int numbutto
* @param[in] string A UTF-8 encoded string.
* @ingroup clipboard
*
* @note This function may only be called from the main thread.
*
* @sa glfwGetClipboardString
*/
GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string);
@ -1502,6 +1556,8 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string);
* if that format was unavailable.
* @ingroup clipboard
*
* @note This function may only be called from the main thread.
*
* @note The returned string is valid only until the next call to @ref
* glfwGetClipboardString or @ref glfwSetClipboardString.
*

View File

@ -274,17 +274,19 @@ version of GLFW.</p>
<li>Added <code>glfwSetErrorCallback</code> function and <code>GLFWerrorfun</code> type for receiving more specific and/or nested errors</li>
<li>Added <code>glfwSetWindowUserPointer</code> and <code>glfwGetWindowUserPointer</code> functions for per-window user pointers</li>
<li>Added <code>glfwGetVersionString</code> function for determining which code paths were enabled at compile time</li>
<li>Added <code>glfwGetWindowPos</code> function for querying the position of the specified window</li>
<li>Added <code>glfwSetWindowPosCallback</code> function and <code>GLFWwindowposfun</code> type for reciving window position events</li>
<li>Added <code>glfwSetWindowFocusCallback</code> function and <code>GLFWwindowfocusfun</code> type for receiving window focus events</li>
<li>Added <code>glfwSetWindowIconifyCallback</code> function and <code>GLFWwindowiconifyfun</code> type for receiving window iconification events</li>
<li>Added <code>glfwGetClipboardString</code> and <code>glfwSetClipboardString</code> functions for interacting with the system clipboard</li>
<li>Added <code>glfwGetCurrentContext</code> function for retrieving the window whose OpenGL context is current</li>
<li>Added <code>GLFW_CLIENT_API</code> window hint for creating contexts for APIs other than desktop OpenGL</li>
<li>Added <code>GLFW_SRGB_CAPABLE</code> for requesting sRGB capable framebuffers</li>
<li>Added <code>GLFW_CLIENT_API</code>, <code>GLFW_OPENGL_API</code> and <code>GLFW_OPENGL_ES_API</code> for selecting client API</li>
<li>Added <code>GLFW_OPENGL_ROBUSTNESS</code> window hint and associated strategy tokens for <code>GL_ARB_robustness</code> support</li>
<li>Added <code>GLFW_OPENGL_REVISION</code> window parameter to make up for removal of <code>glfwGetGLVersion</code></li>
<li>Added <code>GLFW_INCLUDE_GLCOREARB</code> macro for including <code>glcorearb.h</code> instead of <code>gl.h</code></li>
<li>Added <code>GLFW_INCLUDE_ES2</code> macro for telling the GLFW header to include the OpenGL ES 2.0 header instead of <code>gl.h</code></li>
<li>Added <code>GLFW_VISIBLE</code> window hint and parameter for controlling and polling window visibility</li>
<li>Added <code>GLFW_POSITION_X</code> and <code>GLFW_POSITION_Y</code> window hints and parameter for controlling and polling window position</li>
<li>Added <code>windows</code> simple multi-window test program</li>
<li>Added <code>sharing</code> simple OpenGL object sharing test program</li>
<li>Added <code>modes</code> video mode enumeration and setting test program</li>

View File

@ -835,6 +835,9 @@ static GLboolean createContext(_GLFWwindow* window,
ADD_ATTR2(NSOpenGLPFASamples, fbconfig->samples);
}
// NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB
// frambuffer, so there's no need (and no way) to request it
ADD_ATTR(0);
#undef ADD_ATTR

View File

@ -218,6 +218,12 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
extraDiff += (desired->samples - current->samples) *
(desired->samples - current->samples);
}
if (desired->sRGB)
{
if (!current->sRGB)
extraDiff++;
}
}
// Figure out if the current one is better than the best one found so far

View File

@ -190,6 +190,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
else
f->samples = 0;
if (_glfwLibrary.GLX.ARB_framebuffer_sRGB)
f->sRGB = getFBConfigAttrib(window, fbconfigs[i], GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB);
else
f->sRGB = GL_FALSE;
f->platformID = (GLFWintptr) getFBConfigAttrib(window, fbconfigs[i], GLX_FBCONFIG_ID);
(*found)++;
@ -527,6 +532,9 @@ int _glfwInitOpenGL(void)
if (_glfwPlatformExtensionSupported("GLX_ARB_multisample"))
_glfwLibrary.GLX.ARB_multisample = GL_TRUE;
if (_glfwPlatformExtensionSupported("GLX_ARB_framebuffer_sRGB"))
_glfwLibrary.GLX.ARB_framebuffer_sRGB = GL_TRUE;
if (_glfwPlatformExtensionSupported("GLX_ARB_create_context"))
{
_glfwLibrary.GLX.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)

View File

@ -105,6 +105,7 @@ typedef struct _GLFWlibraryGLX
GLboolean EXT_swap_control;
GLboolean MESA_swap_control;
GLboolean ARB_multisample;
GLboolean ARB_framebuffer_sRGB;
GLboolean ARB_create_context;
GLboolean ARB_create_context_profile;
GLboolean ARB_create_context_robustness;

View File

@ -100,6 +100,7 @@ struct _GLFWhints
GLboolean resizable;
GLboolean visible;
int samples;
GLboolean sRGB;
int clientAPI;
int glMajor;
int glMinor;
@ -160,6 +161,7 @@ struct _GLFWfbconfig
int auxBuffers;
GLboolean stereo;
int samples;
GLboolean sRGB;
GLFWintptr platformID;
};
@ -199,6 +201,7 @@ struct _GLFWwindow
int glRobustness;
PFNGLGETSTRINGIPROC GetStringi;
GLFWwindowposfun windowPosCallback;
GLFWwindowsizefun windowSizeCallback;
GLFWwindowclosefun windowCloseCallback;
GLFWwindowrefreshfun windowRefreshCallback;

View File

@ -72,6 +72,7 @@ static void initWGLExtensions(_GLFWwindow* window)
// This needs to include every extension used below except for
// WGL_ARB_extensions_string and WGL_EXT_extensions_string
window->WGL.ARB_multisample = GL_FALSE;
window->WGL.ARB_framebuffer_sRGB = GL_FALSE;
window->WGL.ARB_create_context = GL_FALSE;
window->WGL.ARB_create_context_profile = GL_FALSE;
window->WGL.EXT_create_context_es2_profile = GL_FALSE;
@ -92,6 +93,9 @@ static void initWGLExtensions(_GLFWwindow* window)
if (_glfwPlatformExtensionSupported("WGL_ARB_multisample"))
window->WGL.ARB_multisample = GL_TRUE;
if (_glfwPlatformExtensionSupported("WGL_ARB_framebuffer_sRGB"))
window->WGL.ARB_framebuffer_sRGB = GL_TRUE;
if (_glfwPlatformExtensionSupported("WGL_ARB_create_context"))
{
window->WGL.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
@ -246,6 +250,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
f->samples = getPixelFormatAttrib(window, i, WGL_SAMPLES_ARB);
else
f->samples = 0;
if (window->WGL.ARB_framebuffer_sRGB)
f->sRGB = getPixelFormatAttrib(window, i, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB);
else
f->sRGB = GL_FALSE;
}
else
{
@ -293,6 +302,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found)
// PFD pixel formats do not support FSAA
f->samples = 0;
// PFD pixel formats do not support sRGB
f->sRGB = GL_FALSE;
}
f->platformID = i;

View File

@ -62,6 +62,7 @@ typedef struct _GLFWcontextWGL
PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
GLboolean EXT_swap_control;
GLboolean ARB_multisample;
GLboolean ARB_framebuffer_sRGB;
GLboolean ARB_pixel_format;
GLboolean ARB_create_context;
GLboolean ARB_create_context_profile;

View File

@ -119,8 +119,14 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean focused)
void _glfwInputWindowPos(_GLFWwindow* window, int x, int y)
{
if (window->positionX == x && window->positionY == y)
return;
window->positionX = x;
window->positionY = y;
if (window->windowPosCallback)
window->windowPosCallback(window, x, y);
}
@ -231,6 +237,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
fbconfig.auxBuffers = Max(_glfwLibrary.hints.auxBuffers, 0);
fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE;
fbconfig.samples = Max(_glfwLibrary.hints.samples, 0);
fbconfig.sRGB = _glfwLibrary.hints.sRGB ? GL_TRUE : GL_FALSE;
// Set up desired window config
wndconfig.mode = mode;
@ -440,6 +447,9 @@ GLFWAPI void glfwWindowHint(int target, int hint)
case GLFW_FSAA_SAMPLES:
_glfwLibrary.hints.samples = hint;
break;
case GLFW_SRGB_CAPABLE:
_glfwLibrary.hints.sRGB = hint;
break;
case GLFW_CLIENT_API:
_glfwLibrary.hints.clientAPI = hint;
break;
@ -764,6 +774,24 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow handle)
}
//========================================================================
// Set callback function for window position changes
//========================================================================
GLFWAPI void glfwSetWindowPosCallback(GLFWwindow handle, GLFWwindowposfun cbfun)
{
_GLFWwindow* window = (_GLFWwindow*) handle;
if (!_glfwInitialized)
{
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
return;
}
window->windowPosCallback = cbfun;
}
//========================================================================
// Set callback function for window size changes
//========================================================================

View File

@ -218,6 +218,15 @@ static const char* get_character_string(int character)
return result;
}
static void window_pos_callback(GLFWwindow window, int x, int y)
{
printf("%08x at %0.3f: Window position: %i %i\n",
counter++,
glfwGetTime(),
x,
y);
}
static void window_size_callback(GLFWwindow window, int width, int height)
{
printf("%08x at %0.3f: Window size: %i %i\n",
@ -354,6 +363,7 @@ int main(void)
printf("Window opened\n");
glfwSetWindowPosCallback(window, window_pos_callback);
glfwSetWindowSizeCallback(window, window_size_callback);
glfwSetWindowCloseCallback(window, window_close_callback);
glfwSetWindowRefreshCallback(window, window_refresh_callback);