ruby-glfw 0.9
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.
- data/README +1 -0
- data/README.API +73 -0
- data/Rakefile +120 -0
- data/examples/boing.rb +519 -0
- data/examples/gears.rb +327 -0
- data/examples/keytest.rb +117 -0
- data/examples/listmodes.rb +20 -0
- data/examples/mipmaps.rb +104 -0
- data/examples/mipmaps.tga +0 -0
- data/examples/particles.rb +837 -0
- data/examples/pong3d.rb +741 -0
- data/examples/pong3d_field.tga +0 -0
- data/examples/pong3d_instr.tga +0 -0
- data/examples/pong3d_menu.tga +0 -0
- data/examples/pong3d_title.tga +0 -0
- data/examples/pong3d_winner1.tga +0 -0
- data/examples/pong3d_winner2.tga +0 -0
- data/examples/splitview.rb +432 -0
- data/examples/triangle.rb +89 -0
- data/examples/wave.rb +294 -0
- data/ext/glfw/glfw.c +1094 -0
- data/ext/glfw/mkrf_conf.rb +70 -0
- data/glfw-src/Makefile +220 -0
- data/glfw-src/compile.ami +61 -0
- data/glfw-src/compile.bat +217 -0
- data/glfw-src/compile.sh +607 -0
- data/glfw-src/docs/Makefile +57 -0
- data/glfw-src/docs/Reference.pdf +0 -0
- data/glfw-src/docs/UsersGuide.pdf +0 -0
- data/glfw-src/docs/cleanup.bat +22 -0
- data/glfw-src/docs/glfwdoc.sty +80 -0
- data/glfw-src/docs/glfwrm.tex +3034 -0
- data/glfw-src/docs/glfwug.tex +2024 -0
- data/glfw-src/docs/readme.txt +80 -0
- data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
- data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
- data/glfw-src/examples/Makefile.dos.djgpp +71 -0
- data/glfw-src/examples/Makefile.macosx.gcc +96 -0
- data/glfw-src/examples/Makefile.win32.bcc +75 -0
- data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
- data/glfw-src/examples/Makefile.win32.cygwin +79 -0
- data/glfw-src/examples/Makefile.win32.lcc +74 -0
- data/glfw-src/examples/Makefile.win32.mgw +75 -0
- data/glfw-src/examples/Makefile.win32.msvc +74 -0
- data/glfw-src/examples/Makefile.win32.ow +74 -0
- data/glfw-src/examples/Makefile.win32.pellesc +74 -0
- data/glfw-src/examples/Makefile.x11.in +54 -0
- data/glfw-src/examples/boing.c +606 -0
- data/glfw-src/examples/bundle.sh +46 -0
- data/glfw-src/examples/gears.c +382 -0
- data/glfw-src/examples/keytest.c +264 -0
- data/glfw-src/examples/listmodes.c +48 -0
- data/glfw-src/examples/mipmaps.c +126 -0
- data/glfw-src/examples/mipmaps.tga +0 -0
- data/glfw-src/examples/mtbench.c +301 -0
- data/glfw-src/examples/mthello.c +48 -0
- data/glfw-src/examples/particles.c +1148 -0
- data/glfw-src/examples/pong3d.c +839 -0
- data/glfw-src/examples/pong3d_field.tga +0 -0
- data/glfw-src/examples/pong3d_instr.tga +0 -0
- data/glfw-src/examples/pong3d_menu.tga +0 -0
- data/glfw-src/examples/pong3d_title.tga +0 -0
- data/glfw-src/examples/pong3d_winner1.tga +0 -0
- data/glfw-src/examples/pong3d_winner2.tga +0 -0
- data/glfw-src/examples/splitview.c +506 -0
- data/glfw-src/examples/triangle.c +108 -0
- data/glfw-src/examples/wave.c +397 -0
- data/glfw-src/images/opengl.gif +0 -0
- data/glfw-src/images/osicert.gif +0 -0
- data/glfw-src/include/GL/glfw.h +486 -0
- data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
- data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
- data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
- data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
- data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
- data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
- data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
- data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
- data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
- data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
- data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
- data/glfw-src/lib/amigaos/platform.h +337 -0
- data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
- data/glfw-src/lib/dos/dos_enable.c +51 -0
- data/glfw-src/lib/dos/dos_events.c +173 -0
- data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
- data/glfw-src/lib/dos/dos_glext.c +59 -0
- data/glfw-src/lib/dos/dos_init.c +105 -0
- data/glfw-src/lib/dos/dos_irq.s +246 -0
- data/glfw-src/lib/dos/dos_joystick.c +94 -0
- data/glfw-src/lib/dos/dos_keyboard.c +694 -0
- data/glfw-src/lib/dos/dos_mouse.c +337 -0
- data/glfw-src/lib/dos/dos_thread.c +267 -0
- data/glfw-src/lib/dos/dos_time.c +309 -0
- data/glfw-src/lib/dos/dos_window.c +563 -0
- data/glfw-src/lib/dos/platform.h +341 -0
- data/glfw-src/lib/enable.c +295 -0
- data/glfw-src/lib/fullscreen.c +95 -0
- data/glfw-src/lib/glext.c +201 -0
- data/glfw-src/lib/image.c +629 -0
- data/glfw-src/lib/init.c +108 -0
- data/glfw-src/lib/input.c +280 -0
- data/glfw-src/lib/internal.h +210 -0
- data/glfw-src/lib/joystick.c +101 -0
- data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
- data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
- data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
- data/glfw-src/lib/macosx/macosx_enable.c +42 -0
- data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
- data/glfw-src/lib/macosx/macosx_glext.c +52 -0
- data/glfw-src/lib/macosx/macosx_init.c +194 -0
- data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
- data/glfw-src/lib/macosx/macosx_thread.c +414 -0
- data/glfw-src/lib/macosx/macosx_time.c +112 -0
- data/glfw-src/lib/macosx/macosx_window.c +1279 -0
- data/glfw-src/lib/macosx/platform.h +349 -0
- data/glfw-src/lib/stream.c +194 -0
- data/glfw-src/lib/tga.c +405 -0
- data/glfw-src/lib/thread.c +340 -0
- data/glfw-src/lib/time.c +83 -0
- data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
- data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
- data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
- data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
- data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
- data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
- data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
- data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
- data/glfw-src/lib/win32/glfwdll.def +67 -0
- data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
- data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
- data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
- data/glfw-src/lib/win32/libglfw.pc.in +11 -0
- data/glfw-src/lib/win32/platform.h +474 -0
- data/glfw-src/lib/win32/win32_dllmain.c +60 -0
- data/glfw-src/lib/win32/win32_enable.c +155 -0
- data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
- data/glfw-src/lib/win32/win32_glext.c +85 -0
- data/glfw-src/lib/win32/win32_init.c +356 -0
- data/glfw-src/lib/win32/win32_joystick.c +234 -0
- data/glfw-src/lib/win32/win32_thread.c +511 -0
- data/glfw-src/lib/win32/win32_time.c +146 -0
- data/glfw-src/lib/win32/win32_window.c +1714 -0
- data/glfw-src/lib/window.c +727 -0
- data/glfw-src/lib/x11/Makefile.x11.in +243 -0
- data/glfw-src/lib/x11/platform.h +415 -0
- data/glfw-src/lib/x11/x11_enable.c +51 -0
- data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
- data/glfw-src/lib/x11/x11_glext.c +69 -0
- data/glfw-src/lib/x11/x11_init.c +275 -0
- data/glfw-src/lib/x11/x11_joystick.c +371 -0
- data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
- data/glfw-src/lib/x11/x11_thread.c +507 -0
- data/glfw-src/lib/x11/x11_time.c +154 -0
- data/glfw-src/lib/x11/x11_window.c +1746 -0
- data/glfw-src/license.txt +21 -0
- data/glfw-src/readme.html +927 -0
- data/glfw-src/support/d/examples/Makefile +59 -0
- data/glfw-src/support/d/examples/boing.d +610 -0
- data/glfw-src/support/d/examples/gears.d +379 -0
- data/glfw-src/support/d/examples/keytest.d +272 -0
- data/glfw-src/support/d/examples/listmodes.d +48 -0
- data/glfw-src/support/d/examples/mipmaps.d +126 -0
- data/glfw-src/support/d/examples/mtbench.d +304 -0
- data/glfw-src/support/d/examples/mthello.d +54 -0
- data/glfw-src/support/d/examples/particles.d +1150 -0
- data/glfw-src/support/d/examples/pong3d.d +840 -0
- data/glfw-src/support/d/examples/splitview.d +486 -0
- data/glfw-src/support/d/examples/triangle.d +108 -0
- data/glfw-src/support/d/examples/wave.d +400 -0
- data/glfw-src/support/d/imports/gl.d +4539 -0
- data/glfw-src/support/d/imports/glfw.d +349 -0
- data/glfw-src/support/d/imports/glu.d +328 -0
- data/glfw-src/support/d/lib/glfwdll.def +64 -0
- data/glfw-src/support/d/lib/glu32.def +56 -0
- data/glfw-src/support/d/lib/makefile +12 -0
- data/glfw-src/support/d/lib/opengl32.def +372 -0
- data/glfw-src/support/d/readme.html +83 -0
- data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
- data/glfw-src/support/delphi/lib/glfw.pas +437 -0
- data/glfw-src/support/delphi/readme.html +97 -0
- data/glfw-src/support/lua/examples/gears.lua +383 -0
- data/glfw-src/support/lua/examples/test1.lua +68 -0
- data/glfw-src/support/lua/readme.html +128 -0
- data/glfw-src/support/lua/src/luaglfw.c +1179 -0
- data/glfw-src/support/lua/src/luaglfw.h +48 -0
- data/glfw-src/support/lua/src/runlua.c +82 -0
- data/glfw-src/support/masm/examples/fpc.mac +47 -0
- data/glfw-src/support/masm/examples/makeit.bat +66 -0
- data/glfw-src/support/masm/examples/triangle.asm +232 -0
- data/glfw-src/support/masm/include/glfw.inc +326 -0
- data/glfw-src/support/masm/include/glu32.inc +55 -0
- data/glfw-src/support/masm/include/opengl32.inc +372 -0
- data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
- data/glfw-src/support/masm/readme.html +170 -0
- data/glfw-src/support/msvc80/GLFW.sln +26 -0
- data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
- data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
- data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
- data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
- data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
- data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
- data/glfw-src/support/visualbasic/readme.html +164 -0
- data/website/index.html +84 -0
- data/website/style.css +110 -0
- metadata +301 -0
data/glfw-src/lib/tga.c
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
//========================================================================
|
|
2
|
+
// GLFW - An OpenGL framework
|
|
3
|
+
// File: tga.c
|
|
4
|
+
// Platform: Any
|
|
5
|
+
// API version: 2.6
|
|
6
|
+
// WWW: http://glfw.sourceforge.net
|
|
7
|
+
//------------------------------------------------------------------------
|
|
8
|
+
// Copyright (c) 2002-2006 Camilla Berglund
|
|
9
|
+
//
|
|
10
|
+
// This software is provided 'as-is', without any express or implied
|
|
11
|
+
// warranty. In no event will the authors be held liable for any damages
|
|
12
|
+
// arising from the use of this software.
|
|
13
|
+
//
|
|
14
|
+
// Permission is granted to anyone to use this software for any purpose,
|
|
15
|
+
// including commercial applications, and to alter it and redistribute it
|
|
16
|
+
// freely, subject to the following restrictions:
|
|
17
|
+
//
|
|
18
|
+
// 1. The origin of this software must not be misrepresented; you must not
|
|
19
|
+
// claim that you wrote the original software. If you use this software
|
|
20
|
+
// in a product, an acknowledgment in the product documentation would
|
|
21
|
+
// be appreciated but is not required.
|
|
22
|
+
//
|
|
23
|
+
// 2. Altered source versions must be plainly marked as such, and must not
|
|
24
|
+
// be misrepresented as being the original software.
|
|
25
|
+
//
|
|
26
|
+
// 3. This notice may not be removed or altered from any source
|
|
27
|
+
// distribution.
|
|
28
|
+
//
|
|
29
|
+
//========================================================================
|
|
30
|
+
|
|
31
|
+
//========================================================================
|
|
32
|
+
// Description:
|
|
33
|
+
//
|
|
34
|
+
// TGA format image file loader. This module supports version 1 Targa
|
|
35
|
+
// images, with these restrictions:
|
|
36
|
+
// - Pixel format may only be 8, 24 or 32 bits
|
|
37
|
+
// - Colormaps must be no longer than 256 entries
|
|
38
|
+
//
|
|
39
|
+
//========================================================================
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
#include "internal.h"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
//************************************************************************
|
|
46
|
+
//**** GLFW internal functions & declarations ****
|
|
47
|
+
//************************************************************************
|
|
48
|
+
|
|
49
|
+
//========================================================================
|
|
50
|
+
// TGA file header information
|
|
51
|
+
//========================================================================
|
|
52
|
+
|
|
53
|
+
typedef struct {
|
|
54
|
+
int idlen; // 1 byte
|
|
55
|
+
int cmaptype; // 1 byte
|
|
56
|
+
int imagetype; // 1 byte
|
|
57
|
+
int cmapfirstidx; // 2 bytes
|
|
58
|
+
int cmaplen; // 2 bytes
|
|
59
|
+
int cmapentrysize; // 1 byte
|
|
60
|
+
int xorigin; // 2 bytes
|
|
61
|
+
int yorigin; // 2 bytes
|
|
62
|
+
int width; // 2 bytes
|
|
63
|
+
int height; // 2 bytes
|
|
64
|
+
int bitsperpixel; // 1 byte
|
|
65
|
+
int imageinfo; // 1 byte
|
|
66
|
+
int _alphabits; // (derived from imageinfo)
|
|
67
|
+
int _origin; // (derived from imageinfo)
|
|
68
|
+
} _tga_header_t;
|
|
69
|
+
|
|
70
|
+
#define _TGA_CMAPTYPE_NONE 0
|
|
71
|
+
#define _TGA_CMAPTYPE_PRESENT 1
|
|
72
|
+
|
|
73
|
+
#define _TGA_IMAGETYPE_NONE 0
|
|
74
|
+
#define _TGA_IMAGETYPE_CMAP 1
|
|
75
|
+
#define _TGA_IMAGETYPE_TC 2
|
|
76
|
+
#define _TGA_IMAGETYPE_GRAY 3
|
|
77
|
+
#define _TGA_IMAGETYPE_CMAP_RLE 9
|
|
78
|
+
#define _TGA_IMAGETYPE_TC_RLE 10
|
|
79
|
+
#define _TGA_IMAGETYPE_GRAY_RLE 11
|
|
80
|
+
|
|
81
|
+
#define _TGA_IMAGEINFO_ALPHA_MASK 0x0f
|
|
82
|
+
#define _TGA_IMAGEINFO_ALPHA_SHIFT 0
|
|
83
|
+
#define _TGA_IMAGEINFO_ORIGIN_MASK 0x30
|
|
84
|
+
#define _TGA_IMAGEINFO_ORIGIN_SHIFT 4
|
|
85
|
+
|
|
86
|
+
#define _TGA_ORIGIN_BL 0
|
|
87
|
+
#define _TGA_ORIGIN_BR 1
|
|
88
|
+
#define _TGA_ORIGIN_UL 2
|
|
89
|
+
#define _TGA_ORIGIN_UR 3
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
//========================================================================
|
|
93
|
+
// _glfwReadTGAHeader() - Read TGA file header (and check that it is
|
|
94
|
+
// valid)
|
|
95
|
+
//========================================================================
|
|
96
|
+
|
|
97
|
+
static int _glfwReadTGAHeader( _GLFWstream *s, _tga_header_t *h )
|
|
98
|
+
{
|
|
99
|
+
unsigned char buf[ 18 ];
|
|
100
|
+
int pos;
|
|
101
|
+
|
|
102
|
+
// Read TGA file header from file
|
|
103
|
+
pos = _glfwTellStream( s );
|
|
104
|
+
_glfwReadStream( s, buf, 18 );
|
|
105
|
+
|
|
106
|
+
// Interpret header (endian independent parsing)
|
|
107
|
+
h->idlen = (int) buf[0];
|
|
108
|
+
h->cmaptype = (int) buf[1];
|
|
109
|
+
h->imagetype = (int) buf[2];
|
|
110
|
+
h->cmapfirstidx = (int) buf[3] | (((int) buf[4]) << 8);
|
|
111
|
+
h->cmaplen = (int) buf[5] | (((int) buf[6]) << 8);
|
|
112
|
+
h->cmapentrysize = (int) buf[7];
|
|
113
|
+
h->xorigin = (int) buf[8] | (((int) buf[9]) << 8);
|
|
114
|
+
h->yorigin = (int) buf[10] | (((int) buf[11]) << 8);
|
|
115
|
+
h->width = (int) buf[12] | (((int) buf[13]) << 8);
|
|
116
|
+
h->height = (int) buf[14] | (((int) buf[15]) << 8);
|
|
117
|
+
h->bitsperpixel = (int) buf[16];
|
|
118
|
+
h->imageinfo = (int) buf[17];
|
|
119
|
+
|
|
120
|
+
// Extract alphabits and origin information
|
|
121
|
+
h->_alphabits = (int) (h->imageinfo & _TGA_IMAGEINFO_ALPHA_MASK) >>
|
|
122
|
+
_TGA_IMAGEINFO_ALPHA_SHIFT;
|
|
123
|
+
h->_origin = (int) (h->imageinfo & _TGA_IMAGEINFO_ORIGIN_MASK) >>
|
|
124
|
+
_TGA_IMAGEINFO_ORIGIN_SHIFT;
|
|
125
|
+
|
|
126
|
+
// Validate TGA header (is this a TGA file?)
|
|
127
|
+
if( (h->cmaptype == 0 || h->cmaptype == 1) &&
|
|
128
|
+
((h->imagetype >= 1 && h->imagetype <= 3) ||
|
|
129
|
+
(h->imagetype >= 9 && h->imagetype <= 11)) &&
|
|
130
|
+
(h->bitsperpixel == 8 || h->bitsperpixel == 24 ||
|
|
131
|
+
h->bitsperpixel == 32) )
|
|
132
|
+
{
|
|
133
|
+
// Skip the ID field
|
|
134
|
+
_glfwSeekStream( s, h->idlen, SEEK_CUR );
|
|
135
|
+
|
|
136
|
+
// Indicate that the TGA header was valid
|
|
137
|
+
return GL_TRUE;
|
|
138
|
+
}
|
|
139
|
+
else
|
|
140
|
+
{
|
|
141
|
+
// Restore file position
|
|
142
|
+
_glfwSeekStream( s, pos, SEEK_SET );
|
|
143
|
+
|
|
144
|
+
// Indicate that the TGA header was invalid
|
|
145
|
+
return GL_FALSE;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//========================================================================
|
|
150
|
+
// _glfwReadTGA_RLE() - Read Run-Length Encoded data
|
|
151
|
+
//========================================================================
|
|
152
|
+
|
|
153
|
+
static void _glfwReadTGA_RLE( unsigned char *buf, int size, int bpp,
|
|
154
|
+
_GLFWstream *s )
|
|
155
|
+
{
|
|
156
|
+
int repcount, bytes, k, n;
|
|
157
|
+
unsigned char pixel[ 4 ];
|
|
158
|
+
char c;
|
|
159
|
+
|
|
160
|
+
// Dummy check
|
|
161
|
+
if( bpp > 4 )
|
|
162
|
+
{
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
while( size > 0 )
|
|
167
|
+
{
|
|
168
|
+
// Get repetition count
|
|
169
|
+
_glfwReadStream( s, &c, 1 );
|
|
170
|
+
repcount = (unsigned int) c;
|
|
171
|
+
bytes = ((repcount & 127) + 1) * bpp;
|
|
172
|
+
if( size < bytes )
|
|
173
|
+
{
|
|
174
|
+
bytes = size;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Run-Length packet?
|
|
178
|
+
if( repcount & 128 )
|
|
179
|
+
{
|
|
180
|
+
_glfwReadStream( s, pixel, bpp );
|
|
181
|
+
for( n = 0; n < (repcount & 127) + 1; n ++ )
|
|
182
|
+
{
|
|
183
|
+
for( k = 0; k < bpp; k ++ )
|
|
184
|
+
{
|
|
185
|
+
*buf ++ = pixel[ k ];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else
|
|
190
|
+
{
|
|
191
|
+
// It's a Raw packet
|
|
192
|
+
_glfwReadStream( s, buf, bytes );
|
|
193
|
+
buf += bytes;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
size -= bytes;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
//========================================================================
|
|
202
|
+
// _glfwReadTGA() - Read a TGA image from a file
|
|
203
|
+
//========================================================================
|
|
204
|
+
|
|
205
|
+
int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags )
|
|
206
|
+
{
|
|
207
|
+
_tga_header_t h;
|
|
208
|
+
unsigned char *cmap, *pix, tmp, *src, *dst;
|
|
209
|
+
int cmapsize, pixsize, pixsize2;
|
|
210
|
+
int bpp, bpp2, k, m, n, swapx, swapy;
|
|
211
|
+
|
|
212
|
+
// Read TGA header
|
|
213
|
+
if( !_glfwReadTGAHeader( s, &h ) )
|
|
214
|
+
{
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Is there a colormap?
|
|
219
|
+
cmapsize = (h.cmaptype == _TGA_CMAPTYPE_PRESENT ? 1 : 0) * h.cmaplen *
|
|
220
|
+
((h.cmapentrysize+7) / 8);
|
|
221
|
+
if( cmapsize > 0 )
|
|
222
|
+
{
|
|
223
|
+
// Is it a colormap that we can handle?
|
|
224
|
+
if( (h.cmapentrysize != 24 && h.cmapentrysize != 32) ||
|
|
225
|
+
h.cmaplen == 0 || h.cmaplen > 256 )
|
|
226
|
+
{
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Allocate memory for colormap
|
|
231
|
+
cmap = (unsigned char *) malloc( cmapsize );
|
|
232
|
+
if( cmap == NULL )
|
|
233
|
+
{
|
|
234
|
+
return 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Read colormap from file
|
|
238
|
+
_glfwReadStream( s, cmap, cmapsize );
|
|
239
|
+
}
|
|
240
|
+
else
|
|
241
|
+
{
|
|
242
|
+
cmap = NULL;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Size of pixel data
|
|
246
|
+
pixsize = h.width * h.height * ((h.bitsperpixel + 7) / 8);
|
|
247
|
+
|
|
248
|
+
// Bytes per pixel (pixel data - unexpanded)
|
|
249
|
+
bpp = (h.bitsperpixel + 7) / 8;
|
|
250
|
+
|
|
251
|
+
// Bytes per pixel (expanded pixels - not colormap indeces)
|
|
252
|
+
if( cmap )
|
|
253
|
+
{
|
|
254
|
+
bpp2 = (h.cmapentrysize + 7) / 8;
|
|
255
|
+
}
|
|
256
|
+
else
|
|
257
|
+
{
|
|
258
|
+
bpp2 = bpp;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// For colormaped images, the RGB/RGBA image data may use more memory
|
|
262
|
+
// than the stored pixel data
|
|
263
|
+
pixsize2 = h.width * h.height * bpp2;
|
|
264
|
+
|
|
265
|
+
// Allocate memory for pixel data
|
|
266
|
+
pix = (unsigned char *) malloc( pixsize2 );
|
|
267
|
+
if( pix == NULL )
|
|
268
|
+
{
|
|
269
|
+
if( cmap )
|
|
270
|
+
{
|
|
271
|
+
free( cmap );
|
|
272
|
+
}
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Read pixel data from file
|
|
277
|
+
if( h.imagetype >= _TGA_IMAGETYPE_CMAP_RLE )
|
|
278
|
+
{
|
|
279
|
+
_glfwReadTGA_RLE( pix, pixsize, bpp, s );
|
|
280
|
+
}
|
|
281
|
+
else
|
|
282
|
+
{
|
|
283
|
+
_glfwReadStream( s, pix, pixsize );
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// If the image origin is not what we want, re-arrange the pixels
|
|
287
|
+
switch( h._origin )
|
|
288
|
+
{
|
|
289
|
+
default:
|
|
290
|
+
case _TGA_ORIGIN_UL:
|
|
291
|
+
swapx = 0;
|
|
292
|
+
swapy = 1;
|
|
293
|
+
break;
|
|
294
|
+
|
|
295
|
+
case _TGA_ORIGIN_BL:
|
|
296
|
+
swapx = 0;
|
|
297
|
+
swapy = 0;
|
|
298
|
+
break;
|
|
299
|
+
|
|
300
|
+
case _TGA_ORIGIN_UR:
|
|
301
|
+
swapx = 1;
|
|
302
|
+
swapy = 1;
|
|
303
|
+
break;
|
|
304
|
+
|
|
305
|
+
case _TGA_ORIGIN_BR:
|
|
306
|
+
swapx = 1;
|
|
307
|
+
swapy = 0;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
if( (swapy && !(flags & GLFW_ORIGIN_UL_BIT)) ||
|
|
311
|
+
(!swapy && (flags & GLFW_ORIGIN_UL_BIT)) )
|
|
312
|
+
{
|
|
313
|
+
src = pix;
|
|
314
|
+
dst = &pix[ (h.height-1)*h.width*bpp ];
|
|
315
|
+
for( n = 0; n < h.height/2; n ++ )
|
|
316
|
+
{
|
|
317
|
+
for( m = 0; m < h.width ; m ++ )
|
|
318
|
+
{
|
|
319
|
+
for( k = 0; k < bpp; k ++ )
|
|
320
|
+
{
|
|
321
|
+
tmp = *src;
|
|
322
|
+
*src ++ = *dst;
|
|
323
|
+
*dst ++ = tmp;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
dst -= 2*h.width*bpp;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if( swapx )
|
|
330
|
+
{
|
|
331
|
+
src = pix;
|
|
332
|
+
dst = &pix[ (h.width-1)*bpp ];
|
|
333
|
+
for( n = 0; n < h.height; n ++ )
|
|
334
|
+
{
|
|
335
|
+
for( m = 0; m < h.width/2 ; m ++ )
|
|
336
|
+
{
|
|
337
|
+
for( k = 0; k < bpp; k ++ )
|
|
338
|
+
{
|
|
339
|
+
tmp = *src;
|
|
340
|
+
*src ++ = *dst;
|
|
341
|
+
*dst ++ = tmp;
|
|
342
|
+
}
|
|
343
|
+
dst -= 2*bpp;
|
|
344
|
+
}
|
|
345
|
+
src += ((h.width+1)/2)*bpp;
|
|
346
|
+
dst += ((3*h.width+1)/2)*bpp;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Convert BGR/BGRA to RGB/RGBA, and optionally colormap indeces to
|
|
351
|
+
// RGB/RGBA values
|
|
352
|
+
if( cmap )
|
|
353
|
+
{
|
|
354
|
+
// Convert colormap pixel format (BGR -> RGB or BGRA -> RGBA)
|
|
355
|
+
if( bpp2 == 3 || bpp2 == 4 )
|
|
356
|
+
{
|
|
357
|
+
for( n = 0; n < h.cmaplen; n ++ )
|
|
358
|
+
{
|
|
359
|
+
tmp = cmap[ n*bpp2 ];
|
|
360
|
+
cmap[ n*bpp2 ] = cmap[ n*bpp2 + 2 ];
|
|
361
|
+
cmap[ n*bpp2 + 2 ] = tmp;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Convert pixel data to RGB/RGBA data
|
|
366
|
+
for( m = h.width * h.height - 1; m >= 0; m -- )
|
|
367
|
+
{
|
|
368
|
+
n = pix[ m ];
|
|
369
|
+
for( k = 0; k < bpp2; k ++ )
|
|
370
|
+
{
|
|
371
|
+
pix[ m*bpp2 + k ] = cmap[ n*bpp2 + k ];
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Free memory for colormap (it's not needed anymore)
|
|
376
|
+
free( cmap );
|
|
377
|
+
}
|
|
378
|
+
else
|
|
379
|
+
{
|
|
380
|
+
// Convert image pixel format (BGR -> RGB or BGRA -> RGBA)
|
|
381
|
+
if( bpp2 == 3 || bpp2 == 4 )
|
|
382
|
+
{
|
|
383
|
+
src = pix;
|
|
384
|
+
dst = &pix[ 2 ];
|
|
385
|
+
for( n = 0; n < h.height * h.width; n ++ )
|
|
386
|
+
{
|
|
387
|
+
tmp = *src;
|
|
388
|
+
*src = *dst;
|
|
389
|
+
*dst = tmp;
|
|
390
|
+
src += bpp2;
|
|
391
|
+
dst += bpp2;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Fill out GLFWimage struct (the Format field will be set by
|
|
397
|
+
// glfwReadImage)
|
|
398
|
+
img->Width = h.width;
|
|
399
|
+
img->Height = h.height;
|
|
400
|
+
img->BytesPerPixel = bpp2;
|
|
401
|
+
img->Data = pix;
|
|
402
|
+
|
|
403
|
+
return 1;
|
|
404
|
+
}
|
|
405
|
+
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
//========================================================================
|
|
2
|
+
// GLFW - An OpenGL framework
|
|
3
|
+
// File: thread.c
|
|
4
|
+
// Platform: Any
|
|
5
|
+
// API version: 2.6
|
|
6
|
+
// WWW: http://glfw.sourceforge.net
|
|
7
|
+
//------------------------------------------------------------------------
|
|
8
|
+
// Copyright (c) 2002-2006 Camilla Berglund
|
|
9
|
+
//
|
|
10
|
+
// This software is provided 'as-is', without any express or implied
|
|
11
|
+
// warranty. In no event will the authors be held liable for any damages
|
|
12
|
+
// arising from the use of this software.
|
|
13
|
+
//
|
|
14
|
+
// Permission is granted to anyone to use this software for any purpose,
|
|
15
|
+
// including commercial applications, and to alter it and redistribute it
|
|
16
|
+
// freely, subject to the following restrictions:
|
|
17
|
+
//
|
|
18
|
+
// 1. The origin of this software must not be misrepresented; you must not
|
|
19
|
+
// claim that you wrote the original software. If you use this software
|
|
20
|
+
// in a product, an acknowledgment in the product documentation would
|
|
21
|
+
// be appreciated but is not required.
|
|
22
|
+
//
|
|
23
|
+
// 2. Altered source versions must be plainly marked as such, and must not
|
|
24
|
+
// be misrepresented as being the original software.
|
|
25
|
+
//
|
|
26
|
+
// 3. This notice may not be removed or altered from any source
|
|
27
|
+
// distribution.
|
|
28
|
+
//
|
|
29
|
+
//========================================================================
|
|
30
|
+
|
|
31
|
+
#include "internal.h"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
//************************************************************************
|
|
36
|
+
//**** GLFW internal functions ****
|
|
37
|
+
//************************************************************************
|
|
38
|
+
|
|
39
|
+
//========================================================================
|
|
40
|
+
// _glfwGetThreadPointer() - Find pointer to thread with a matching ID
|
|
41
|
+
//========================================================================
|
|
42
|
+
|
|
43
|
+
_GLFWthread * _glfwGetThreadPointer( int ID )
|
|
44
|
+
{
|
|
45
|
+
_GLFWthread *t;
|
|
46
|
+
|
|
47
|
+
for( t = &_glfwThrd.First; t != NULL; t = t->Next )
|
|
48
|
+
{
|
|
49
|
+
if( t->ID == ID )
|
|
50
|
+
{
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return t;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
//========================================================================
|
|
60
|
+
// _glfwAppendThread() - Append thread to thread list
|
|
61
|
+
//========================================================================
|
|
62
|
+
|
|
63
|
+
void _glfwAppendThread( _GLFWthread * t )
|
|
64
|
+
{
|
|
65
|
+
_GLFWthread *t_tmp;
|
|
66
|
+
|
|
67
|
+
t_tmp = &_glfwThrd.First;
|
|
68
|
+
while( t_tmp->Next != NULL )
|
|
69
|
+
{
|
|
70
|
+
t_tmp = t_tmp->Next;
|
|
71
|
+
}
|
|
72
|
+
t_tmp->Next = t;
|
|
73
|
+
t->Previous = t_tmp;
|
|
74
|
+
t->Next = NULL;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
//========================================================================
|
|
79
|
+
// _glfwRemoveThread() - Remove thread from thread list
|
|
80
|
+
//========================================================================
|
|
81
|
+
|
|
82
|
+
void _glfwRemoveThread( _GLFWthread * t )
|
|
83
|
+
{
|
|
84
|
+
if( t->Previous != NULL )
|
|
85
|
+
{
|
|
86
|
+
t->Previous->Next = t->Next;
|
|
87
|
+
}
|
|
88
|
+
if( t->Next != NULL )
|
|
89
|
+
{
|
|
90
|
+
t->Next->Previous = t->Previous;
|
|
91
|
+
}
|
|
92
|
+
free( (void *) t );
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
//************************************************************************
|
|
98
|
+
//**** GLFW user functions ****
|
|
99
|
+
//************************************************************************
|
|
100
|
+
|
|
101
|
+
//========================================================================
|
|
102
|
+
// glfwCreateThread() - Create a new thread
|
|
103
|
+
//========================================================================
|
|
104
|
+
|
|
105
|
+
GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun,
|
|
106
|
+
void *arg )
|
|
107
|
+
{
|
|
108
|
+
// Is GLFW initialized?
|
|
109
|
+
if( !_glfwInitialized )
|
|
110
|
+
{
|
|
111
|
+
return -1;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Return the GLFW thread ID
|
|
115
|
+
return _glfwPlatformCreateThread( fun, arg );
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
//========================================================================
|
|
120
|
+
// glfwDestroyThread() - Kill a thread. NOTE: THIS IS A VERY DANGEROUS
|
|
121
|
+
// OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME SITUATIONS!
|
|
122
|
+
//========================================================================
|
|
123
|
+
|
|
124
|
+
GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID )
|
|
125
|
+
{
|
|
126
|
+
// Is GLFW initialized?
|
|
127
|
+
if( !_glfwInitialized )
|
|
128
|
+
{
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Is it a valid thread? (killing the main thread is not allowed)
|
|
133
|
+
if( ID < 1 )
|
|
134
|
+
{
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
_glfwPlatformDestroyThread( ID );
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
//========================================================================
|
|
143
|
+
// glfwWaitThread() - Wait for a thread to die
|
|
144
|
+
//========================================================================
|
|
145
|
+
|
|
146
|
+
GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode )
|
|
147
|
+
{
|
|
148
|
+
// Is GLFW initialized?
|
|
149
|
+
if( !_glfwInitialized )
|
|
150
|
+
{
|
|
151
|
+
return GL_TRUE;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Is it a valid thread? (waiting for the main thread is not allowed)
|
|
155
|
+
if( ID < 1 )
|
|
156
|
+
{
|
|
157
|
+
return GL_TRUE;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return _glfwPlatformWaitThread( ID, waitmode );
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
//========================================================================
|
|
165
|
+
// glfwGetThreadID() - Return the thread ID for the current thread
|
|
166
|
+
//========================================================================
|
|
167
|
+
|
|
168
|
+
GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void )
|
|
169
|
+
{
|
|
170
|
+
// Is GLFW initialized?
|
|
171
|
+
if( !_glfwInitialized )
|
|
172
|
+
{
|
|
173
|
+
return 0;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return _glfwPlatformGetThreadID();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
//========================================================================
|
|
181
|
+
// glfwCreateMutex() - Create a mutual exclusion object
|
|
182
|
+
//========================================================================
|
|
183
|
+
|
|
184
|
+
GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void )
|
|
185
|
+
{
|
|
186
|
+
// Is GLFW initialized?
|
|
187
|
+
if( !_glfwInitialized )
|
|
188
|
+
{
|
|
189
|
+
return (GLFWmutex) 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return _glfwPlatformCreateMutex();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
//========================================================================
|
|
197
|
+
// glfwDestroyMutex() - Destroy a mutual exclusion object
|
|
198
|
+
//========================================================================
|
|
199
|
+
|
|
200
|
+
GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex )
|
|
201
|
+
{
|
|
202
|
+
// Initialized & valid mutex (no real way of assuring this)?
|
|
203
|
+
if( !_glfwInitialized || !mutex )
|
|
204
|
+
{
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
_glfwPlatformDestroyMutex( mutex );
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
//========================================================================
|
|
213
|
+
// glfwLockMutex() - Request access to a mutex
|
|
214
|
+
//========================================================================
|
|
215
|
+
|
|
216
|
+
GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex )
|
|
217
|
+
{
|
|
218
|
+
// Initialized & valid mutex (no real way of assuring this)?
|
|
219
|
+
if( !_glfwInitialized && !mutex )
|
|
220
|
+
{
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
_glfwPlatformLockMutex( mutex );
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
//========================================================================
|
|
229
|
+
// glfwUnlockMutex() - Release a mutex
|
|
230
|
+
//========================================================================
|
|
231
|
+
|
|
232
|
+
GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex )
|
|
233
|
+
{
|
|
234
|
+
// Initialized & valid mutex (no real way of assuring this)?
|
|
235
|
+
if( !_glfwInitialized && !mutex )
|
|
236
|
+
{
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
_glfwPlatformUnlockMutex( mutex );
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
//========================================================================
|
|
245
|
+
// glfwCreateCond() - Create a new condition variable object
|
|
246
|
+
//========================================================================
|
|
247
|
+
|
|
248
|
+
GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void )
|
|
249
|
+
{
|
|
250
|
+
// Is GLFW initialized?
|
|
251
|
+
if( !_glfwInitialized )
|
|
252
|
+
{
|
|
253
|
+
return (GLFWcond) 0;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return _glfwPlatformCreateCond();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
//========================================================================
|
|
261
|
+
// glfwDestroyCond() - Destroy a condition variable object
|
|
262
|
+
//========================================================================
|
|
263
|
+
|
|
264
|
+
GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond )
|
|
265
|
+
{
|
|
266
|
+
// Initialized & valid condition variable?
|
|
267
|
+
if( !_glfwInitialized || !cond )
|
|
268
|
+
{
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
_glfwPlatformDestroyCond( cond );
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
//========================================================================
|
|
277
|
+
// glfwWaitCond() - Wait for a condition to be raised
|
|
278
|
+
//========================================================================
|
|
279
|
+
|
|
280
|
+
GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex,
|
|
281
|
+
double timeout )
|
|
282
|
+
{
|
|
283
|
+
// Initialized & valid condition variable and mutex?
|
|
284
|
+
if( !_glfwInitialized || !cond || !mutex )
|
|
285
|
+
{
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
_glfwPlatformWaitCond( cond, mutex, timeout );
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
//========================================================================
|
|
294
|
+
// glfwSignalCond() - Signal a condition to one waiting thread
|
|
295
|
+
//========================================================================
|
|
296
|
+
|
|
297
|
+
GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond )
|
|
298
|
+
{
|
|
299
|
+
// Initialized & valid condition variable?
|
|
300
|
+
if( !_glfwInitialized || !cond )
|
|
301
|
+
{
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
_glfwPlatformSignalCond( cond );
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
//========================================================================
|
|
310
|
+
// glfwBroadcastCond() - Broadcast a condition to all waiting threads
|
|
311
|
+
//========================================================================
|
|
312
|
+
|
|
313
|
+
GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond )
|
|
314
|
+
{
|
|
315
|
+
// Initialized & valid condition variable?
|
|
316
|
+
if( !_glfwInitialized || !cond )
|
|
317
|
+
{
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
_glfwPlatformBroadcastCond( cond );
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
//========================================================================
|
|
326
|
+
// glfwGetNumberOfProcessors() - Return the number of processors in the
|
|
327
|
+
// system. This information can be useful for determining the optimal
|
|
328
|
+
// number of threads to use for performing a certain task.
|
|
329
|
+
//========================================================================
|
|
330
|
+
|
|
331
|
+
GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void )
|
|
332
|
+
{
|
|
333
|
+
// Is GLFW initialized?
|
|
334
|
+
if( !_glfwInitialized )
|
|
335
|
+
{
|
|
336
|
+
return 0;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return _glfwPlatformGetNumberOfProcessors();
|
|
340
|
+
}
|