glfw3.c 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/GLFW/CMakeLists.txt +368 -0
  2. package/GLFW/cocoa_init.m +694 -0
  3. package/GLFW/cocoa_joystick.h +49 -0
  4. package/GLFW/cocoa_joystick.m +485 -0
  5. package/GLFW/cocoa_monitor.m +643 -0
  6. package/GLFW/cocoa_platform.h +302 -0
  7. package/GLFW/cocoa_time.c +57 -0
  8. package/GLFW/cocoa_time.h +35 -0
  9. package/GLFW/cocoa_window.m +2072 -0
  10. package/GLFW/context.c +765 -0
  11. package/GLFW/egl_context.c +911 -0
  12. package/GLFW/glfw.rc.in +30 -0
  13. package/GLFW/glfw3.c +109 -0
  14. package/GLFW/glfw3.h +6564 -0
  15. package/GLFW/glfw3native.h +663 -0
  16. package/GLFW/glx_context.c +719 -0
  17. package/GLFW/init.c +528 -0
  18. package/GLFW/input.c +1505 -0
  19. package/GLFW/internal.h +1022 -0
  20. package/GLFW/linux_joystick.c +436 -0
  21. package/GLFW/linux_joystick.h +64 -0
  22. package/GLFW/mappings.h +1001 -0
  23. package/GLFW/mappings.h.in +82 -0
  24. package/GLFW/monitor.c +548 -0
  25. package/GLFW/nsgl_context.m +384 -0
  26. package/GLFW/null_init.c +264 -0
  27. package/GLFW/null_joystick.c +56 -0
  28. package/GLFW/null_joystick.h +32 -0
  29. package/GLFW/null_monitor.c +160 -0
  30. package/GLFW/null_platform.h +271 -0
  31. package/GLFW/null_window.c +719 -0
  32. package/GLFW/osmesa_context.c +383 -0
  33. package/GLFW/platform.c +214 -0
  34. package/GLFW/platform.h +212 -0
  35. package/GLFW/posix_module.c +53 -0
  36. package/GLFW/posix_poll.c +83 -0
  37. package/GLFW/posix_poll.h +30 -0
  38. package/GLFW/posix_thread.c +107 -0
  39. package/GLFW/posix_thread.h +49 -0
  40. package/GLFW/posix_time.c +65 -0
  41. package/GLFW/posix_time.h +41 -0
  42. package/GLFW/vulkan.c +328 -0
  43. package/GLFW/wgl_context.c +798 -0
  44. package/GLFW/win32_init.c +731 -0
  45. package/GLFW/win32_joystick.c +767 -0
  46. package/GLFW/win32_joystick.h +51 -0
  47. package/GLFW/win32_module.c +51 -0
  48. package/GLFW/win32_monitor.c +569 -0
  49. package/GLFW/win32_platform.h +631 -0
  50. package/GLFW/win32_thread.c +100 -0
  51. package/GLFW/win32_thread.h +53 -0
  52. package/GLFW/win32_time.c +54 -0
  53. package/GLFW/win32_time.h +43 -0
  54. package/GLFW/win32_window.c +2592 -0
  55. package/GLFW/window.c +1172 -0
  56. package/GLFW/wl_init.c +1003 -0
  57. package/GLFW/wl_monitor.c +274 -0
  58. package/GLFW/wl_platform.h +691 -0
  59. package/GLFW/wl_window.c +3308 -0
  60. package/GLFW/x11_init.c +1656 -0
  61. package/GLFW/x11_monitor.c +641 -0
  62. package/GLFW/x11_platform.h +1004 -0
  63. package/GLFW/x11_window.c +3357 -0
  64. package/GLFW/xkb_unicode.c +943 -0
  65. package/GLFW/xkb_unicode.h +30 -0
  66. package/LICENSE +22 -0
  67. package/README.md +236 -0
  68. package/package.json +32 -0
