瀏覽代碼

Merge branch 'master' into EGL

Conflicts:
	readme.html
	src/win32_platform.h
	src/x11_platform.h
Camilla Berglund 12 年之前
父節點
當前提交
da02844457
共有 11 個文件被更改,包括 138 次插入8 次删除
  1. 62 6
      include/GL/glfw3.h
  2. 4 2
      readme.html
  3. 3 0
      src/cocoa_window.m
  4. 6 0
      src/context.c
  5. 8 0
      src/glx_context.c
  6. 1 0
      src/glx_platform.h
  7. 3 0
      src/internal.h
  8. 12 0
      src/wgl_context.c
  9. 1 0
      src/wgl_platform.h
  10. 28 0
      src/window.c
  11. 10 0
      tests/events.c

+ 62 - 6
include/GL/glfw3.h

@@ -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.
  *

+ 4 - 2
readme.html

@@ -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>

+ 3 - 0
src/cocoa_window.m

@@ -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

+ 6 - 0
src/context.c

@@ -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

+ 8 - 0
src/glx_context.c

@@ -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)

+ 1 - 0
src/glx_platform.h

@@ -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;

+ 3 - 0
src/internal.h

@@ -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;

+ 12 - 0
src/wgl_context.c

@@ -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;

+ 1 - 0
src/wgl_platform.h

@@ -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;

+ 28 - 0
src/window.c

@@ -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
 //========================================================================

+ 10 - 0
tests/events.c

@@ -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);