ruby-glfw 0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,95 @@
|
|
1
|
+
//========================================================================
|
2
|
+
// GLFW - An OpenGL framework
|
3
|
+
// File: fullscreen.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
|
+
//**** GLFW user functions ****
|
36
|
+
//************************************************************************
|
37
|
+
|
38
|
+
//========================================================================
|
39
|
+
// glfwGetVideoModes() - Get a list of available video modes
|
40
|
+
//========================================================================
|
41
|
+
|
42
|
+
GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list,
|
43
|
+
int maxcount )
|
44
|
+
{
|
45
|
+
int count, i, swap, res1, res2, depth1, depth2;
|
46
|
+
GLFWvidmode vm;
|
47
|
+
|
48
|
+
if( !_glfwInitialized || maxcount <= 0 || list == (GLFWvidmode*) 0 )
|
49
|
+
{
|
50
|
+
return 0;
|
51
|
+
}
|
52
|
+
|
53
|
+
// Get list of video modes
|
54
|
+
count = _glfwPlatformGetVideoModes( list, maxcount );
|
55
|
+
|
56
|
+
// Sort list (bubble sort)
|
57
|
+
do
|
58
|
+
{
|
59
|
+
swap = 0;
|
60
|
+
for( i = 0; i < count-1; ++ i )
|
61
|
+
{
|
62
|
+
res1 = list[i].Width*list[i].Height;
|
63
|
+
depth1 = list[i].RedBits+list[i].GreenBits+list[i].BlueBits;
|
64
|
+
res2 = list[i+1].Width*list[i+1].Height;
|
65
|
+
depth2 = list[i+1].RedBits+list[i+1].GreenBits+
|
66
|
+
list[i+1].BlueBits;
|
67
|
+
if( (depth2<depth1) || ((depth2==depth1) && (res2<res1)) )
|
68
|
+
{
|
69
|
+
vm = list[i];
|
70
|
+
list[i] = list[i+1];
|
71
|
+
list[i+1] = vm;
|
72
|
+
swap = 1;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
while( swap );
|
77
|
+
|
78
|
+
return count;
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
//========================================================================
|
83
|
+
// glfwGetDesktopMode() - Get the desktop video mode
|
84
|
+
//========================================================================
|
85
|
+
|
86
|
+
GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode )
|
87
|
+
{
|
88
|
+
if( !_glfwInitialized || mode == (GLFWvidmode*) 0 )
|
89
|
+
{
|
90
|
+
return;
|
91
|
+
}
|
92
|
+
|
93
|
+
_glfwPlatformGetDesktopMode( mode );
|
94
|
+
}
|
95
|
+
|
@@ -0,0 +1,201 @@
|
|
1
|
+
//========================================================================
|
2
|
+
// GLFW - An OpenGL framework
|
3
|
+
// File: glext.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
|
+
//**** GLFW internal functions ****
|
36
|
+
//************************************************************************
|
37
|
+
|
38
|
+
//========================================================================
|
39
|
+
// _glfwStringInExtensionString() - Check if a string can be found in an
|
40
|
+
// OpenGL extension string
|
41
|
+
//========================================================================
|
42
|
+
|
43
|
+
int _glfwStringInExtensionString( const char *string,
|
44
|
+
const GLubyte *extensions )
|
45
|
+
{
|
46
|
+
const GLubyte *start;
|
47
|
+
GLubyte *where, *terminator;
|
48
|
+
|
49
|
+
// It takes a bit of care to be fool-proof about parsing the
|
50
|
+
// OpenGL extensions string. Don't be fooled by sub-strings,
|
51
|
+
// etc.
|
52
|
+
start = extensions;
|
53
|
+
while( 1 )
|
54
|
+
{
|
55
|
+
where = (GLubyte *) strstr( (const char *) start, string );
|
56
|
+
if( !where )
|
57
|
+
{
|
58
|
+
return GL_FALSE;
|
59
|
+
}
|
60
|
+
terminator = where + strlen( string );
|
61
|
+
if( where == start || *(where - 1) == ' ' )
|
62
|
+
{
|
63
|
+
if( *terminator == ' ' || *terminator == '\0' )
|
64
|
+
{
|
65
|
+
break;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
start = terminator;
|
69
|
+
}
|
70
|
+
|
71
|
+
return GL_TRUE;
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
//************************************************************************
|
77
|
+
//**** GLFW user functions ****
|
78
|
+
//************************************************************************
|
79
|
+
|
80
|
+
//========================================================================
|
81
|
+
// glfwExtensionSupported() - Check if an OpenGL extension is available
|
82
|
+
// at runtime
|
83
|
+
//========================================================================
|
84
|
+
|
85
|
+
GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension )
|
86
|
+
{
|
87
|
+
const GLubyte *extensions;
|
88
|
+
GLubyte *where;
|
89
|
+
|
90
|
+
// Is GLFW initialized?
|
91
|
+
if( !_glfwInitialized || !_glfwWin.Opened )
|
92
|
+
{
|
93
|
+
return GL_FALSE;
|
94
|
+
}
|
95
|
+
|
96
|
+
// Extension names should not have spaces
|
97
|
+
where = (GLubyte *) strchr( extension, ' ' );
|
98
|
+
if( where || *extension == '\0' )
|
99
|
+
{
|
100
|
+
return GL_FALSE;
|
101
|
+
}
|
102
|
+
|
103
|
+
// Check if extension is in the standard OpenGL extensions string
|
104
|
+
extensions = (GLubyte *) glGetString( GL_EXTENSIONS );
|
105
|
+
if( extensions != NULL )
|
106
|
+
{
|
107
|
+
if( _glfwStringInExtensionString( extension, extensions ) )
|
108
|
+
{
|
109
|
+
return GL_TRUE;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
// Additional platform specific extension checking (e.g. WGL)
|
114
|
+
if( _glfwPlatformExtensionSupported( extension ) )
|
115
|
+
{
|
116
|
+
return GL_TRUE;
|
117
|
+
}
|
118
|
+
|
119
|
+
return GL_FALSE;
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
//========================================================================
|
124
|
+
// glfwGetProcAddress() - Get the function pointer to an OpenGL function.
|
125
|
+
// This function can be used to get access to extended OpenGL functions.
|
126
|
+
//========================================================================
|
127
|
+
|
128
|
+
GLFWAPI void * GLFWAPIENTRY glfwGetProcAddress( const char *procname )
|
129
|
+
{
|
130
|
+
// Is GLFW initialized?
|
131
|
+
if( !_glfwInitialized || !_glfwWin.Opened )
|
132
|
+
{
|
133
|
+
return NULL;
|
134
|
+
}
|
135
|
+
|
136
|
+
return _glfwPlatformGetProcAddress( procname );
|
137
|
+
}
|
138
|
+
|
139
|
+
|
140
|
+
//========================================================================
|
141
|
+
// glfwGetGLVersion() - Get OpenGL version
|
142
|
+
//========================================================================
|
143
|
+
|
144
|
+
GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor,
|
145
|
+
int *rev )
|
146
|
+
{
|
147
|
+
GLuint _major, _minor = 0, _rev = 0;
|
148
|
+
const GLubyte *version;
|
149
|
+
GLubyte *ptr;
|
150
|
+
|
151
|
+
// Is GLFW initialized?
|
152
|
+
if( !_glfwInitialized || !_glfwWin.Opened )
|
153
|
+
{
|
154
|
+
return;
|
155
|
+
}
|
156
|
+
|
157
|
+
// Get OpenGL version string
|
158
|
+
version = glGetString( GL_VERSION );
|
159
|
+
if( !version )
|
160
|
+
{
|
161
|
+
return;
|
162
|
+
}
|
163
|
+
|
164
|
+
// Parse string
|
165
|
+
ptr = (GLubyte*) version;
|
166
|
+
for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
167
|
+
{
|
168
|
+
_major = 10*_major + (*ptr - '0');
|
169
|
+
}
|
170
|
+
if( *ptr == '.' )
|
171
|
+
{
|
172
|
+
ptr ++;
|
173
|
+
for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
174
|
+
{
|
175
|
+
_minor = 10*_minor + (*ptr - '0');
|
176
|
+
}
|
177
|
+
if( *ptr == '.' )
|
178
|
+
{
|
179
|
+
ptr ++;
|
180
|
+
for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
181
|
+
{
|
182
|
+
_rev = 10*_rev + (*ptr - '0');
|
183
|
+
}
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
// Return parsed values
|
188
|
+
if( major != NULL )
|
189
|
+
{
|
190
|
+
*major = _major;
|
191
|
+
}
|
192
|
+
if( minor != NULL )
|
193
|
+
{
|
194
|
+
*minor = _minor;
|
195
|
+
}
|
196
|
+
if( rev != NULL )
|
197
|
+
{
|
198
|
+
*rev = _rev;
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
@@ -0,0 +1,629 @@
|
|
1
|
+
//========================================================================
|
2
|
+
// GLFW - An OpenGL framework
|
3
|
+
// File: image.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
|
+
// This module acts as an interface for different image file formats (the
|
35
|
+
// image file format is detected automatically).
|
36
|
+
//
|
37
|
+
// By default the loaded image is rescaled (using bilinear interpolation)
|
38
|
+
// to the next higher 2^N x 2^M resolution, unless it has a valid
|
39
|
+
// 2^N x 2^M resolution. The interpolation is quite slow, even if the
|
40
|
+
// routine has been optimized for speed (a 200x200 RGB image is scaled to
|
41
|
+
// 256x256 in ~30 ms on a P3-500).
|
42
|
+
//
|
43
|
+
// Paletted images are converted to RGB/RGBA images.
|
44
|
+
//
|
45
|
+
// A convenience function is also included (glfwLoadTexture2D), which
|
46
|
+
// loads a texture image from a file directly to OpenGL texture memory,
|
47
|
+
// with an option to generate all mipmap levels. GL_SGIS_generate_mipmap
|
48
|
+
// is used whenever available, which should give an optimal mipmap
|
49
|
+
// generation speed (possibly performed in hardware). A software fallback
|
50
|
+
// method is included when GL_SGIS_generate_mipmap is not supported (it
|
51
|
+
// generates all mipmaps of a 256x256 RGB texture in ~3 ms on a P3-500).
|
52
|
+
//
|
53
|
+
//========================================================================
|
54
|
+
|
55
|
+
|
56
|
+
#include "internal.h"
|
57
|
+
|
58
|
+
|
59
|
+
// We want to support automatic mipmap generation
|
60
|
+
#ifndef GL_SGIS_generate_mipmap
|
61
|
+
#define GL_GENERATE_MIPMAP_SGIS 0x8191
|
62
|
+
#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
|
63
|
+
#define GL_SGIS_generate_mipmap 1
|
64
|
+
#endif // GL_SGIS_generate_mipmap
|
65
|
+
|
66
|
+
|
67
|
+
//************************************************************************
|
68
|
+
//**** GLFW internal functions ****
|
69
|
+
//************************************************************************
|
70
|
+
|
71
|
+
//========================================================================
|
72
|
+
// _glfwUpsampleImage() - Upsample image, from size w1 x h1 to w2 x h2
|
73
|
+
//========================================================================
|
74
|
+
|
75
|
+
static void _glfwUpsampleImage( unsigned char *src, unsigned char *dst,
|
76
|
+
int w1, int h1, int w2, int h2, int bpp )
|
77
|
+
{
|
78
|
+
int m, n, k, x, y, col8;
|
79
|
+
float dx, dy, xstep, ystep, col, col1, col2;
|
80
|
+
unsigned char *src1, *src2, *src3, *src4;
|
81
|
+
|
82
|
+
// Calculate scaling factor
|
83
|
+
xstep = (float)(w1-1) / (float)(w2-1);
|
84
|
+
ystep = (float)(h1-1) / (float)(h2-1);
|
85
|
+
|
86
|
+
// Copy source data to destination data with bilinear interpolation
|
87
|
+
// Note: The rather strange look of this routine is a direct result of
|
88
|
+
// my attempts at optimizing it. Improvements are welcome!
|
89
|
+
dy = 0.0f;
|
90
|
+
y = 0;
|
91
|
+
for( n = 0; n < h2; n ++ )
|
92
|
+
{
|
93
|
+
dx = 0.0f;
|
94
|
+
src1 = &src[ y*w1*bpp ];
|
95
|
+
src3 = y < (h1-1) ? src1 + w1*bpp : src1;
|
96
|
+
src2 = src1 + bpp;
|
97
|
+
src4 = src3 + bpp;
|
98
|
+
x = 0;
|
99
|
+
for( m = 0; m < w2; m ++ )
|
100
|
+
{
|
101
|
+
for( k = 0; k < bpp; k ++ )
|
102
|
+
{
|
103
|
+
col1 = *src1 ++;
|
104
|
+
col2 = *src2 ++;
|
105
|
+
col = col1 + (col2 - col1) * dx;
|
106
|
+
col1 = *src3 ++;
|
107
|
+
col2 = *src4 ++;
|
108
|
+
col2 = col1 + (col2 - col1) * dx;
|
109
|
+
col += (col2 - col) * dy;
|
110
|
+
col8 = (int) (col + 0.5);
|
111
|
+
if( col8 >= 256 ) col8 = 255;
|
112
|
+
*dst++ = (unsigned char) col8;
|
113
|
+
}
|
114
|
+
dx += xstep;
|
115
|
+
if( dx >= 1.0f )
|
116
|
+
{
|
117
|
+
x ++;
|
118
|
+
dx -= 1.0f;
|
119
|
+
if( x >= (w1-1) )
|
120
|
+
{
|
121
|
+
src2 = src1;
|
122
|
+
src4 = src3;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
else
|
126
|
+
{
|
127
|
+
src1 -= bpp;
|
128
|
+
src2 -= bpp;
|
129
|
+
src3 -= bpp;
|
130
|
+
src4 -= bpp;
|
131
|
+
}
|
132
|
+
}
|
133
|
+
dy += ystep;
|
134
|
+
if( dy >= 1.0f )
|
135
|
+
{
|
136
|
+
y ++;
|
137
|
+
dy -= 1.0f;
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
|
143
|
+
//========================================================================
|
144
|
+
// _glfwHalveImage() - Build the next mip-map level
|
145
|
+
//========================================================================
|
146
|
+
|
147
|
+
static int _glfwHalveImage( GLubyte *src, int *width, int *height,
|
148
|
+
int components )
|
149
|
+
{
|
150
|
+
int halfwidth, halfheight, m, n, k, idx1, idx2;
|
151
|
+
GLubyte *dst;
|
152
|
+
|
153
|
+
// Last level?
|
154
|
+
if( *width <= 1 && *height <= 1 )
|
155
|
+
{
|
156
|
+
return GL_FALSE;
|
157
|
+
}
|
158
|
+
|
159
|
+
// Calculate new width and height (handle 1D case)
|
160
|
+
halfwidth = *width > 1 ? *width / 2 : 1;
|
161
|
+
halfheight = *height > 1 ? *height / 2 : 1;
|
162
|
+
|
163
|
+
// Downsample image with a simple box-filter
|
164
|
+
dst = src;
|
165
|
+
if( *width == 1 || *height == 1 )
|
166
|
+
{
|
167
|
+
// 1D case
|
168
|
+
for( m = 0; m < halfwidth+halfheight-1; m ++ )
|
169
|
+
{
|
170
|
+
for( k = 0; k < components; k ++ )
|
171
|
+
{
|
172
|
+
*dst ++ = (GLubyte) (((int)*src +
|
173
|
+
(int)src[components] + 1) >> 1);
|
174
|
+
src ++;
|
175
|
+
}
|
176
|
+
src += components;
|
177
|
+
}
|
178
|
+
}
|
179
|
+
else
|
180
|
+
{
|
181
|
+
// 2D case
|
182
|
+
idx1 = *width*components;
|
183
|
+
idx2 = (*width+1)*components;
|
184
|
+
for( m = 0; m < halfheight; m ++ )
|
185
|
+
{
|
186
|
+
for( n = 0; n < halfwidth; n ++ )
|
187
|
+
{
|
188
|
+
for( k = 0; k < components; k ++ )
|
189
|
+
{
|
190
|
+
*dst ++ = (GLubyte) (((int)*src +
|
191
|
+
(int)src[components] +
|
192
|
+
(int)src[idx1] +
|
193
|
+
(int)src[idx2] + 2) >> 2);
|
194
|
+
src ++;
|
195
|
+
}
|
196
|
+
src += components;
|
197
|
+
}
|
198
|
+
src += components * (*width);
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
// Return new width and height
|
203
|
+
*width = halfwidth;
|
204
|
+
*height = halfheight;
|
205
|
+
|
206
|
+
return GL_TRUE;
|
207
|
+
}
|
208
|
+
|
209
|
+
|
210
|
+
//========================================================================
|
211
|
+
// _glfwRescaleImage() - Rescales an image into power-of-two dimensions
|
212
|
+
//========================================================================
|
213
|
+
|
214
|
+
static int _glfwRescaleImage( GLFWimage* image )
|
215
|
+
{
|
216
|
+
int width, height, log2, newsize;
|
217
|
+
unsigned char *data;
|
218
|
+
|
219
|
+
// Calculate next larger 2^N width
|
220
|
+
for( log2 = 0, width = image->Width; width > 1; width >>= 1, log2 ++ )
|
221
|
+
;
|
222
|
+
width = (int) 1 << log2;
|
223
|
+
if( width < image->Width )
|
224
|
+
{
|
225
|
+
width <<= 1;
|
226
|
+
}
|
227
|
+
|
228
|
+
// Calculate next larger 2^M height
|
229
|
+
for( log2 = 0, height = image->Height; height > 1; height >>= 1, log2 ++ )
|
230
|
+
;
|
231
|
+
height = (int) 1 << log2;
|
232
|
+
if( height < image->Height )
|
233
|
+
{
|
234
|
+
height <<= 1;
|
235
|
+
}
|
236
|
+
|
237
|
+
// Do we really need to rescale?
|
238
|
+
if( width != image->Width || height != image->Height )
|
239
|
+
{
|
240
|
+
// Allocate memory for new (upsampled) image data
|
241
|
+
newsize = width * height * image->BytesPerPixel;
|
242
|
+
data = (unsigned char *) malloc( newsize );
|
243
|
+
if( data == NULL )
|
244
|
+
{
|
245
|
+
free( image->Data );
|
246
|
+
return GL_FALSE;
|
247
|
+
}
|
248
|
+
|
249
|
+
// Copy old image data to new image data with interpolation
|
250
|
+
_glfwUpsampleImage( image->Data, data, image->Width, image->Height,
|
251
|
+
width, height, image->BytesPerPixel );
|
252
|
+
|
253
|
+
// Free memory for old image data (not needed anymore)
|
254
|
+
free( image->Data );
|
255
|
+
|
256
|
+
// Set pointer to new image data, and set new image dimensions
|
257
|
+
image->Data = data;
|
258
|
+
image->Width = width;
|
259
|
+
image->Height = height;
|
260
|
+
}
|
261
|
+
|
262
|
+
return GL_TRUE;
|
263
|
+
}
|
264
|
+
|
265
|
+
|
266
|
+
//************************************************************************
|
267
|
+
//**** GLFW user functions ****
|
268
|
+
//************************************************************************
|
269
|
+
|
270
|
+
//========================================================================
|
271
|
+
// glfwReadImage() - Read an image from a named file
|
272
|
+
//========================================================================
|
273
|
+
|
274
|
+
GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img,
|
275
|
+
int flags )
|
276
|
+
{
|
277
|
+
_GLFWstream stream;
|
278
|
+
|
279
|
+
// Is GLFW initialized?
|
280
|
+
if( !_glfwInitialized )
|
281
|
+
{
|
282
|
+
return GL_FALSE;
|
283
|
+
}
|
284
|
+
|
285
|
+
// Start with an empty image descriptor
|
286
|
+
img->Width = 0;
|
287
|
+
img->Height = 0;
|
288
|
+
img->BytesPerPixel = 0;
|
289
|
+
img->Data = NULL;
|
290
|
+
|
291
|
+
// Open file
|
292
|
+
if( !_glfwOpenFileStream( &stream, name, "rb" ) )
|
293
|
+
{
|
294
|
+
return GL_FALSE;
|
295
|
+
}
|
296
|
+
|
297
|
+
// We only support TGA files at the moment
|
298
|
+
if( !_glfwReadTGA( &stream, img, flags ) )
|
299
|
+
{
|
300
|
+
_glfwCloseStream( &stream );
|
301
|
+
return GL_FALSE;
|
302
|
+
}
|
303
|
+
|
304
|
+
// Close stream
|
305
|
+
_glfwCloseStream( &stream );
|
306
|
+
|
307
|
+
// Should we rescale the image to closest 2^N x 2^M resolution?
|
308
|
+
if( !(flags & GLFW_NO_RESCALE_BIT) )
|
309
|
+
{
|
310
|
+
if( !_glfwRescaleImage( img ) )
|
311
|
+
{
|
312
|
+
return GL_FALSE;
|
313
|
+
}
|
314
|
+
}
|
315
|
+
|
316
|
+
// Interpret BytesPerPixel as an OpenGL format
|
317
|
+
switch( img->BytesPerPixel )
|
318
|
+
{
|
319
|
+
default:
|
320
|
+
case 1:
|
321
|
+
if( flags & GLFW_ALPHA_MAP_BIT )
|
322
|
+
{
|
323
|
+
img->Format = GL_ALPHA;
|
324
|
+
}
|
325
|
+
else
|
326
|
+
{
|
327
|
+
img->Format = GL_LUMINANCE;
|
328
|
+
}
|
329
|
+
break;
|
330
|
+
case 3:
|
331
|
+
img->Format = GL_RGB;
|
332
|
+
break;
|
333
|
+
case 4:
|
334
|
+
img->Format = GL_RGBA;
|
335
|
+
break;
|
336
|
+
}
|
337
|
+
|
338
|
+
return GL_TRUE;
|
339
|
+
}
|
340
|
+
|
341
|
+
|
342
|
+
//========================================================================
|
343
|
+
// glfwReadMemoryImage() - Read an image file from a memory buffer
|
344
|
+
//========================================================================
|
345
|
+
|
346
|
+
GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags )
|
347
|
+
{
|
348
|
+
_GLFWstream stream;
|
349
|
+
|
350
|
+
// Is GLFW initialized?
|
351
|
+
if( !_glfwInitialized )
|
352
|
+
{
|
353
|
+
return GL_FALSE;
|
354
|
+
}
|
355
|
+
|
356
|
+
// Start with an empty image descriptor
|
357
|
+
img->Width = 0;
|
358
|
+
img->Height = 0;
|
359
|
+
img->BytesPerPixel = 0;
|
360
|
+
img->Data = NULL;
|
361
|
+
|
362
|
+
// Open buffer
|
363
|
+
if( !_glfwOpenBufferStream( &stream, (void*) data, size ) )
|
364
|
+
{
|
365
|
+
return GL_FALSE;
|
366
|
+
}
|
367
|
+
|
368
|
+
// We only support TGA files at the moment
|
369
|
+
if( !_glfwReadTGA( &stream, img, flags ) )
|
370
|
+
{
|
371
|
+
_glfwCloseStream( &stream );
|
372
|
+
return GL_FALSE;
|
373
|
+
}
|
374
|
+
|
375
|
+
// Close stream
|
376
|
+
_glfwCloseStream( &stream );
|
377
|
+
|
378
|
+
// Should we rescale the image to closest 2^N x 2^M resolution?
|
379
|
+
if( !(flags & GLFW_NO_RESCALE_BIT) )
|
380
|
+
{
|
381
|
+
if( !_glfwRescaleImage( img ) )
|
382
|
+
{
|
383
|
+
return GL_FALSE;
|
384
|
+
}
|
385
|
+
}
|
386
|
+
|
387
|
+
// Interpret BytesPerPixel as an OpenGL format
|
388
|
+
switch( img->BytesPerPixel )
|
389
|
+
{
|
390
|
+
default:
|
391
|
+
case 1:
|
392
|
+
if( flags & GLFW_ALPHA_MAP_BIT )
|
393
|
+
{
|
394
|
+
img->Format = GL_ALPHA;
|
395
|
+
}
|
396
|
+
else
|
397
|
+
{
|
398
|
+
img->Format = GL_LUMINANCE;
|
399
|
+
}
|
400
|
+
break;
|
401
|
+
case 3:
|
402
|
+
img->Format = GL_RGB;
|
403
|
+
break;
|
404
|
+
case 4:
|
405
|
+
img->Format = GL_RGBA;
|
406
|
+
break;
|
407
|
+
}
|
408
|
+
|
409
|
+
return GL_TRUE;
|
410
|
+
}
|
411
|
+
|
412
|
+
|
413
|
+
//========================================================================
|
414
|
+
// glfwFreeImage() - Free allocated memory for an image
|
415
|
+
//========================================================================
|
416
|
+
|
417
|
+
GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img )
|
418
|
+
{
|
419
|
+
// Is GLFW initialized?
|
420
|
+
if( !_glfwInitialized )
|
421
|
+
{
|
422
|
+
return;
|
423
|
+
}
|
424
|
+
|
425
|
+
// Free memory
|
426
|
+
if( img->Data != NULL )
|
427
|
+
{
|
428
|
+
free( img->Data );
|
429
|
+
img->Data = NULL;
|
430
|
+
}
|
431
|
+
|
432
|
+
// Clear all fields
|
433
|
+
img->Width = 0;
|
434
|
+
img->Height = 0;
|
435
|
+
img->Format = 0;
|
436
|
+
img->BytesPerPixel = 0;
|
437
|
+
}
|
438
|
+
|
439
|
+
|
440
|
+
//========================================================================
|
441
|
+
// glfwLoadTexture2D() - Read an image from a file, and upload it to
|
442
|
+
// texture memory
|
443
|
+
//========================================================================
|
444
|
+
|
445
|
+
GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags )
|
446
|
+
{
|
447
|
+
GLFWimage img;
|
448
|
+
|
449
|
+
// Is GLFW initialized?
|
450
|
+
if( !_glfwInitialized || !_glfwWin.Opened )
|
451
|
+
{
|
452
|
+
return GL_FALSE;
|
453
|
+
}
|
454
|
+
|
455
|
+
// Force rescaling if necessary
|
456
|
+
if( !_glfwWin.Has_GL_ARB_texture_non_power_of_two )
|
457
|
+
{
|
458
|
+
flags &= (~GLFW_NO_RESCALE_BIT);
|
459
|
+
}
|
460
|
+
|
461
|
+
// Read image from file
|
462
|
+
if( !glfwReadImage( name, &img, flags ) )
|
463
|
+
{
|
464
|
+
return GL_FALSE;
|
465
|
+
}
|
466
|
+
|
467
|
+
if( !glfwLoadTextureImage2D( &img, flags ) )
|
468
|
+
{
|
469
|
+
return GL_FALSE;
|
470
|
+
}
|
471
|
+
|
472
|
+
// Data buffer is not needed anymore
|
473
|
+
glfwFreeImage( &img );
|
474
|
+
|
475
|
+
return GL_TRUE;
|
476
|
+
}
|
477
|
+
|
478
|
+
|
479
|
+
//========================================================================
|
480
|
+
// glfwLoadMemoryTexture2D() - Read an image from a buffer, and upload it to
|
481
|
+
// texture memory
|
482
|
+
//========================================================================
|
483
|
+
|
484
|
+
GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags )
|
485
|
+
{
|
486
|
+
GLFWimage img;
|
487
|
+
|
488
|
+
// Is GLFW initialized?
|
489
|
+
if( !_glfwInitialized || !_glfwWin.Opened )
|
490
|
+
{
|
491
|
+
return GL_FALSE;
|
492
|
+
}
|
493
|
+
|
494
|
+
// Force rescaling if necessary
|
495
|
+
if( !_glfwWin.Has_GL_ARB_texture_non_power_of_two )
|
496
|
+
{
|
497
|
+
flags &= (~GLFW_NO_RESCALE_BIT);
|
498
|
+
}
|
499
|
+
|
500
|
+
// Read image from file
|
501
|
+
if( !glfwReadMemoryImage( data, size, &img, flags ) )
|
502
|
+
{
|
503
|
+
return GL_FALSE;
|
504
|
+
}
|
505
|
+
|
506
|
+
if( !glfwLoadTextureImage2D( &img, flags ) )
|
507
|
+
{
|
508
|
+
return GL_FALSE;
|
509
|
+
}
|
510
|
+
|
511
|
+
// Data buffer is not needed anymore
|
512
|
+
glfwFreeImage( &img );
|
513
|
+
|
514
|
+
return GL_TRUE;
|
515
|
+
}
|
516
|
+
|
517
|
+
|
518
|
+
//========================================================================
|
519
|
+
// glfwLoadTextureImage2D() - Upload an image object to texture memory
|
520
|
+
//========================================================================
|
521
|
+
|
522
|
+
GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags )
|
523
|
+
{
|
524
|
+
GLint UnpackAlignment, GenMipMap;
|
525
|
+
int level, format, AutoGen, newsize, n;
|
526
|
+
unsigned char *data, *dataptr;
|
527
|
+
|
528
|
+
// Is GLFW initialized?
|
529
|
+
if( !_glfwInitialized || !_glfwWin.Opened )
|
530
|
+
{
|
531
|
+
return GL_FALSE;
|
532
|
+
}
|
533
|
+
|
534
|
+
// TODO: Use GL_MAX_TEXTURE_SIZE or GL_PROXY_TEXTURE_2D to determine
|
535
|
+
// whether the image size is valid.
|
536
|
+
// NOTE: May require box filter downsampling routine.
|
537
|
+
|
538
|
+
// Do we need to convert the alpha map to RGBA format (OpenGL 1.0)?
|
539
|
+
if( (_glfwWin.GLVerMajor == 1) && (_glfwWin.GLVerMinor == 0) &&
|
540
|
+
(img->Format == GL_ALPHA) )
|
541
|
+
{
|
542
|
+
// We go to RGBA representation instead
|
543
|
+
img->BytesPerPixel = 4;
|
544
|
+
|
545
|
+
// Allocate memory for new RGBA image data
|
546
|
+
newsize = img->Width * img->Height * img->BytesPerPixel;
|
547
|
+
data = (unsigned char *) malloc( newsize );
|
548
|
+
if( data == NULL )
|
549
|
+
{
|
550
|
+
free( img->Data );
|
551
|
+
return GL_FALSE;
|
552
|
+
}
|
553
|
+
|
554
|
+
// Convert Alpha map to RGBA
|
555
|
+
dataptr = data;
|
556
|
+
for( n = 0; n < (img->Width*img->Height); ++ n )
|
557
|
+
{
|
558
|
+
*dataptr ++ = 255;
|
559
|
+
*dataptr ++ = 255;
|
560
|
+
*dataptr ++ = 255;
|
561
|
+
*dataptr ++ = img->Data[n];
|
562
|
+
}
|
563
|
+
|
564
|
+
// Free memory for old image data (not needed anymore)
|
565
|
+
free( img->Data );
|
566
|
+
|
567
|
+
// Set pointer to new image data
|
568
|
+
img->Data = data;
|
569
|
+
}
|
570
|
+
|
571
|
+
// Set unpack alignment to one byte
|
572
|
+
glGetIntegerv( GL_UNPACK_ALIGNMENT, &UnpackAlignment );
|
573
|
+
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
|
574
|
+
|
575
|
+
// Should we use automatic mipmap generation?
|
576
|
+
AutoGen = ( flags & GLFW_BUILD_MIPMAPS_BIT ) &&
|
577
|
+
_glfwWin.Has_GL_SGIS_generate_mipmap;
|
578
|
+
|
579
|
+
// Enable automatic mipmap generation
|
580
|
+
if( AutoGen )
|
581
|
+
{
|
582
|
+
glGetTexParameteriv( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,
|
583
|
+
&GenMipMap );
|
584
|
+
glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,
|
585
|
+
GL_TRUE );
|
586
|
+
}
|
587
|
+
|
588
|
+
// Format specification is different for OpenGL 1.0
|
589
|
+
if( _glfwWin.GLVerMajor == 1 && _glfwWin.GLVerMinor == 0 )
|
590
|
+
{
|
591
|
+
format = img->BytesPerPixel;
|
592
|
+
}
|
593
|
+
else
|
594
|
+
{
|
595
|
+
format = img->Format;
|
596
|
+
}
|
597
|
+
|
598
|
+
// Upload to texture memeory
|
599
|
+
level = 0;
|
600
|
+
do
|
601
|
+
{
|
602
|
+
// Upload this mipmap level
|
603
|
+
glTexImage2D( GL_TEXTURE_2D, level, format,
|
604
|
+
img->Width, img->Height, 0, format,
|
605
|
+
GL_UNSIGNED_BYTE, (void*) img->Data );
|
606
|
+
|
607
|
+
// Build next mipmap level manually, if required
|
608
|
+
if( ( flags & GLFW_BUILD_MIPMAPS_BIT ) && !AutoGen )
|
609
|
+
{
|
610
|
+
level = _glfwHalveImage( img->Data, &img->Width,
|
611
|
+
&img->Height, img->BytesPerPixel ) ?
|
612
|
+
level + 1 : 0;
|
613
|
+
}
|
614
|
+
}
|
615
|
+
while( level != 0 );
|
616
|
+
|
617
|
+
// Restore old automatic mipmap generation state
|
618
|
+
if( AutoGen )
|
619
|
+
{
|
620
|
+
glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS,
|
621
|
+
GenMipMap );
|
622
|
+
}
|
623
|
+
|
624
|
+
// Restore old unpack alignment
|
625
|
+
glPixelStorei( GL_UNPACK_ALIGNMENT, UnpackAlignment );
|
626
|
+
|
627
|
+
return GL_TRUE;
|
628
|
+
}
|
629
|
+
|