@@ -0,0 +1,82 @@
1
+ //========================================================================
2
+ // GLFW 3.4 - www.glfw.org
3
+ //------------------------------------------------------------------------
4
+ // Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
5
+ //
6
+ // This software is provided 'as-is', without any express or implied
7
+ // warranty. In no event will the authors be held liable for any damages
8
+ // arising from the use of this software.
9
+ //
10
+ // Permission is granted to anyone to use this software for any purpose,
11
+ // including commercial applications, and to alter it and redistribute it
12
+ // freely, subject to the following restrictions:
13
+ //
14
+ // 1. The origin of this software must not be misrepresented; you must not
15
+ // claim that you wrote the original software. If you use this software
16
+ // in a product, an acknowledgment in the product documentation would
17
+ // be appreciated but is not required.
18
+ //
19
+ // 2. Altered source versions must be plainly marked as such, and must not
20
+ // be misrepresented as being the original software.
21
+ //
22
+ // 3. This notice may not be removed or altered from any source
23
+ // distribution.
24
+ //
25
+ //========================================================================
26
+ // As mappings.h.in, this file is used by CMake to produce the mappings.h
27
+ // header file. If you are adding a GLFW specific gamepad mapping, this is
28
+ // where to put it.
29
+ //========================================================================
30
+ // As mappings.h, this provides all pre-defined gamepad mappings, including
31
+ // all available in SDL_GameControllerDB. Do not edit this file. Any gamepad
32
+ // mappings not specific to GLFW should be submitted to SDL_GameControllerDB.
33
+ // This file can be re-generated from mappings.h.in and the upstream
34
+ // gamecontrollerdb.txt with the 'update_mappings' CMake target.
35
+ //========================================================================
36
+
37
+ // All gamepad mappings not labeled GLFW are copied from the
38
+ // SDL_GameControllerDB project under the following license:
39
+ //
40
+ // Simple DirectMedia Layer
41
+ // Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
42
+ //
43
+ // This software is provided 'as-is', without any express or implied warranty.
44
+ // In no event will the authors be held liable for any damages arising from the
45
+ // use of this software.
46
+ //
47
+ // Permission is granted to anyone to use this software for any purpose,
48
+ // including commercial applications, and to alter it and redistribute it
49
+ // freely, subject to the following restrictions:
50
+ //
51
+ // 1. The origin of this software must not be misrepresented; you must not
52
+ // claim that you wrote the original software. If you use this software
53
+ // in a product, an acknowledgment in the product documentation would
54
+ // be appreciated but is not required.
55
+ //
56
+ // 2. Altered source versions must be plainly marked as such, and must not be
57
+ // misrepresented as being the original software.
58
+ //
59
+ // 3. This notice may not be removed or altered from any source distribution.
60
+
61
+ const char* _glfwDefaultMappings[] =
62
+ {
63
+ #if defined(_GLFW_WIN32)
64
+ @GLFW_WIN32_MAPPINGS@
65
+ "78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
66
+ "78696e70757402000000000000000000,XInput Wheel (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
67
+ "78696e70757403000000000000000000,XInput Arcade Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
68
+ "78696e70757404000000000000000000,XInput Flight Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
69
+ "78696e70757405000000000000000000,XInput Dance Pad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
70
+ "78696e70757406000000000000000000,XInput Guitar (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
71
+ "78696e70757408000000000000000000,XInput Drum Kit (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",
72
+ #endif // _GLFW_WIN32
73
+
74
+ #if defined(_GLFW_COCOA)
75
+ @GLFW_COCOA_MAPPINGS@
76
+ #endif // _GLFW_COCOA
77
+
78
+ #if defined(GLFW_BUILD_LINUX_JOYSTICK)
79
+ @GLFW_LINUX_MAPPINGS@
80
+ #endif // GLFW_BUILD_LINUX_JOYSTICK
81
+ };
82
+
package/GLFW/monitor.c ADDED
@@ -0,0 +1,548 @@
1
+ //========================================================================
2
+ // GLFW 3.4 - www.glfw.org
3
+ //------------------------------------------------------------------------
4
+ // Copyright (c) 2002-2006 Marcus Geelnard
5
+ // Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>
6
+ //
7
+ // This software is provided 'as-is', without any express or implied
8
+ // warranty. In no event will the authors be held liable for any damages
9
+ // arising from the use of this software.
10
+ //
11
+ // Permission is granted to anyone to use this software for any purpose,
12
+ // including commercial applications, and to alter it and redistribute it
13
+ // freely, subject to the following restrictions:
14
+ //
15
+ // 1. The origin of this software must not be misrepresented; you must not
16
+ // claim that you wrote the original software. If you use this software
17
+ // in a product, an acknowledgment in the product documentation would
18
+ // be appreciated but is not required.
19
+ //
20
+ // 2. Altered source versions must be plainly marked as such, and must not
21
+ // be misrepresented as being the original software.
22
+ //
23
+ // 3. This notice may not be removed or altered from any source
24
+ // distribution.
25
+ //
26
+ //========================================================================
27
+
28
+ #include "internal.h"
29
+
30
+ #include <assert.h>
31
+ #include <math.h>
32
+ #include <float.h>
33
+ #include <string.h>
34
+ #include <stdlib.h>
35
+ #include <limits.h>
36
+
37
+
38
+ // Lexically compare video modes, used by qsort
39
+ //
40
+ static int compareVideoModes(const void* fp, const void* sp)
41
+ {
42
+ const GLFWvidmode* fm = fp;
43
+ const GLFWvidmode* sm = sp;
44
+ const int fbpp = fm->redBits + fm->greenBits + fm->blueBits;
45
+ const int sbpp = sm->redBits + sm->greenBits + sm->blueBits;
46
+ const int farea = fm->width * fm->height;
47
+ const int sarea = sm->width * sm->height;
48
+
49
+ // First sort on color bits per pixel
50
+ if (fbpp != sbpp)
51
+ return fbpp - sbpp;
52
+
53
+ // Then sort on screen area
54
+ if (farea != sarea)
55
+ return farea - sarea;
56
+
57
+ // Then sort on width
58
+ if (fm->width != sm->width)
59
+ return fm->width - sm->width;
60
+
61
+ // Lastly sort on refresh rate
62
+ return fm->refreshRate - sm->refreshRate;
63
+ }
64
+
65
+ // Retrieves the available modes for the specified monitor
66
+ //
67
+ static GLFWbool refreshVideoModes(_GLFWmonitor* monitor)
68
+ {
69
+ int modeCount;
70
+ GLFWvidmode* modes;
71
+
72
+ if (monitor->modes)
73
+ return GLFW_TRUE;
74
+
75
+ modes = _glfw.platform.getVideoModes(monitor, &modeCount);
76
+ if (!modes)
77
+ return GLFW_FALSE;
78
+
79
+ qsort(modes, modeCount, sizeof(GLFWvidmode), compareVideoModes);
80
+
81
+ _glfw_free(monitor->modes);
82
+ monitor->modes = modes;
83
+ monitor->modeCount = modeCount;
84
+
85
+ return GLFW_TRUE;
86
+ }
87
+
88
+
89
+ //////////////////////////////////////////////////////////////////////////
90
+ ////// GLFW event API //////
91
+ //////////////////////////////////////////////////////////////////////////
92
+
93
+ // Notifies shared code of a monitor connection or disconnection
94
+ //
95
+ void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement)
96
+ {
97
+ assert(monitor != NULL);
98
+ assert(action == GLFW_CONNECTED || action == GLFW_DISCONNECTED);
99
+ assert(placement == _GLFW_INSERT_FIRST || placement == _GLFW_INSERT_LAST);
100
+
101
+ if (action == GLFW_CONNECTED)
102
+ {
103
+ _glfw.monitorCount++;
104
+ _glfw.monitors =
105
+ _glfw_realloc(_glfw.monitors,
106
+ sizeof(_GLFWmonitor*) * _glfw.monitorCount);
107
+
108
+ if (placement == _GLFW_INSERT_FIRST)
109
+ {
110
+ memmove(_glfw.monitors + 1,
111
+ _glfw.monitors,
112
+ ((size_t) _glfw.monitorCount - 1) * sizeof(_GLFWmonitor*));
113
+ _glfw.monitors[0] = monitor;
114
+ }
115
+ else
116
+ _glfw.monitors[_glfw.monitorCount - 1] = monitor;
117
+ }
118
+ else if (action == GLFW_DISCONNECTED)
119
+ {
120
+ int i;
121
+ _GLFWwindow* window;
122
+
123
+ for (window = _glfw.windowListHead; window; window = window->next)
124
+ {
125
+ if (window->monitor == monitor)
126
+ {
127
+ int width, height, xoff, yoff;
128
+ _glfw.platform.getWindowSize(window, &width, &height);
129
+ _glfw.platform.setWindowMonitor(window, NULL, 0, 0, width, height, 0);
130
+ _glfw.platform.getWindowFrameSize(window, &xoff, &yoff, NULL, NULL);
131
+ _glfw.platform.setWindowPos(window, xoff, yoff);
132
+ }
133
+ }
134
+
135
+ for (i = 0; i < _glfw.monitorCount; i++)
136
+ {
137
+ if (_glfw.monitors[i] == monitor)
138
+ {
139
+ _glfw.monitorCount--;
140
+ memmove(_glfw.monitors + i,
141
+ _glfw.monitors + i + 1,
142
+ ((size_t) _glfw.monitorCount - i) * sizeof(_GLFWmonitor*));
143
+ break;
144
+ }
145
+ }
146
+ }
147
+
148
+ if (_glfw.callbacks.monitor)
149
+ _glfw.callbacks.monitor((GLFWmonitor*) monitor, action);
150
+
151
+ if (action == GLFW_DISCONNECTED)
152
+ _glfwFreeMonitor(monitor);
153
+ }
154
+
155
+ // Notifies shared code that a full screen window has acquired or released
156
+ // a monitor
157
+ //
158
+ void _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window)
159
+ {
160
+ assert(monitor != NULL);
161
+ monitor->window = window;
162
+ }
163
+
164
+
165
+ //////////////////////////////////////////////////////////////////////////
166
+ ////// GLFW internal API //////
167
+ //////////////////////////////////////////////////////////////////////////
168
+
169
+ // Allocates and returns a monitor object with the specified name and dimensions
170
+ //
171
+ _GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM)
172
+ {
173
+ _GLFWmonitor* monitor = _glfw_calloc(1, sizeof(_GLFWmonitor));
174
+ monitor->widthMM = widthMM;
175
+ monitor->heightMM = heightMM;
176
+
177
+ strncpy(monitor->name, name, sizeof(monitor->name) - 1);
178
+
179
+ return monitor;
180
+ }
181
+
182
+ // Frees a monitor object and any data associated with it
183
+ //
184
+ void _glfwFreeMonitor(_GLFWmonitor* monitor)
185
+ {
186
+ if (monitor == NULL)
187
+ return;
188
+
189
+ _glfw.platform.freeMonitor(monitor);
190
+
191
+ _glfwFreeGammaArrays(&monitor->originalRamp);
192
+ _glfwFreeGammaArrays(&monitor->currentRamp);
193
+
194
+ _glfw_free(monitor->modes);
195
+ _glfw_free(monitor);
196
+ }
197
+
198
+ // Allocates red, green and blue value arrays of the specified size
199
+ //
200
+ void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size)
201
+ {
202
+ ramp->red = _glfw_calloc(size, sizeof(unsigned short));
203
+ ramp->green = _glfw_calloc(size, sizeof(unsigned short));
204
+ ramp->blue = _glfw_calloc(size, sizeof(unsigned short));
205
+ ramp->size = size;
206
+ }
207
+
208
+ // Frees the red, green and blue value arrays and clears the struct
209
+ //
210
+ void _glfwFreeGammaArrays(GLFWgammaramp* ramp)
211
+ {
212
+ _glfw_free(ramp->red);
213
+ _glfw_free(ramp->green);
214
+ _glfw_free(ramp->blue);
215
+
216
+ memset(ramp, 0, sizeof(GLFWgammaramp));
217
+ }
218
+
219
+ // Chooses the video mode most closely matching the desired one
220
+ //
221
+ const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,
222
+ const GLFWvidmode* desired)
223
+ {
224
+ int i;
225
+ unsigned int sizeDiff, leastSizeDiff = UINT_MAX;
226
+ unsigned int rateDiff, leastRateDiff = UINT_MAX;
227
+ unsigned int colorDiff, leastColorDiff = UINT_MAX;
228
+ const GLFWvidmode* current;
229
+ const GLFWvidmode* closest = NULL;
230
+
231
+ if (!refreshVideoModes(monitor))
232
+ return NULL;
233
+
234
+ for (i = 0; i < monitor->modeCount; i++)
235
+ {
236
+ current = monitor->modes + i;
237
+
238
+ colorDiff = 0;
239
+
240
+ if (desired->redBits != GLFW_DONT_CARE)
241
+ colorDiff += abs(current->redBits - desired->redBits);
242
+ if (desired->greenBits != GLFW_DONT_CARE)
243
+ colorDiff += abs(current->greenBits - desired->greenBits);
244
+ if (desired->blueBits != GLFW_DONT_CARE)
245
+ colorDiff += abs(current->blueBits - desired->blueBits);
246
+
247
+ sizeDiff = abs((current->width - desired->width) *
248
+ (current->width - desired->width) +
249
+ (current->height - desired->height) *
250
+ (current->height - desired->height));
251
+
252
+ if (desired->refreshRate != GLFW_DONT_CARE)
253
+ rateDiff = abs(current->refreshRate - desired->refreshRate);
254
+ else
255
+ rateDiff = UINT_MAX - current->refreshRate;
256
+
257
+ if ((colorDiff < leastColorDiff) ||
258
+ (colorDiff == leastColorDiff && sizeDiff < leastSizeDiff) ||
259
+ (colorDiff == leastColorDiff && sizeDiff == leastSizeDiff && rateDiff < leastRateDiff))
260
+ {
261
+ closest = current;
262
+ leastSizeDiff = sizeDiff;
263
+ leastRateDiff = rateDiff;
264
+ leastColorDiff = colorDiff;
265
+ }
266
+ }
267
+
268
+ return closest;
269
+ }
270
+
271
+ // Performs lexical comparison between two @ref GLFWvidmode structures
272
+ //
273
+ int _glfwCompareVideoModes(const GLFWvidmode* fm, const GLFWvidmode* sm)
274
+ {
275
+ return compareVideoModes(fm, sm);
276
+ }
277
+
278
+ // Splits a color depth into red, green and blue bit depths
279
+ //
280
+ void _glfwSplitBPP(int bpp, int* red, int* green, int* blue)
281
+ {
282
+ int delta;
283
+
284
+ // We assume that by 32 the user really meant 24
285
+ if (bpp == 32)
286
+ bpp = 24;
287
+
288
+ // Convert "bits per pixel" to red, green & blue sizes
289
+
290
+ *red = *green = *blue = bpp / 3;
291
+ delta = bpp - (*red * 3);
292
+ if (delta >= 1)
293
+ *green = *green + 1;
294
+
295
+ if (delta == 2)
296
+ *red = *red + 1;
297
+ }
298
+
299
+
300
+ //////////////////////////////////////////////////////////////////////////
301
+ ////// GLFW public API //////
302
+ //////////////////////////////////////////////////////////////////////////
303
+
304
+ GLFWAPI GLFWmonitor** glfwGetMonitors(int* count)
305
+ {
306
+ assert(count != NULL);
307
+
308
+ *count = 0;
309
+
310
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
311
+
312
+ *count = _glfw.monitorCount;
313
+ return (GLFWmonitor**) _glfw.monitors;
314
+ }
315
+
316
+ GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void)
317
+ {
318
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
319
+
320
+ if (!_glfw.monitorCount)
321
+ return NULL;
322
+
323
+ return (GLFWmonitor*) _glfw.monitors[0];
324
+ }
325
+
326
+ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos)
327
+ {
328
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
329
+ assert(monitor != NULL);
330
+
331
+ if (xpos)
332
+ *xpos = 0;
333
+ if (ypos)
334
+ *ypos = 0;
335
+
336
+ _GLFW_REQUIRE_INIT();
337
+
338
+ _glfw.platform.getMonitorPos(monitor, xpos, ypos);
339
+ }
340
+
341
+ GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* handle,
342
+ int* xpos, int* ypos,
343
+ int* width, int* height)
344
+ {
345
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
346
+ assert(monitor != NULL);
347
+
348
+ if (xpos)
349
+ *xpos = 0;
350
+ if (ypos)
351
+ *ypos = 0;
352
+ if (width)
353
+ *width = 0;
354
+ if (height)
355
+ *height = 0;
356
+
357
+ _GLFW_REQUIRE_INIT();
358
+
359
+ _glfw.platform.getMonitorWorkarea(monitor, xpos, ypos, width, height);
360
+ }
361
+
362
+ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int* heightMM)
363
+ {
364
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
365
+ assert(monitor != NULL);
366
+
367
+ if (widthMM)
368
+ *widthMM = 0;
369
+ if (heightMM)
370
+ *heightMM = 0;
371
+
372
+ _GLFW_REQUIRE_INIT();
373
+
374
+ if (widthMM)
375
+ *widthMM = monitor->widthMM;
376
+ if (heightMM)
377
+ *heightMM = monitor->heightMM;
378
+ }
379
+
380
+ GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* handle,
381
+ float* xscale, float* yscale)
382
+ {
383
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
384
+ assert(monitor != NULL);
385
+
386
+ if (xscale)
387
+ *xscale = 0.f;
388
+ if (yscale)
389
+ *yscale = 0.f;
390
+
391
+ _GLFW_REQUIRE_INIT();
392
+ _glfw.platform.getMonitorContentScale(monitor, xscale, yscale);
393
+ }
394
+
395
+ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle)
396
+ {
397
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
398
+ assert(monitor != NULL);
399
+
400
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
401
+ return monitor->name;
402
+ }
403
+
404
+ GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* handle, void* pointer)
405
+ {
406
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
407
+ assert(monitor != NULL);
408
+
409
+ _GLFW_REQUIRE_INIT();
410
+ monitor->userPointer = pointer;
411
+ }
412
+
413
+ GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* handle)
414
+ {
415
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
416
+ assert(monitor != NULL);
417
+
418
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
419
+ return monitor->userPointer;
420
+ }
421
+
422
+ GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun)
423
+ {
424
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
425
+ _GLFW_SWAP(GLFWmonitorfun, _glfw.callbacks.monitor, cbfun);
426
+ return cbfun;
427
+ }
428
+
429
+ GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count)
430
+ {
431
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
432
+ assert(monitor != NULL);
433
+ assert(count != NULL);
434
+
435
+ *count = 0;
436
+
437
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
438
+
439
+ if (!refreshVideoModes(monitor))
440
+ return NULL;
441
+
442
+ *count = monitor->modeCount;
443
+ return monitor->modes;
444
+ }
445
+
446
+ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* handle)
447
+ {
448
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
449
+ assert(monitor != NULL);
450
+
451
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
452
+
453
+ if (!_glfw.platform.getVideoMode(monitor, &monitor->currentMode))
454
+ return NULL;
455
+
456
+ return &monitor->currentMode;
457
+ }
458
+
459
+ GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma)
460
+ {
461
+ unsigned int i;
462
+ unsigned short* values;
463
+ GLFWgammaramp ramp;
464
+ const GLFWgammaramp* original;
465
+ assert(handle != NULL);
466
+ assert(gamma > 0.f);
467
+ assert(gamma <= FLT_MAX);
468
+
469
+ _GLFW_REQUIRE_INIT();
470
+
471
+ if (gamma != gamma || gamma <= 0.f || gamma > FLT_MAX)
472
+ {
473
+ _glfwInputError(GLFW_INVALID_VALUE, "Invalid gamma value %f", gamma);
474
+ return;
475
+ }
476
+
477
+ original = glfwGetGammaRamp(handle);
478
+ if (!original)
479
+ return;
480
+
481
+ values = _glfw_calloc(original->size, sizeof(unsigned short));
482
+
483
+ for (i = 0; i < original->size; i++)
484
+ {
485
+ float value;
486
+
487
+ // Calculate intensity
488
+ value = i / (float) (original->size - 1);
489
+ // Apply gamma curve
490
+ value = powf(value, 1.f / gamma) * 65535.f + 0.5f;
491
+ // Clamp to value range
492
+ value = fminf(value, 65535.f);
493
+
494
+ values[i] = (unsigned short) value;
495
+ }
496
+
497
+ ramp.red = values;
498
+ ramp.green = values;
499
+ ramp.blue = values;
500
+ ramp.size = original->size;
501
+
502
+ glfwSetGammaRamp(handle, &ramp);
503
+ _glfw_free(values);
504
+ }
505
+
506
+ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)
507
+ {
508
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
509
+ assert(monitor != NULL);
510
+
511
+ _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
512
+
513
+ _glfwFreeGammaArrays(&monitor->currentRamp);
514
+ if (!_glfw.platform.getGammaRamp(monitor, &monitor->currentRamp))
515
+ return NULL;
516
+
517
+ return &monitor->currentRamp;
518
+ }
519
+
520
+ GLFWAPI void glfwSetGammaRamp(GLFWmonitor* handle, const GLFWgammaramp* ramp)
521
+ {
522
+ _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
523
+ assert(monitor != NULL);
524
+ assert(ramp != NULL);
525
+ assert(ramp->size > 0);
526
+ assert(ramp->red != NULL);
527
+ assert(ramp->green != NULL);
528
+ assert(ramp->blue != NULL);
529
+
530
+ _GLFW_REQUIRE_INIT();
531
+
532
+ if (ramp->size <= 0)
533
+ {
534
+ _glfwInputError(GLFW_INVALID_VALUE,
535
+ "Invalid gamma ramp size %i",
536
+ ramp->size);
537
+ return;
538
+ }
539
+
540
+ if (!monitor->originalRamp.size)
541
+ {
542
+ if (!_glfw.platform.getGammaRamp(monitor, &monitor->originalRamp))
543
+ return;
544
+ }
545
+
546
+ _glfw.platform.setGammaRamp(monitor, ramp);
547
+ }
548
+