From efa6ab2f4299e6b6a0be00a7ba1f091d0ffd6fb3 Mon Sep 17 00:00:00 2001 From: Tomas Sedovic Date: Thu, 26 May 2016 12:44:28 +0200 Subject: [PATCH 1/4] Remove the pc-windows-gnu ci fixup This should reproduce the tcod-rs issue #222. --- appveyor.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9c32f2c0..add9acf2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -37,7 +37,4 @@ build: false # Equivalent to Travis' `script` phase test_script: - cargo build --verbose - # This is a temporary measure to fix the doc tests failing on `pc-window-gnu` - # builds with a "cannot find -lSDL.dll" error. - - cp target/debug/build/tcod-sys-*/out/SDL.dll target/debug/deps/SDL.dll.dll - cargo test --verbose From 8668b82140f48afadb21e50c02e4dc2f3b1ec85b Mon Sep 17 00:00:00 2001 From: Tomas Sedovic Date: Thu, 26 May 2016 13:36:25 +0200 Subject: [PATCH 2/4] Comment out all but one failing test env This should make our test/debug iteration faster. --- appveyor.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index add9acf2..27e535a0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,16 +8,16 @@ matrix: - RUST_CHANNEL: nightly environment: matrix: - - TARGET: x86_64-pc-windows-msvc - ARCH: amd64 - VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat - - TARGET: i686-pc-windows-msvc - ARCH: x86 - VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + #- TARGET: x86_64-pc-windows-msvc + #ARCH: amd64 + #VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + #- TARGET: i686-pc-windows-msvc + #ARCH: x86 + #VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat - TARGET: x86_64-pc-windows-gnu MSYS_BITS: 64 - - TARGET: i686-pc-windows-gnu - MSYS_BITS: 32 + #- TARGET: i686-pc-windows-gnu + #MSYS_BITS: 32 # Install Rust and Cargo install: From 5d60281e38328dee5e66b5305a11cdc75fbae9a6 Mon Sep 17 00:00:00 2001 From: Tomas Sedovic Date: Thu, 26 May 2016 16:25:26 +0200 Subject: [PATCH 3/4] Add tcod locally This should make it easy to iterate quickly -- we make a change in tcod here, push it and see the build results. --- Cargo.toml | 2 +- tcod/.cargo/config | 39 + tcod/.gitignore | 31 + tcod/.travis.yml | 40 + tcod/COPYING.txt | 13 + tcod/Cargo.toml | 42 + tcod/Makefile | 14 + tcod/README.md | 221 + tcod/appveyor.yml | 26 + tcod/arial10x10.png | Bin 0 -> 14870 bytes tcod/consolas10x10_gs_tc.png | Bin 0 -> 8651 bytes tcod/data/img/circle.png | Bin 0 -> 322 bytes tcod/data/img/skull.png | Bin 0 -> 1953 bytes tcod/data/namegen/README.txt | 70 + tcod/data/namegen/jice_celtic.cfg | 15 + tcod/data/namegen/jice_fantasy.cfg | 17 + tcod/data/namegen/jice_mesopotamian.cfg | 17 + tcod/data/namegen/jice_norse.cfg | 17 + tcod/data/namegen/jice_region.cfg | 7 + tcod/data/namegen/jice_town.cfg | 6 + tcod/data/namegen/mingos_demon.cfg | 16 + tcod/data/namegen/mingos_dwarf.cfg | 29 + tcod/data/namegen/mingos_norse.cfg | 19 + tcod/data/namegen/mingos_standard.cfg | 17 + tcod/data/namegen/mingos_town.cfg | 9 + tcod/examples/astar-path-finding.rs | 68 + tcod/examples/blit.rs | 42 + tcod/examples/chars.rs | 32 + tcod/examples/colors.rs | 38 + tcod/examples/dijkstra-path-finding.rs | 50 + tcod/examples/fov.rs | 54 + tcod/examples/keyboard.rs | 33 + tcod/examples/minimal.rs | 13 + tcod/examples/mouse.rs | 41 + tcod/examples/namegen.rs | 16 + tcod/examples/print_macros.rs | 28 + tcod/examples/roguelike-tutorial-1.rs | 70 + tcod/examples/roguelike-tutorial-2.rs | 173 + tcod/examples/samples.rs | 1761 +++++ tcod/examples/shapes.rs | 26 + tcod/examples/text.rs | 22 + tcod/fonts/README.txt | 36 + tcod/fonts/arial10x10.png | Bin 0 -> 14870 bytes tcod/fonts/arial12x12.png | Bin 0 -> 16364 bytes tcod/fonts/arial8x8.png | Bin 0 -> 11559 bytes tcod/fonts/caeldera8x8_gs_tc.png | Bin 0 -> 6882 bytes tcod/fonts/celtic_garamond_10x10_gs_tc.png | Bin 0 -> 8558 bytes tcod/fonts/consolas10x10_gs_tc.png | Bin 0 -> 8651 bytes tcod/fonts/consolas12x12_gs_tc.png | Bin 0 -> 8204 bytes tcod/fonts/consolas8x8_gs_tc.png | Bin 0 -> 5936 bytes tcod/fonts/consolas_unicode_10x10.png | Bin 0 -> 24558 bytes tcod/fonts/consolas_unicode_12x12.png | Bin 0 -> 30673 bytes tcod/fonts/consolas_unicode_16x16.png | Bin 0 -> 42003 bytes tcod/fonts/consolas_unicode_8x8.png | Bin 0 -> 50472 bytes tcod/fonts/courier10x10_aa_tc.png | Bin 0 -> 11760 bytes tcod/fonts/courier12x12_aa_tc.png | Bin 0 -> 11935 bytes tcod/fonts/courier8x8_aa_tc.png | Bin 0 -> 9126 bytes tcod/fonts/dejavu10x10_gs_tc.png | Bin 0 -> 8439 bytes tcod/fonts/dejavu12x12_gs_tc.png | Bin 0 -> 7892 bytes tcod/fonts/dejavu16x16_gs_tc.png | Bin 0 -> 12140 bytes tcod/fonts/dejavu8x8_gs_tc.png | Bin 0 -> 5507 bytes tcod/fonts/dejavu_wide12x12_gs_tc.png | Bin 0 -> 9889 bytes tcod/fonts/dejavu_wide16x16_gs_tc.png | Bin 0 -> 13190 bytes tcod/fonts/dundalk12x12_gs_tc.png | Bin 0 -> 11591 bytes tcod/fonts/lucida10x10_gs_tc.png | Bin 0 -> 8876 bytes tcod/fonts/lucida12x12_gs_tc.png | Bin 0 -> 8195 bytes tcod/fonts/lucida8x8_gs_tc.png | Bin 0 -> 7712 bytes tcod/fonts/prestige10x10_gs_tc.png | Bin 0 -> 8090 bytes tcod/fonts/prestige12x12_gs_tc.png | Bin 0 -> 7794 bytes tcod/fonts/prestige8x8_gs_tc.png | Bin 0 -> 5516 bytes tcod/fonts/terminal10x10_gs_tc.png | Bin 0 -> 8804 bytes tcod/fonts/terminal10x16_gs_ro.png | Bin 0 -> 5699 bytes tcod/fonts/terminal10x16_gs_tc.png | Bin 0 -> 3678 bytes tcod/fonts/terminal10x18_gs_ro.png | Bin 0 -> 6442 bytes tcod/fonts/terminal12x12_gs_ro.png | Bin 0 -> 5260 bytes tcod/fonts/terminal16x16_gs_ro.png | Bin 0 -> 8240 bytes tcod/fonts/terminal7x7_gs_tc.png | Bin 0 -> 6971 bytes tcod/fonts/terminal8x12_gs_ro.png | Bin 0 -> 4504 bytes tcod/fonts/terminal8x12_gs_tc.png | Bin 0 -> 2765 bytes tcod/fonts/terminal8x14_gs_ro.png | Bin 0 -> 4564 bytes tcod/fonts/terminal8x8_aa_as.png | Bin 0 -> 4903 bytes tcod/fonts/terminal8x8_aa_ro.png | Bin 0 -> 4545 bytes tcod/fonts/terminal8x8_aa_tc.png | Bin 0 -> 2899 bytes tcod/fonts/terminal8x8_gs_as.png | Bin 0 -> 3503 bytes tcod/fonts/terminal8x8_gs_ro.png | Bin 0 -> 3696 bytes tcod/fonts/terminal8x8_gs_tc.png | Bin 0 -> 1984 bytes tcod/precompiled/i686-pc-windows-gnu/.gitkeep | 0 .../i686-unknown-linux-gnu/.gitkeep | 0 .../x86_64-unknown-linux-gnu/.gitkeep | 0 tcod/src/bindings.rs | 46 + tcod/src/bsp.rs | 487 ++ tcod/src/chars.rs | 80 + tcod/src/colors.rs | 335 + tcod/src/console.rs | 1124 +++ tcod/src/console_macros.rs | 106 + tcod/src/image.rs | 218 + tcod/src/input.rs | 255 + tcod/src/lib.rs | 74 + tcod/src/line.rs | 162 + tcod/src/map.rs | 93 + tcod/src/namegen.rs | 107 + tcod/src/noise.rs | 463 ++ tcod/src/pathfinding.rs | 387 + tcod/src/random.rs | 117 + tcod/src/rustc_serialize_impls.rs | 47 + tcod/src/serde_impls.rs | 138 + tcod/src/system.rs | 105 + tcod/tcod_sys/Cargo.toml | 24 + tcod/tcod_sys/build.rs | 255 + tcod/tcod_sys/lib.rs | 1897 +++++ tcod/tcod_sys/libtcod/LIBTCOD-CREDITS.txt | 45 + tcod/tcod_sys/libtcod/LIBTCOD-LICENSE.txt | 29 + tcod/tcod_sys/libtcod/README-SDL.txt | 13 + .../include/i686-pc-windows-gnu/SDL/SDL.h | 101 + .../i686-pc-windows-gnu/SDL/SDL_active.h | 63 + .../i686-pc-windows-gnu/SDL/SDL_audio.h | 284 + .../i686-pc-windows-gnu/SDL/SDL_byteorder.h | 29 + .../i686-pc-windows-gnu/SDL/SDL_cdrom.h | 202 + .../i686-pc-windows-gnu/SDL/SDL_config.h | 45 + .../SDL/SDL_config_win32.h | 183 + .../i686-pc-windows-gnu/SDL/SDL_copying.h | 22 + .../i686-pc-windows-gnu/SDL/SDL_cpuinfo.h | 69 + .../i686-pc-windows-gnu/SDL/SDL_endian.h | 214 + .../i686-pc-windows-gnu/SDL/SDL_error.h | 72 + .../i686-pc-windows-gnu/SDL/SDL_events.h | 356 + .../i686-pc-windows-gnu/SDL/SDL_getenv.h | 28 + .../i686-pc-windows-gnu/SDL/SDL_joystick.h | 187 + .../i686-pc-windows-gnu/SDL/SDL_keyboard.h | 135 + .../i686-pc-windows-gnu/SDL/SDL_keysym.h | 326 + .../i686-pc-windows-gnu/SDL/SDL_loadso.h | 78 + .../i686-pc-windows-gnu/SDL/SDL_main.h | 106 + .../i686-pc-windows-gnu/SDL/SDL_mouse.h | 143 + .../i686-pc-windows-gnu/SDL/SDL_mutex.h | 177 + .../i686-pc-windows-gnu/SDL/SDL_name.h | 11 + .../i686-pc-windows-gnu/SDL/SDL_opengl.h | 6570 +++++++++++++++++ .../i686-pc-windows-gnu/SDL/SDL_platform.h | 110 + .../i686-pc-windows-gnu/SDL/SDL_quit.h | 55 + .../i686-pc-windows-gnu/SDL/SDL_rwops.h | 155 + .../i686-pc-windows-gnu/SDL/SDL_stdinc.h | 620 ++ .../i686-pc-windows-gnu/SDL/SDL_syswm.h | 226 + .../i686-pc-windows-gnu/SDL/SDL_thread.h | 115 + .../i686-pc-windows-gnu/SDL/SDL_timer.h | 125 + .../i686-pc-windows-gnu/SDL/SDL_types.h | 28 + .../i686-pc-windows-gnu/SDL/SDL_version.h | 91 + .../i686-pc-windows-gnu/SDL/SDL_video.h | 951 +++ .../i686-pc-windows-gnu/SDL/begin_code.h | 196 + .../i686-pc-windows-gnu/SDL/close_code.h | 46 + .../include/i686-pc-windows-msvc/SDL/SDL.h | 101 + .../i686-pc-windows-msvc/SDL/SDL_active.h | 63 + .../i686-pc-windows-msvc/SDL/SDL_audio.h | 284 + .../i686-pc-windows-msvc/SDL/SDL_byteorder.h | 29 + .../i686-pc-windows-msvc/SDL/SDL_cdrom.h | 202 + .../i686-pc-windows-msvc/SDL/SDL_config.h | 45 + .../SDL/SDL_config_dreamcast.h | 106 + .../SDL/SDL_config_macos.h | 112 + .../SDL/SDL_config_macosx.h | 150 + .../SDL/SDL_config_minimal.h | 62 + .../i686-pc-windows-msvc/SDL/SDL_config_nds.h | 115 + .../i686-pc-windows-msvc/SDL/SDL_config_os2.h | 141 + .../SDL/SDL_config_symbian.h | 146 + .../SDL/SDL_config_win32.h | 183 + .../i686-pc-windows-msvc/SDL/SDL_copying.h | 22 + .../i686-pc-windows-msvc/SDL/SDL_cpuinfo.h | 69 + .../i686-pc-windows-msvc/SDL/SDL_endian.h | 214 + .../i686-pc-windows-msvc/SDL/SDL_error.h | 72 + .../i686-pc-windows-msvc/SDL/SDL_events.h | 356 + .../i686-pc-windows-msvc/SDL/SDL_getenv.h | 28 + .../i686-pc-windows-msvc/SDL/SDL_joystick.h | 187 + .../i686-pc-windows-msvc/SDL/SDL_keyboard.h | 135 + .../i686-pc-windows-msvc/SDL/SDL_keysym.h | 326 + .../i686-pc-windows-msvc/SDL/SDL_loadso.h | 78 + .../i686-pc-windows-msvc/SDL/SDL_main.h | 106 + .../i686-pc-windows-msvc/SDL/SDL_mouse.h | 143 + .../i686-pc-windows-msvc/SDL/SDL_mutex.h | 177 + .../i686-pc-windows-msvc/SDL/SDL_name.h | 11 + .../i686-pc-windows-msvc/SDL/SDL_opengl.h | 6570 +++++++++++++++++ .../i686-pc-windows-msvc/SDL/SDL_platform.h | 110 + .../i686-pc-windows-msvc/SDL/SDL_quit.h | 55 + .../i686-pc-windows-msvc/SDL/SDL_rwops.h | 155 + .../i686-pc-windows-msvc/SDL/SDL_stdinc.h | 620 ++ .../i686-pc-windows-msvc/SDL/SDL_syswm.h | 226 + .../i686-pc-windows-msvc/SDL/SDL_thread.h | 115 + .../i686-pc-windows-msvc/SDL/SDL_timer.h | 125 + .../i686-pc-windows-msvc/SDL/SDL_types.h | 28 + .../i686-pc-windows-msvc/SDL/SDL_version.h | 91 + .../i686-pc-windows-msvc/SDL/SDL_video.h | 951 +++ .../i686-pc-windows-msvc/SDL/begin_code.h | 196 + .../i686-pc-windows-msvc/SDL/close_code.h | 46 + .../include/x86_64-pc-windows-gnu/SDL/SDL.h | 101 + .../x86_64-pc-windows-gnu/SDL/SDL_active.h | 63 + .../x86_64-pc-windows-gnu/SDL/SDL_audio.h | 284 + .../x86_64-pc-windows-gnu/SDL/SDL_byteorder.h | 29 + .../x86_64-pc-windows-gnu/SDL/SDL_cdrom.h | 202 + .../x86_64-pc-windows-gnu/SDL/SDL_config.h | 312 + .../x86_64-pc-windows-gnu/SDL/SDL_cpuinfo.h | 69 + .../x86_64-pc-windows-gnu/SDL/SDL_endian.h | 214 + .../x86_64-pc-windows-gnu/SDL/SDL_error.h | 72 + .../x86_64-pc-windows-gnu/SDL/SDL_events.h | 356 + .../x86_64-pc-windows-gnu/SDL/SDL_getenv.h | 28 + .../x86_64-pc-windows-gnu/SDL/SDL_joystick.h | 187 + .../x86_64-pc-windows-gnu/SDL/SDL_keyboard.h | 135 + .../x86_64-pc-windows-gnu/SDL/SDL_keysym.h | 326 + .../x86_64-pc-windows-gnu/SDL/SDL_loadso.h | 78 + .../x86_64-pc-windows-gnu/SDL/SDL_main.h | 106 + .../x86_64-pc-windows-gnu/SDL/SDL_mouse.h | 143 + .../x86_64-pc-windows-gnu/SDL/SDL_mutex.h | 177 + .../x86_64-pc-windows-gnu/SDL/SDL_name.h | 11 + .../x86_64-pc-windows-gnu/SDL/SDL_opengl.h | 6570 +++++++++++++++++ .../x86_64-pc-windows-gnu/SDL/SDL_platform.h | 110 + .../x86_64-pc-windows-gnu/SDL/SDL_quit.h | 55 + .../x86_64-pc-windows-gnu/SDL/SDL_rwops.h | 155 + .../x86_64-pc-windows-gnu/SDL/SDL_stdinc.h | 620 ++ .../x86_64-pc-windows-gnu/SDL/SDL_syswm.h | 226 + .../x86_64-pc-windows-gnu/SDL/SDL_thread.h | 115 + .../x86_64-pc-windows-gnu/SDL/SDL_timer.h | 125 + .../x86_64-pc-windows-gnu/SDL/SDL_types.h | 28 + .../x86_64-pc-windows-gnu/SDL/SDL_version.h | 91 + .../x86_64-pc-windows-gnu/SDL/SDL_video.h | 951 +++ .../x86_64-pc-windows-gnu/SDL/begin_code.h | 191 + .../x86_64-pc-windows-gnu/SDL/close_code.h | 46 + .../include/x86_64-pc-windows-msvc/SDL/SDL.h | 101 + .../x86_64-pc-windows-msvc/SDL/SDL_active.h | 63 + .../x86_64-pc-windows-msvc/SDL/SDL_audio.h | 284 + .../SDL/SDL_byteorder.h | 29 + .../x86_64-pc-windows-msvc/SDL/SDL_cdrom.h | 202 + .../x86_64-pc-windows-msvc/SDL/SDL_config.h | 45 + .../SDL/SDL_config_dreamcast.h | 106 + .../SDL/SDL_config_macos.h | 112 + .../SDL/SDL_config_macosx.h | 150 + .../SDL/SDL_config_minimal.h | 62 + .../SDL/SDL_config_nds.h | 115 + .../SDL/SDL_config_os2.h | 141 + .../SDL/SDL_config_symbian.h | 146 + .../SDL/SDL_config_win32.h | 183 + .../x86_64-pc-windows-msvc/SDL/SDL_copying.h | 22 + .../x86_64-pc-windows-msvc/SDL/SDL_cpuinfo.h | 69 + .../x86_64-pc-windows-msvc/SDL/SDL_endian.h | 214 + .../x86_64-pc-windows-msvc/SDL/SDL_error.h | 72 + .../x86_64-pc-windows-msvc/SDL/SDL_events.h | 356 + .../x86_64-pc-windows-msvc/SDL/SDL_getenv.h | 28 + .../x86_64-pc-windows-msvc/SDL/SDL_joystick.h | 187 + .../x86_64-pc-windows-msvc/SDL/SDL_keyboard.h | 135 + .../x86_64-pc-windows-msvc/SDL/SDL_keysym.h | 326 + .../x86_64-pc-windows-msvc/SDL/SDL_loadso.h | 78 + .../x86_64-pc-windows-msvc/SDL/SDL_main.h | 106 + .../x86_64-pc-windows-msvc/SDL/SDL_mouse.h | 143 + .../x86_64-pc-windows-msvc/SDL/SDL_mutex.h | 177 + .../x86_64-pc-windows-msvc/SDL/SDL_name.h | 11 + .../x86_64-pc-windows-msvc/SDL/SDL_opengl.h | 6570 +++++++++++++++++ .../x86_64-pc-windows-msvc/SDL/SDL_platform.h | 110 + .../x86_64-pc-windows-msvc/SDL/SDL_quit.h | 55 + .../x86_64-pc-windows-msvc/SDL/SDL_rwops.h | 155 + .../x86_64-pc-windows-msvc/SDL/SDL_stdinc.h | 620 ++ .../x86_64-pc-windows-msvc/SDL/SDL_syswm.h | 226 + .../x86_64-pc-windows-msvc/SDL/SDL_thread.h | 115 + .../x86_64-pc-windows-msvc/SDL/SDL_timer.h | 125 + .../x86_64-pc-windows-msvc/SDL/SDL_types.h | 28 + .../x86_64-pc-windows-msvc/SDL/SDL_version.h | 91 + .../x86_64-pc-windows-msvc/SDL/SDL_video.h | 951 +++ .../x86_64-pc-windows-msvc/SDL/begin_code.h | 196 + .../x86_64-pc-windows-msvc/SDL/close_code.h | 46 + .../lib/i686-pc-windows-gnu/SDL.dll | Bin 0 -> 126976 bytes .../lib/i686-pc-windows-gnu/libSDL.dll.a | Bin 0 -> 127572 bytes .../lib/i686-pc-windows-msvc/SDL.dll | Bin 0 -> 303616 bytes .../lib/i686-pc-windows-msvc/SDL.lib | Bin 0 -> 42522 bytes .../lib/i686-pc-windows-msvc/SDLmain.lib | Bin 0 -> 8214 bytes .../lib/x86_64-pc-windows-gnu/SDL.dll | Bin 0 -> 314368 bytes .../lib/x86_64-pc-windows-gnu/libSDL.a | Bin 0 -> 1799420 bytes .../lib/x86_64-pc-windows-gnu/libSDL.dll.a | Bin 0 -> 124908 bytes .../lib/x86_64-pc-windows-gnu/libSDL.la | 41 + .../lib/x86_64-pc-windows-gnu/libSDLmain.a | Bin 0 -> 14816 bytes .../x86_64-pc-windows-gnu/pkgconfig/sdl.pc | 15 + .../lib/x86_64-pc-windows-msvc/SDL.dll | Bin 0 -> 306688 bytes .../lib/x86_64-pc-windows-msvc/SDL.lib | Bin 0 -> 41512 bytes .../lib/x86_64-pc-windows-msvc/SDLmain.lib | Bin 0 -> 11176 bytes tcod/tcod_sys/libtcod/include/bresenham.h | 55 + tcod/tcod_sys/libtcod/include/bresenham.hpp | 138 + tcod/tcod_sys/libtcod/include/bsp.h | 63 + tcod/tcod_sys/libtcod/include/bsp.hpp | 406 + tcod/tcod_sys/libtcod/include/color.h | 322 + tcod/tcod_sys/libtcod/include/color.hpp | 690 ++ tcod/tcod_sys/libtcod/include/console.h | 125 + tcod/tcod_sys/libtcod/include/console.hpp | 1770 +++++ tcod/tcod_sys/libtcod/include/console_types.h | 261 + tcod/tcod_sys/libtcod/include/fov.h | 58 + tcod/tcod_sys/libtcod/include/fov.hpp | 257 + tcod/tcod_sys/libtcod/include/fov_types.h | 54 + tcod/tcod_sys/libtcod/include/gui/button.hpp | 46 + .../libtcod/include/gui/container.hpp | 40 + .../tcod_sys/libtcod/include/gui/flatlist.hpp | 48 + tcod/tcod_sys/libtcod/include/gui/gui.hpp | 64 + tcod/tcod_sys/libtcod/include/gui/hbox.hpp | 32 + tcod/tcod_sys/libtcod/include/gui/image.hpp | 38 + tcod/tcod_sys/libtcod/include/gui/label.hpp | 38 + .../libtcod/include/gui/radiobutton.hpp | 47 + tcod/tcod_sys/libtcod/include/gui/slider.hpp | 54 + .../libtcod/include/gui/statusbar.hpp | 32 + tcod/tcod_sys/libtcod/include/gui/textbox.hpp | 50 + .../libtcod/include/gui/togglebutton.hpp | 40 + tcod/tcod_sys/libtcod/include/gui/toolbar.hpp | 40 + tcod/tcod_sys/libtcod/include/gui/vbox.hpp | 34 + tcod/tcod_sys/libtcod/include/gui/widget.hpp | 80 + tcod/tcod_sys/libtcod/include/heightmap.h | 70 + tcod/tcod_sys/libtcod/include/heightmap.hpp | 500 ++ tcod/tcod_sys/libtcod/include/howto.hpp | 155 + tcod/tcod_sys/libtcod/include/image.h | 54 + tcod/tcod_sys/libtcod/include/image.hpp | 440 ++ tcod/tcod_sys/libtcod/include/lex.h | 101 + tcod/tcod_sys/libtcod/include/lex.hpp | 73 + tcod/tcod_sys/libtcod/include/libtcod.h | 202 + tcod/tcod_sys/libtcod/include/libtcod.hpp | 51 + tcod/tcod_sys/libtcod/include/libtcod_int.h | 459 ++ tcod/tcod_sys/libtcod/include/list.h | 57 + tcod/tcod_sys/libtcod/include/list.hpp | 616 ++ tcod/tcod_sys/libtcod/include/mersenne.h | 56 + tcod/tcod_sys/libtcod/include/mersenne.hpp | 400 + .../tcod_sys/libtcod/include/mersenne_types.h | 53 + tcod/tcod_sys/libtcod/include/mouse.h | 39 + tcod/tcod_sys/libtcod/include/mouse.hpp | 76 + tcod/tcod_sys/libtcod/include/mouse_types.h | 47 + tcod/tcod_sys/libtcod/include/namegen.h | 49 + tcod/tcod_sys/libtcod/include/namegen.hpp | 290 + tcod/tcod_sys/libtcod/include/noise.h | 56 + tcod/tcod_sys/libtcod/include/noise.hpp | 323 + .../tcod_sys/libtcod/include/noise_defaults.h | 9 + tcod/tcod_sys/libtcod/include/parser.h | 171 + tcod/tcod_sys/libtcod/include/parser.hpp | 672 ++ tcod/tcod_sys/libtcod/include/path.h | 63 + tcod/tcod_sys/libtcod/include/path.hpp | 552 ++ tcod/tcod_sys/libtcod/include/sys.h | 119 + tcod/tcod_sys/libtcod/include/sys.hpp | 541 ++ tcod/tcod_sys/libtcod/include/tree.h | 40 + tcod/tcod_sys/libtcod/include/tree.hpp | 51 + tcod/tcod_sys/libtcod/include/txtfield.h | 45 + tcod/tcod_sys/libtcod/include/txtfield.hpp | 50 + tcod/tcod_sys/libtcod/include/wrappers.h | 148 + tcod/tcod_sys/libtcod/include/zip.h | 62 + tcod/tcod_sys/libtcod/include/zip.hpp | 331 + tcod/tcod_sys/libtcod/lib/donotremove | 0 tcod/tcod_sys/libtcod/libtcod-CHANGELOG.txt | 491 ++ tcod/tcod_sys/libtcod/libtcod.cfg | 32 + tcod/tcod_sys/libtcod/makefiles/README.txt | 26 + .../tcod_sys/libtcod/makefiles/makefile-haiku | 217 + .../tcod_sys/libtcod/makefiles/makefile-linux | 197 + .../libtcod/makefiles/makefile-linux-win32 | 195 + .../libtcod/makefiles/makefile-linux64-32 | 197 + .../tcod_sys/libtcod/makefiles/makefile-mingw | 191 + .../libtcod/makefiles/makefile-mingw-sdl2 | 194 + tcod/tcod_sys/libtcod/makefiles/makefile-osx | 201 + .../libtcod/makefiles/makefile-samples-haiku | 78 + .../libtcod/makefiles/makefile-samples-linux | 78 + .../makefiles/makefile-samples-linux-win32 | 82 + .../makefiles/makefile-samples-linux64-32 | 78 + .../libtcod/makefiles/makefile-samples-mingw | 84 + .../makefiles/makefile-samples-mingw-sdl2 | 81 + tcod/tcod_sys/libtcod/osx/._hmtool_Info.plist | Bin 0 -> 222 bytes tcod/tcod_sys/libtcod/osx/._macsupport.h | Bin 0 -> 222 bytes tcod/tcod_sys/libtcod/osx/._macsupport.m | Bin 0 -> 222 bytes .../libtcod/osx/._samples_c_Info.plist | Bin 0 -> 222 bytes .../libtcod/osx/._samples_cpp_Info.plist | Bin 0 -> 222 bytes tcod/tcod_sys/libtcod/osx/hmtool_Info.plist | 8 + tcod/tcod_sys/libtcod/osx/macsupport.h | 16 + tcod/tcod_sys/libtcod/osx/macsupport.m | 29 + .../tcod_sys/libtcod/osx/samples_c_Info.plist | 8 + .../libtcod/osx/samples_cpp_Info.plist | 8 + tcod/tcod_sys/libtcod/src/README.txt | 46 + tcod/tcod_sys/libtcod/src/bresenham.cpp | 51 + tcod/tcod_sys/libtcod/src/bresenham_c.c | 103 + tcod/tcod_sys/libtcod/src/bsp.cpp | 168 + tcod/tcod_sys/libtcod/src/bsp_c.c | 213 + tcod/tcod_sys/libtcod/src/color.cpp | 348 + tcod/tcod_sys/libtcod/src/color_c.c | 560 ++ tcod/tcod_sys/libtcod/src/console.cpp | 432 ++ tcod/tcod_sys/libtcod/src/console_c.c | 2288 ++++++ tcod/tcod_sys/libtcod/src/fov.cpp | 78 + tcod/tcod_sys/libtcod/src/fov_c.c | 149 + .../libtcod/src/fov_circular_raycasting.c | 236 + .../libtcod/src/fov_diamond_raycasting.c | 204 + tcod/tcod_sys/libtcod/src/fov_permissive2.c | 254 + .../libtcod/src/fov_recursive_shadowcasting.c | 106 + tcod/tcod_sys/libtcod/src/fov_restrictive.c | 234 + tcod/tcod_sys/libtcod/src/gui/README.txt | 1 + tcod/tcod_sys/libtcod/src/gui/button.cpp | 103 + tcod/tcod_sys/libtcod/src/gui/container.cpp | 63 + tcod/tcod_sys/libtcod/src/gui/flatlist.cpp | 115 + tcod/tcod_sys/libtcod/src/gui/hbox.cpp | 52 + tcod/tcod_sys/libtcod/src/gui/image.cpp | 50 + tcod/tcod_sys/libtcod/src/gui/label.cpp | 49 + tcod/tcod_sys/libtcod/src/gui/radiobutton.cpp | 65 + tcod/tcod_sys/libtcod/src/gui/slider.cpp | 127 + tcod/tcod_sys/libtcod/src/gui/statusbar.cpp | 39 + tcod/tcod_sys/libtcod/src/gui/textbox.cpp | 159 + .../tcod_sys/libtcod/src/gui/togglebutton.cpp | 54 + tcod/tcod_sys/libtcod/src/gui/toolbar.cpp | 125 + tcod/tcod_sys/libtcod/src/gui/vbox.cpp | 49 + tcod/tcod_sys/libtcod/src/gui/widget.cpp | 143 + tcod/tcod_sys/libtcod/src/heightmap.cpp | 175 + tcod/tcod_sys/libtcod/src/heightmap_c.c | 557 ++ tcod/tcod_sys/libtcod/src/image.cpp | 124 + tcod/tcod_sys/libtcod/src/image_c.c | 804 ++ tcod/tcod_sys/libtcod/src/lex.cpp | 104 + tcod/tcod_sys/libtcod/src/lex_c.c | 699 ++ tcod/tcod_sys/libtcod/src/list_c.c | 198 + tcod/tcod_sys/libtcod/src/mersenne.cpp | 60 + tcod/tcod_sys/libtcod/src/mersenne_c.c | 542 ++ tcod/tcod_sys/libtcod/src/mouse.cpp | 44 + tcod/tcod_sys/libtcod/src/namegen.cpp | 52 + tcod/tcod_sys/libtcod/src/namegen_c.c | 639 ++ tcod/tcod_sys/libtcod/src/noise.cpp | 70 + tcod/tcod_sys/libtcod/src/noise_c.c | 798 ++ tcod/tcod_sys/libtcod/src/parser.cpp | 184 + tcod/tcod_sys/libtcod/src/parser_c.c | 931 +++ tcod/tcod_sys/libtcod/src/path.cpp | 139 + tcod/tcod_sys/libtcod/src/path_c.c | 689 ++ tcod/tcod_sys/libtcod/src/png/lodepng.c | 5921 +++++++++++++++ tcod/tcod_sys/libtcod/src/png/lodepng.h | 1633 ++++ tcod/tcod_sys/libtcod/src/sys.cpp | 229 + tcod/tcod_sys/libtcod/src/sys_c.c | 692 ++ tcod/tcod_sys/libtcod/src/sys_opengl_c.c | 661 ++ tcod/tcod_sys/libtcod/src/sys_sdl_c.c | 2312 ++++++ tcod/tcod_sys/libtcod/src/sys_sdl_img_bmp.c | 72 + tcod/tcod_sys/libtcod/src/sys_sdl_img_png.c | 121 + tcod/tcod_sys/libtcod/src/tree_c.c | 44 + tcod/tcod_sys/libtcod/src/txtfield.cpp | 70 + tcod/tcod_sys/libtcod/src/txtfield_c.c | 678 ++ tcod/tcod_sys/libtcod/src/wrappers.c | 364 + tcod/tcod_sys/libtcod/src/zip.cpp | 123 + tcod/tcod_sys/libtcod/src/zip_c.c | 369 + tcod/tcod_sys/libtcod/src/zlib/adler32.c | 179 + tcod/tcod_sys/libtcod/src/zlib/compress.c | 80 + tcod/tcod_sys/libtcod/src/zlib/crc32.c | 425 ++ tcod/tcod_sys/libtcod/src/zlib/crc32.h | 441 ++ tcod/tcod_sys/libtcod/src/zlib/deflate.c | 1965 +++++ tcod/tcod_sys/libtcod/src/zlib/deflate.h | 346 + tcod/tcod_sys/libtcod/src/zlib/gzclose.c | 25 + tcod/tcod_sys/libtcod/src/zlib/gzguts.h | 193 + tcod/tcod_sys/libtcod/src/zlib/gzlib.c | 620 ++ tcod/tcod_sys/libtcod/src/zlib/gzread.c | 589 ++ tcod/tcod_sys/libtcod/src/zlib/gzwrite.c | 565 ++ tcod/tcod_sys/libtcod/src/zlib/infback.c | 640 ++ tcod/tcod_sys/libtcod/src/zlib/inffast.c | 340 + tcod/tcod_sys/libtcod/src/zlib/inffast.h | 11 + tcod/tcod_sys/libtcod/src/zlib/inffixed.h | 94 + tcod/tcod_sys/libtcod/src/zlib/inflate.c | 1496 ++++ tcod/tcod_sys/libtcod/src/zlib/inflate.h | 122 + tcod/tcod_sys/libtcod/src/zlib/inftrees.c | 306 + tcod/tcod_sys/libtcod/src/zlib/inftrees.h | 62 + tcod/tcod_sys/libtcod/src/zlib/trees.c | 1224 +++ tcod/tcod_sys/libtcod/src/zlib/trees.h | 128 + tcod/tcod_sys/libtcod/src/zlib/uncompr.c | 59 + tcod/tcod_sys/libtcod/src/zlib/zconf.h | 506 ++ tcod/tcod_sys/libtcod/src/zlib/zlib.h | 1744 +++++ tcod/tcod_sys/libtcod/src/zlib/zutil.c | 324 + tcod/tcod_sys/libtcod/src/zlib/zutil.h | 252 + tcod/terminal.png | Bin 0 -> 4903 bytes 455 files changed, 113921 insertions(+), 1 deletion(-) create mode 100644 tcod/.cargo/config create mode 100644 tcod/.gitignore create mode 100644 tcod/.travis.yml create mode 100644 tcod/COPYING.txt create mode 100644 tcod/Cargo.toml create mode 100644 tcod/Makefile create mode 100644 tcod/README.md create mode 100644 tcod/appveyor.yml create mode 100644 tcod/arial10x10.png create mode 100644 tcod/consolas10x10_gs_tc.png create mode 100644 tcod/data/img/circle.png create mode 100644 tcod/data/img/skull.png create mode 100644 tcod/data/namegen/README.txt create mode 100644 tcod/data/namegen/jice_celtic.cfg create mode 100644 tcod/data/namegen/jice_fantasy.cfg create mode 100644 tcod/data/namegen/jice_mesopotamian.cfg create mode 100644 tcod/data/namegen/jice_norse.cfg create mode 100644 tcod/data/namegen/jice_region.cfg create mode 100644 tcod/data/namegen/jice_town.cfg create mode 100644 tcod/data/namegen/mingos_demon.cfg create mode 100644 tcod/data/namegen/mingos_dwarf.cfg create mode 100644 tcod/data/namegen/mingos_norse.cfg create mode 100644 tcod/data/namegen/mingos_standard.cfg create mode 100644 tcod/data/namegen/mingos_town.cfg create mode 100644 tcod/examples/astar-path-finding.rs create mode 100644 tcod/examples/blit.rs create mode 100644 tcod/examples/chars.rs create mode 100644 tcod/examples/colors.rs create mode 100644 tcod/examples/dijkstra-path-finding.rs create mode 100644 tcod/examples/fov.rs create mode 100644 tcod/examples/keyboard.rs create mode 100644 tcod/examples/minimal.rs create mode 100644 tcod/examples/mouse.rs create mode 100644 tcod/examples/namegen.rs create mode 100644 tcod/examples/print_macros.rs create mode 100644 tcod/examples/roguelike-tutorial-1.rs create mode 100644 tcod/examples/roguelike-tutorial-2.rs create mode 100644 tcod/examples/samples.rs create mode 100644 tcod/examples/shapes.rs create mode 100644 tcod/examples/text.rs create mode 100644 tcod/fonts/README.txt create mode 100644 tcod/fonts/arial10x10.png create mode 100644 tcod/fonts/arial12x12.png create mode 100644 tcod/fonts/arial8x8.png create mode 100644 tcod/fonts/caeldera8x8_gs_tc.png create mode 100644 tcod/fonts/celtic_garamond_10x10_gs_tc.png create mode 100644 tcod/fonts/consolas10x10_gs_tc.png create mode 100644 tcod/fonts/consolas12x12_gs_tc.png create mode 100644 tcod/fonts/consolas8x8_gs_tc.png create mode 100644 tcod/fonts/consolas_unicode_10x10.png create mode 100644 tcod/fonts/consolas_unicode_12x12.png create mode 100644 tcod/fonts/consolas_unicode_16x16.png create mode 100644 tcod/fonts/consolas_unicode_8x8.png create mode 100644 tcod/fonts/courier10x10_aa_tc.png create mode 100644 tcod/fonts/courier12x12_aa_tc.png create mode 100644 tcod/fonts/courier8x8_aa_tc.png create mode 100644 tcod/fonts/dejavu10x10_gs_tc.png create mode 100644 tcod/fonts/dejavu12x12_gs_tc.png create mode 100644 tcod/fonts/dejavu16x16_gs_tc.png create mode 100644 tcod/fonts/dejavu8x8_gs_tc.png create mode 100644 tcod/fonts/dejavu_wide12x12_gs_tc.png create mode 100644 tcod/fonts/dejavu_wide16x16_gs_tc.png create mode 100644 tcod/fonts/dundalk12x12_gs_tc.png create mode 100644 tcod/fonts/lucida10x10_gs_tc.png create mode 100644 tcod/fonts/lucida12x12_gs_tc.png create mode 100644 tcod/fonts/lucida8x8_gs_tc.png create mode 100644 tcod/fonts/prestige10x10_gs_tc.png create mode 100644 tcod/fonts/prestige12x12_gs_tc.png create mode 100644 tcod/fonts/prestige8x8_gs_tc.png create mode 100644 tcod/fonts/terminal10x10_gs_tc.png create mode 100644 tcod/fonts/terminal10x16_gs_ro.png create mode 100644 tcod/fonts/terminal10x16_gs_tc.png create mode 100644 tcod/fonts/terminal10x18_gs_ro.png create mode 100644 tcod/fonts/terminal12x12_gs_ro.png create mode 100644 tcod/fonts/terminal16x16_gs_ro.png create mode 100644 tcod/fonts/terminal7x7_gs_tc.png create mode 100644 tcod/fonts/terminal8x12_gs_ro.png create mode 100644 tcod/fonts/terminal8x12_gs_tc.png create mode 100644 tcod/fonts/terminal8x14_gs_ro.png create mode 100644 tcod/fonts/terminal8x8_aa_as.png create mode 100644 tcod/fonts/terminal8x8_aa_ro.png create mode 100644 tcod/fonts/terminal8x8_aa_tc.png create mode 100644 tcod/fonts/terminal8x8_gs_as.png create mode 100644 tcod/fonts/terminal8x8_gs_ro.png create mode 100644 tcod/fonts/terminal8x8_gs_tc.png create mode 100644 tcod/precompiled/i686-pc-windows-gnu/.gitkeep create mode 100644 tcod/precompiled/i686-unknown-linux-gnu/.gitkeep create mode 100644 tcod/precompiled/x86_64-unknown-linux-gnu/.gitkeep create mode 100644 tcod/src/bindings.rs create mode 100644 tcod/src/bsp.rs create mode 100644 tcod/src/chars.rs create mode 100644 tcod/src/colors.rs create mode 100644 tcod/src/console.rs create mode 100644 tcod/src/console_macros.rs create mode 100644 tcod/src/image.rs create mode 100644 tcod/src/input.rs create mode 100644 tcod/src/lib.rs create mode 100644 tcod/src/line.rs create mode 100644 tcod/src/map.rs create mode 100644 tcod/src/namegen.rs create mode 100644 tcod/src/noise.rs create mode 100644 tcod/src/pathfinding.rs create mode 100644 tcod/src/random.rs create mode 100644 tcod/src/rustc_serialize_impls.rs create mode 100644 tcod/src/serde_impls.rs create mode 100644 tcod/src/system.rs create mode 100644 tcod/tcod_sys/Cargo.toml create mode 100644 tcod/tcod_sys/build.rs create mode 100644 tcod/tcod_sys/lib.rs create mode 100644 tcod/tcod_sys/libtcod/LIBTCOD-CREDITS.txt create mode 100644 tcod/tcod_sys/libtcod/LIBTCOD-LICENSE.txt create mode 100644 tcod/tcod_sys/libtcod/README-SDL.txt create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_active.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_audio.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_byteorder.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cdrom.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config_win32.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_copying.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cpuinfo.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_endian.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_error.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_events.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_getenv.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_joystick.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keyboard.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keysym.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_loadso.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_main.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mouse.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mutex.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_name.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_opengl.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_platform.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_quit.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_rwops.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_stdinc.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_syswm.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_thread.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_timer.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_types.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_version.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_video.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/begin_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/close_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_active.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_audio.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_byteorder.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cdrom.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_dreamcast.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macos.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macosx.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_minimal.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_nds.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_os2.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_symbian.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_win32.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_copying.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cpuinfo.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_endian.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_error.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_events.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_getenv.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_joystick.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keyboard.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keysym.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_loadso.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_main.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mouse.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mutex.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_name.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_opengl.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_platform.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_quit.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_rwops.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_stdinc.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_syswm.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_thread.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_timer.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_types.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_version.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_video.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/begin_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/close_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_active.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_audio.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_byteorder.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cdrom.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_config.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cpuinfo.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_endian.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_error.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_events.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_getenv.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_joystick.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keyboard.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keysym.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_loadso.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_main.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mouse.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mutex.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_name.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_opengl.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_platform.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_quit.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_rwops.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_stdinc.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_syswm.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_thread.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_timer.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_types.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_version.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_video.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/begin_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/close_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_active.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_audio.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_byteorder.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cdrom.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_dreamcast.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macos.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macosx.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_minimal.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_nds.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_os2.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_symbian.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_win32.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_copying.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cpuinfo.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_endian.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_error.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_events.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_getenv.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_joystick.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keyboard.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keysym.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_loadso.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_main.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mouse.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mutex.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_name.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_opengl.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_platform.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_quit.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_rwops.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_stdinc.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_syswm.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_thread.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_timer.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_types.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_version.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_video.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/begin_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/close_code.h create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-gnu/SDL.dll create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-gnu/libSDL.dll.a create mode 100755 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-msvc/SDL.dll create mode 100755 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-msvc/SDL.lib create mode 100755 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-msvc/SDLmain.lib create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/SDL.dll create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.a create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.dll.a create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.la create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDLmain.a create mode 100644 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/pkgconfig/sdl.pc create mode 100755 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-msvc/SDL.dll create mode 100755 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-msvc/SDL.lib create mode 100755 tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-msvc/SDLmain.lib create mode 100644 tcod/tcod_sys/libtcod/include/bresenham.h create mode 100644 tcod/tcod_sys/libtcod/include/bresenham.hpp create mode 100644 tcod/tcod_sys/libtcod/include/bsp.h create mode 100644 tcod/tcod_sys/libtcod/include/bsp.hpp create mode 100644 tcod/tcod_sys/libtcod/include/color.h create mode 100644 tcod/tcod_sys/libtcod/include/color.hpp create mode 100644 tcod/tcod_sys/libtcod/include/console.h create mode 100644 tcod/tcod_sys/libtcod/include/console.hpp create mode 100644 tcod/tcod_sys/libtcod/include/console_types.h create mode 100644 tcod/tcod_sys/libtcod/include/fov.h create mode 100644 tcod/tcod_sys/libtcod/include/fov.hpp create mode 100644 tcod/tcod_sys/libtcod/include/fov_types.h create mode 100644 tcod/tcod_sys/libtcod/include/gui/button.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/container.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/flatlist.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/gui.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/hbox.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/image.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/label.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/radiobutton.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/slider.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/statusbar.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/textbox.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/togglebutton.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/toolbar.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/vbox.hpp create mode 100644 tcod/tcod_sys/libtcod/include/gui/widget.hpp create mode 100644 tcod/tcod_sys/libtcod/include/heightmap.h create mode 100644 tcod/tcod_sys/libtcod/include/heightmap.hpp create mode 100644 tcod/tcod_sys/libtcod/include/howto.hpp create mode 100644 tcod/tcod_sys/libtcod/include/image.h create mode 100644 tcod/tcod_sys/libtcod/include/image.hpp create mode 100644 tcod/tcod_sys/libtcod/include/lex.h create mode 100644 tcod/tcod_sys/libtcod/include/lex.hpp create mode 100644 tcod/tcod_sys/libtcod/include/libtcod.h create mode 100644 tcod/tcod_sys/libtcod/include/libtcod.hpp create mode 100644 tcod/tcod_sys/libtcod/include/libtcod_int.h create mode 100644 tcod/tcod_sys/libtcod/include/list.h create mode 100644 tcod/tcod_sys/libtcod/include/list.hpp create mode 100644 tcod/tcod_sys/libtcod/include/mersenne.h create mode 100644 tcod/tcod_sys/libtcod/include/mersenne.hpp create mode 100644 tcod/tcod_sys/libtcod/include/mersenne_types.h create mode 100644 tcod/tcod_sys/libtcod/include/mouse.h create mode 100644 tcod/tcod_sys/libtcod/include/mouse.hpp create mode 100644 tcod/tcod_sys/libtcod/include/mouse_types.h create mode 100644 tcod/tcod_sys/libtcod/include/namegen.h create mode 100644 tcod/tcod_sys/libtcod/include/namegen.hpp create mode 100644 tcod/tcod_sys/libtcod/include/noise.h create mode 100644 tcod/tcod_sys/libtcod/include/noise.hpp create mode 100644 tcod/tcod_sys/libtcod/include/noise_defaults.h create mode 100644 tcod/tcod_sys/libtcod/include/parser.h create mode 100644 tcod/tcod_sys/libtcod/include/parser.hpp create mode 100644 tcod/tcod_sys/libtcod/include/path.h create mode 100644 tcod/tcod_sys/libtcod/include/path.hpp create mode 100644 tcod/tcod_sys/libtcod/include/sys.h create mode 100644 tcod/tcod_sys/libtcod/include/sys.hpp create mode 100644 tcod/tcod_sys/libtcod/include/tree.h create mode 100644 tcod/tcod_sys/libtcod/include/tree.hpp create mode 100644 tcod/tcod_sys/libtcod/include/txtfield.h create mode 100644 tcod/tcod_sys/libtcod/include/txtfield.hpp create mode 100644 tcod/tcod_sys/libtcod/include/wrappers.h create mode 100644 tcod/tcod_sys/libtcod/include/zip.h create mode 100644 tcod/tcod_sys/libtcod/include/zip.hpp create mode 100644 tcod/tcod_sys/libtcod/lib/donotremove create mode 100644 tcod/tcod_sys/libtcod/libtcod-CHANGELOG.txt create mode 100644 tcod/tcod_sys/libtcod/libtcod.cfg create mode 100644 tcod/tcod_sys/libtcod/makefiles/README.txt create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-haiku create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-linux create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-linux-win32 create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-linux64-32 create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-mingw create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-mingw-sdl2 create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-osx create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-samples-haiku create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux-win32 create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux64-32 create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw create mode 100644 tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw-sdl2 create mode 100644 tcod/tcod_sys/libtcod/osx/._hmtool_Info.plist create mode 100644 tcod/tcod_sys/libtcod/osx/._macsupport.h create mode 100644 tcod/tcod_sys/libtcod/osx/._macsupport.m create mode 100644 tcod/tcod_sys/libtcod/osx/._samples_c_Info.plist create mode 100644 tcod/tcod_sys/libtcod/osx/._samples_cpp_Info.plist create mode 100644 tcod/tcod_sys/libtcod/osx/hmtool_Info.plist create mode 100644 tcod/tcod_sys/libtcod/osx/macsupport.h create mode 100644 tcod/tcod_sys/libtcod/osx/macsupport.m create mode 100644 tcod/tcod_sys/libtcod/osx/samples_c_Info.plist create mode 100644 tcod/tcod_sys/libtcod/osx/samples_cpp_Info.plist create mode 100644 tcod/tcod_sys/libtcod/src/README.txt create mode 100644 tcod/tcod_sys/libtcod/src/bresenham.cpp create mode 100644 tcod/tcod_sys/libtcod/src/bresenham_c.c create mode 100644 tcod/tcod_sys/libtcod/src/bsp.cpp create mode 100644 tcod/tcod_sys/libtcod/src/bsp_c.c create mode 100644 tcod/tcod_sys/libtcod/src/color.cpp create mode 100644 tcod/tcod_sys/libtcod/src/color_c.c create mode 100644 tcod/tcod_sys/libtcod/src/console.cpp create mode 100644 tcod/tcod_sys/libtcod/src/console_c.c create mode 100644 tcod/tcod_sys/libtcod/src/fov.cpp create mode 100644 tcod/tcod_sys/libtcod/src/fov_c.c create mode 100644 tcod/tcod_sys/libtcod/src/fov_circular_raycasting.c create mode 100644 tcod/tcod_sys/libtcod/src/fov_diamond_raycasting.c create mode 100644 tcod/tcod_sys/libtcod/src/fov_permissive2.c create mode 100644 tcod/tcod_sys/libtcod/src/fov_recursive_shadowcasting.c create mode 100644 tcod/tcod_sys/libtcod/src/fov_restrictive.c create mode 100644 tcod/tcod_sys/libtcod/src/gui/README.txt create mode 100644 tcod/tcod_sys/libtcod/src/gui/button.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/container.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/flatlist.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/hbox.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/image.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/label.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/radiobutton.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/slider.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/statusbar.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/textbox.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/togglebutton.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/toolbar.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/vbox.cpp create mode 100644 tcod/tcod_sys/libtcod/src/gui/widget.cpp create mode 100644 tcod/tcod_sys/libtcod/src/heightmap.cpp create mode 100644 tcod/tcod_sys/libtcod/src/heightmap_c.c create mode 100644 tcod/tcod_sys/libtcod/src/image.cpp create mode 100644 tcod/tcod_sys/libtcod/src/image_c.c create mode 100644 tcod/tcod_sys/libtcod/src/lex.cpp create mode 100644 tcod/tcod_sys/libtcod/src/lex_c.c create mode 100644 tcod/tcod_sys/libtcod/src/list_c.c create mode 100644 tcod/tcod_sys/libtcod/src/mersenne.cpp create mode 100644 tcod/tcod_sys/libtcod/src/mersenne_c.c create mode 100644 tcod/tcod_sys/libtcod/src/mouse.cpp create mode 100644 tcod/tcod_sys/libtcod/src/namegen.cpp create mode 100644 tcod/tcod_sys/libtcod/src/namegen_c.c create mode 100644 tcod/tcod_sys/libtcod/src/noise.cpp create mode 100644 tcod/tcod_sys/libtcod/src/noise_c.c create mode 100644 tcod/tcod_sys/libtcod/src/parser.cpp create mode 100644 tcod/tcod_sys/libtcod/src/parser_c.c create mode 100644 tcod/tcod_sys/libtcod/src/path.cpp create mode 100644 tcod/tcod_sys/libtcod/src/path_c.c create mode 100644 tcod/tcod_sys/libtcod/src/png/lodepng.c create mode 100644 tcod/tcod_sys/libtcod/src/png/lodepng.h create mode 100644 tcod/tcod_sys/libtcod/src/sys.cpp create mode 100644 tcod/tcod_sys/libtcod/src/sys_c.c create mode 100644 tcod/tcod_sys/libtcod/src/sys_opengl_c.c create mode 100644 tcod/tcod_sys/libtcod/src/sys_sdl_c.c create mode 100644 tcod/tcod_sys/libtcod/src/sys_sdl_img_bmp.c create mode 100644 tcod/tcod_sys/libtcod/src/sys_sdl_img_png.c create mode 100644 tcod/tcod_sys/libtcod/src/tree_c.c create mode 100644 tcod/tcod_sys/libtcod/src/txtfield.cpp create mode 100644 tcod/tcod_sys/libtcod/src/txtfield_c.c create mode 100644 tcod/tcod_sys/libtcod/src/wrappers.c create mode 100644 tcod/tcod_sys/libtcod/src/zip.cpp create mode 100644 tcod/tcod_sys/libtcod/src/zip_c.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/adler32.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/compress.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/crc32.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/crc32.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/deflate.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/deflate.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/gzclose.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/gzguts.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/gzlib.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/gzread.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/gzwrite.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/infback.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inffast.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inffast.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inffixed.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inflate.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inflate.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inftrees.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/inftrees.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/trees.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/trees.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/uncompr.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/zconf.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/zlib.h create mode 100644 tcod/tcod_sys/libtcod/src/zlib/zutil.c create mode 100644 tcod/tcod_sys/libtcod/src/zlib/zutil.h create mode 100644 tcod/terminal.png diff --git a/Cargo.toml b/Cargo.toml index 407032b1..3e1b37f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ version = "0.2.0" [dependencies] pistoncore-input = "0.10.0" pistoncore-window = "0.17.0" -tcod = "0.9.0" +tcod = { path = "tcod", version = "*" } [dependencies.clippy] optional = true diff --git a/tcod/.cargo/config b/tcod/.cargo/config new file mode 100644 index 00000000..9d156bff --- /dev/null +++ b/tcod/.cargo/config @@ -0,0 +1,39 @@ +# Using binary distribution of libtcod instead of building it from source: +# For more info, read: http://doc.crates.io/build-script.html and http://doc.crates.io/config.html +# +# In general, you download your the compiled libraries (libtcod.so/dll/ and +# libtcodgui.so/dll), put them into `precompiled/$target` and uncomment the +# corresponding section below. + + +# 64-bit Linux: +# +# Download this: http://roguecentral.org/doryen/?file_id=28 +# Copy libtcod.so and libtcodgui.so to: precompiled/x86_64-unknown-linux-gnu +# You may also need to create libtcod.so.1 and libtcodgui.so.1 because reasons? +# Uncomment this section: +# +# [target.x86_64-unknown-linux-gnu.tcod] +# rustc-flags = "-L precompiled/x86_64-unknown-linux-gnu -l tcod" + + +# 32-bit Linux: +# +# Download this: http://roguecentral.org/doryen/?file_id=26 +# Copy libtcod.so and libtcodgui.so to: precompiled/i686-unknown-linux-gnu +# You may also need to create libtcod.so.1 and libtcodgui.so.1 because reasons? +# Uncomment this section: +# +# [target.i686-unknown-linux-gnu.tcod] +# rustc-flags = "-L precompiled/i686-unknown-linux-gnu -l tcod" + + +# Windows: +# +# Download this: http://roguecentral.org/doryen/?file_id=27 +# Copy libtcod-mingw.dll, libtcod-gui-mingw.dll and SDL.dll to: precompiled/i686-pc-windows-gnu +# You must also create libtcod.dll and libtcod-gui.dll because reasons? +# Uncomment this section: +# +# [target.i686-pc-windows-gnu.tcod] +# rustc-flags = "-L precompiled/i686-pc-windows-gnu -l tcod" diff --git a/tcod/.gitignore b/tcod/.gitignore new file mode 100644 index 00000000..c5a9d12e --- /dev/null +++ b/tcod/.gitignore @@ -0,0 +1,31 @@ +.DS_Store +*~ +*# +*.a +*.o +*.so +*.dylib +*.swp +*.dSYM +*.dll +*.rlib +*.dummy +*.exe +*-test +/bin/main +/bin/test-internal +/bin/test-external +/doc/ +/target/ +/build/ +/.rust/ +rusti.sh +watch.sh +/examples/** +!/examples/*.rs +!/examples/*.txt +!/examples/assets/ +*Cargo.lock +/tcod_sys/target/ +!/tcod_sys/libtcod/SDL*.dll +!/tcod_sys/libtcod/dependencies/** diff --git a/tcod/.travis.yml b/tcod/.travis.yml new file mode 100644 index 00000000..a9632efa --- /dev/null +++ b/tcod/.travis.yml @@ -0,0 +1,40 @@ +language: rust +os: +- linux +- osx +rust: +- nightly +- stable +before_install: +- '[ "$TRAVIS_OS_NAME" = linux ] && sudo apt-get update -qq || brew update' +install: +- '[ "$TRAVIS_OS_NAME" = linux ] && sudo apt-get install -y libsdl1.2-dev || brew install sdl' +script: +- cargo build --verbose +- cargo test --verbose +- cargo test --features "rustc-serialize serde" --verbose +after_success: ! '[ $TRAVIS_BRANCH = master ] && + + [ "$TRAVIS_OS_NAME" = linux ] && + + [ $TRAVIS_PULL_REQUEST = false ] && + + cargo doc && + + echo '''' > target/doc/index.html + && + + git config --global user.email "travis@travis-ci.org" && + + git config --global user.name "travis-ci" && + + sudo pip install ghp-import && + + ghp-import -n target/doc && + + git push -fq https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages + +' +env: + global: + - secure: h21kqC5s6iVs4p5n9KFZ5ZTWtPF8nGVFpaPP6t/1Sg+xMaHMDyr/sBYI1gsNGTXrVsiP2Zs6cRTBEbX12PVL6MXFgKpdhKG1+lBCMk6HxU8/W2UHCh6Y38+W4Ybyv5fuoWqkUOX3yODNkRZWrqNhdm8lCdE2uGczkIKPi7hDYMM= diff --git a/tcod/COPYING.txt b/tcod/COPYING.txt new file mode 100644 index 00000000..ecde868d --- /dev/null +++ b/tcod/COPYING.txt @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2014 Tomas Sedovic + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/tcod/Cargo.toml b/tcod/Cargo.toml new file mode 100644 index 00000000..6f2b246e --- /dev/null +++ b/tcod/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "tcod" +description = "The Rust bindings for the Doryen library (a.k.a. libtcod)." +version = "0.9.0" +homepage = "https://github.com/tomassedovic/tcod-rs" +repository = "https://github.com/tomassedovic/tcod-rs" +documentation = "http://tomassedovic.github.io/tcod-rs/tcod/index.html" +readme = "README.md" +keywords = ["gamedev", "roguelike", "libtcod"] +license = "WTFPL" +authors = ["Tomas Sedovic ", + "Bastien Léonard ", + "Darren Kaste ", + "Edu Garcia ", + "Guillermo Galizzi ", + "Gustorn ", + "Jared McFarland ", + "Jonny Gilchrist (@jgilchrist)", + "LaylConway ", + "Moredread ", + "Nikita Pekin", + "Paul Sanford ", + "Pranz "] + +[lib] +name = "tcod" +path = "src/lib.rs" + +[dependencies] +bitflags = "0.1" +libc = "0.2" +lazy_static = "0.1" +rustc-serialize = { optional = true, version = "0.3" } +serde = { optional = true, version = "0.6" } + +[dependencies.tcod-sys] +path = "tcod_sys" +version = "4.0" + +[dev-dependencies] +rand = "0.3" +serde_json = "0.6" diff --git a/tcod/Makefile b/tcod/Makefile new file mode 100644 index 00000000..423ba5f5 --- /dev/null +++ b/tcod/Makefile @@ -0,0 +1,14 @@ +build: + cargo build + +test: + cargo test --features "rustc-serialize_impls" + +package: clean + cargo package --manifest-path tcod_sys/Cargo.toml + cargo package + +clean: + git clean -x -f -d + +.PHONY: build test package clean diff --git a/tcod/README.md b/tcod/README.md new file mode 100644 index 00000000..befa3d12 --- /dev/null +++ b/tcod/README.md @@ -0,0 +1,221 @@ +libtcod bindings for Rust [![Build Status](https://travis-ci.org/tomassedovic/tcod-rs.svg?branch=master)](https://travis-ci.org/tomassedovic/tcod-rs) +------------------------- + +[libtcod a.k.a. "The Doryen Library"](http://roguecentral.org/doryen/libtcod/) +is a smallish library designed for writing roguelikes. It provides a bunch of +useful functionality such as: + +* Text-based graphics API that doesn't suck as much as Curses or OpenGL +* Colours! (like, more than 16) +* Keyboard and mouse input +* Path finding +* Field of view +* Portable (works on linux, windows and mac) +* [Lots of other stuff](http://roguecentral.org/doryen/libtcod/features/) + + +This project provides [Rust](http://www.rust-lang.org/) bindings for libtcod +v1.5.2. + +This project follows [Semantic Versioning](http://semver.org/). Since we're +under `1.0.0` anything goes. The API can change at any time. + +Indeed, it probably should change! If you have better ideas on how it make it +safer or more familiar to Rust developers, please let us know. + + +Documentation +--------------- + +We run `rustdoc` on every new commit: + +http://tomassedovic.github.io/tcod-rs/tcod/index.html + +But that's mostly useful for types, function signatures, etc. We don't have much +in term of actual docs, but you can always check the official ones: + +http://roguecentral.org/doryen/data/libtcod/doc/1.5.1/index2.html?c=true + + +Current status +-------------- + +All raw tcod bindings are available via the `tcod-sys` crate. In addition we +want to provide safe (and more in line with the Rust style) wrappers -- if you +can segfault outside of `unsafe` blocks, that's a bug. The safe bindings are not +yet complete, however. + +### Already Implemented + +* _Colors_ +* _Console_ +* Most of the _System_ layer (FPS, time, fullscreen, screenshots) +* _Field of view_ +* _Map_ +* _Path finding_ (both A\* and Dijkstra) +* _Pseudorandom number generator_ (prefer the `rand` crate, except for places where the API requires the built-in generators) +* _Name generator_ +* _Image toolkit_ +* _Line toolkit_ +* _Noise_ +* _BSP toolkit_ + +### Probably Won't Ever Be Implemented Because Rust Provides This Already +* Filesystem utilities +* Containers +* Compression toolkit (there will probably be a better Rust library for this) + +### Not Implemented Yet But Should Happen At Some Point In The Future +* Everything else! + + + +How to use this +--------------- + +`tcod-rs` depends on `libtcod` so you need to build or download the official +version. The `libtcod` version known to work is bundled with `tcod-sys` and +Cargo will build it for you, but you need the build dependencies installed. + +Alternatively, you can provide the precompiled libtcod library to override the +building process. [See below](#using-existing-binary-distribution). + +To use `tcod-rs`, add this to your game's `Cargo.toml`: + +```toml +[dependencies] +tcod = "0.9" +``` + +### Building on Linux + +Run the equivalent of: + +```sh +$ sudo apt-get install gcc g++ make libsdl1.2-dev +$ cd yourgame +$ cargo build --release +$ cargo run --release +``` + +on your distro. + +You can also check the [official libtcod build instructions for Linux](http://roguecentral.org/doryen/data/libtcod/doc/1.5.2/html2/compile_libtcod_linux.html?c=true). + + +### Building on Windows (with MSVC) + +Make sure you have Visual Studio 2013 or later **with the C++ tools +option** installed. You also need the "MSVC ABI" version of the Rust +compiler (as opposed to the "GNU ABI" one). + +Then, set up the compilation environment, make sure Rust is in your +`PATH` and run Cargo: + +``` +C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat amd64 +set PATH=%PATH%;C:\Program Files (x86)\Rust\bin +cd yourgame +cargo build --release +cargo run --release +``` + + +### Building on Windows (with MinGW) + +You have to [download and install MinGW](http://www.mingw.org/). Then, +add Rust's and MinGW's bin directories to your path and compile your +game: + +``` +set PATH=%PATH%;C:\Program Files (x86)\Rust\bin;C:\MinGW\bin +cd yourgame +cargo build --release +cargo run --release +``` + +You can also check the [official libtcod build instructions for Windows](http://roguecentral.org/doryen/data/libtcod/doc/1.5.2/html2/compile_libtcod_mingw.html?c=true). + + +### Building on Mac OS X + +1. [Install Homebrew](http://brew.sh/) +2. Run: + +```sh +$ brew install sdl +$ cd yourgame +$ cargo build --release +$ cargo run --release +``` + +This is based on the instructions from [Jared McFarland's roguelike tutorial](http://jaredonline.svbtle.com/roguelike-tutorial-in-rust-part-1). + +--- + +To test this, you can clone this repository directly and run the one of the +provided examples: + +```sh +$ git clone https://github.com/tomassedovic/tcod-rs.git +$ cd tcod-rs +$ cargo run --example keyboard +``` + + +### Using existing binary distribution + +If you don't want to build libtcod yourself, you can +[instruct Cargo to override the build script](http://doc.crates.io/build-script.html#overriding-build-scripts). See `.cargo/config` +from the repository for an example. + +NOTE: The official MinGW pre-built libraries (for Windows) +[don't seem to work with tcod-rs](https://github.com/tomassedovic/tcod-rs/issues/54). +We're not sure exactly why this is so we'd appreciate anyone's help! + + +Contributing +------------ + +The raw bindings were generated using +[rust-bindgen](https://github.com/crabtw/rust-bindgen) and are located at +`src/ffi.rs`. The safe (hopefully?) wrapper was built on top of them at +`src/lib.rs`. + +This is far from done, patches to missing functionality wrappers, documentation +and examples are very much appreciated. If your patch (any patch -- including +typos) gets accepted, you'll get a commit access if you want it. + +We accept GitHub as well as regular pull requests (i.e. emailing or tweeting the +URL of your feature branch works). + +You can regenerate the raw bindings by running: + +```sh +bindgen -builtins -l tcod include/libtcod.h -o src/ffi.rs +``` + + +### Contributors + + +* Bastien Léonard, @bastienleonard, +* Edu Garcia, @Arcnor, +* Guillermo Galizzi +* Gustorn +* Jared McFarland, @jaredonline, +* Jonny Gilchrist, @jgilchrist +* LaylConway +* Moredread +* Nikita Pekin +* Paul Sanford, @pmsanford, +* Pranz, +* Tomas Sedovic, @tomassedovic, +* Tomasz Barański, + + +### License + +**tcod-rs** is licensed under [WTFPL v2](http://www.wtfpl.net/txt/copying/). See +`COPYING.txt` for the full text of the license (don't worry -- it's really +short and to the point). diff --git a/tcod/appveyor.yml b/tcod/appveyor.yml new file mode 100644 index 00000000..db9f685b --- /dev/null +++ b/tcod/appveyor.yml @@ -0,0 +1,26 @@ +environment: + matrix: + - TARGET: x86_64-pc-windows-msvc + ARCH: amd64 + VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + - TARGET: i686-pc-windows-msvc + ARCH: x86 + VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + - TARGET: x86_64-pc-windows-gnu + MSYS_BITS: 64 + - TARGET: i686-pc-windows-gnu + MSYS_BITS: 32 +install: + - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe" + - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust" + - if defined VS call "%VS%" %ARCH% + - set PATH=%PATH%;C:\Program Files (x86)\Rust\bin + - if defined MSYS_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS_BITS%\bin + - set RUST_BACKTRACE=1 + - rustc -V + - cargo -V + +build: false + +test_script: + - cargo test diff --git a/tcod/arial10x10.png b/tcod/arial10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..64691f1bbd47ca4f7346f8d502efccfb8a325ece GIT binary patch literal 14870 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 HT7>)$K!AdZ literal 0 HcmV?d00001 diff --git a/tcod/data/img/circle.png b/tcod/data/img/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1404f3c06b1243853d99330a5f07fed99ba78a GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+KpdfpRr>`sf4NiVRL(z-ta&7~Ku6VjQhG?9hdR{T?u!BhJ!)p1C6DLlc zI(6dFs~b+L)`^@ayrwbqsVcnG%X-~(^0)S~lb%i%t=02p%>2C9-1yr0H@}VsT4h^m zzf9O&D&TxG|5BQt^ve`s!)1;x3EMB#8Ew7bde=N>{jaUd_rK(Lqwl$H>Ezg(OFyrh zZCAMEd`-t%lMB%|k4Dw^#@@AWGHzd-S9Ufd-`@Rm|IOY8wcyzBRhPH?3Vp^E#W=qp z_%NdY!=5j^-BzDhZdlD`moV4z^32kiQAr6uj&Bdy+x__K5$WvuX|EV#7_8+_yi7Z> R;|$P$44$rjF6*2UngH4Uhd=-T literal 0 HcmV?d00001 diff --git a/tcod/data/img/skull.png b/tcod/data/img/skull.png new file mode 100644 index 0000000000000000000000000000000000000000..db0014e804f44d6e335e7ce7cabe44afdcb85654 GIT binary patch literal 1953 zcmV;S2VVGzP)Px#32;bRa{vGi!~g&e!~vBn4jTXf00(qQO+^RT2@er51$&Afng`;nB2+JcmM zGc+I;Xfzs|%@zuU0)ZemH@CXFn#18l1~{Egl}fd+uwXPAaU4fcGzQ6L69|IE#loh*tKgHi^YNq0F%kAsHhkj83_i1 zPef0O%YJr=_K(wY4=lIXS8g{vEhnZYUJua=9Q3!wn4$Fbo6#9jdCTl9Q9c z;^N{12Mz%L2Y{)msoS<~`;SRMki+2s7K?@I{6A?s3OzkNCX2$i>+*}kzU%q@fG&JP#ctj!*2!g+6BnW~ah|ixtKYsk!U@&Mj8nIX`5{Wb#4WqBG zud=d|iVFk+YPI_L^XGcKp21)g78cgk)$QB2ucV}e#bQM=A_y`*KEArT+R@P=5C~*4 znZ;r;nM`?kc@l{PMbW{*L7=6j1w~PNm{#mC1- z>ReJ%l3Xqy9v*IPZeCnmRIAlju3Ta0^?IF7XEvK95{XKs8W`8ym@0Z8f`WkXti3+X0yp;%FN8v>-E2LV`j5?v(aX=4G#}zWo5m6 z`*wJE7{_q{f}nzeg43r@&(6-ueO-<9&)6~1FQmHaBGWdLcZ*MQ9y?VXAySux#wzj;y{QC9lOG``CC0ni5rlzK! zx$ND$_v6Qpl*8}$8;!>K`T62!uI z4u|8?rAr$M+tt-YvBbo}!a`WWGBPse=H|jKuh)xVSom>mZLPh%T_6x_Tmpx~xpCu$ z-EKz^Wb@1|FE5Y0u}_~qgR5#si~<_ zskF4T6oQ~|kU$_{GMPAz0|3D1^CSPJwzl@{*|R#GPN`H*O-+rCjz&{cTMLaw)9G{$ zha)#PS11&QUAJ%F&d$yb1Ofm6q^GB6W@d(6H*ek)3WeXkeN!rxb#-;q)6-N~G$tk{ z-oJl;>((u!(HK<|pU;ON2!bF~w?)EWFjQApXJ%%8`0!!p&Ydw%4FJG}3l|g$g<7rV za5$$Z z4jw$%+}u1mI@;FO#$+-D0s#!eX=!OVj>pHxQxoLHix)PVEh{U_YPII%bIa=F|mU%mu`L7&fu zqUh4nlFep2a^#3wtriM}$B!Qu2n0T#kHOd=1f!_wbh<<$sjsg`5JV!86crW8WU}Su z<>uyQkH?dqo}QJJg`()mlP9yYv+Z_!eSLjTPtTb%XFw3VeEG7$VAv4)s111c?%g7h zsHCLi(4j*bjV2fj#>dCITrL=f&1SRP?M4v9>-ExTw4$P-nwpwx*RCZbBoG8KIXS6R zDwmg+w_M$Ga&jI#cu-YU1pvVG^t99I47+~(_@P#-VHiGo^e7C&`T6-&+xY$d{{DW2 zLNPu*9t;Mzlz9e&QC3zqHa50dQUZa%%F2q{?T*^4pFMlFXV0Er?d_2ei^Zd(qwDMI zf4h4qmCD4##DBI|2!+DV&d!yU6-uoFfq>iXj!Xr^FpWl2SXj6f!nhF7m%-Me>BtJRVu8T&KtZx_RqloURn&*SmLV)4w( njK|}lCWh1Lbi3WZ`0Dx#f9&|2caQ1_00000NkvXXu0mjf;)|jh literal 0 HcmV?d00001 diff --git a/tcod/data/namegen/README.txt b/tcod/data/namegen/README.txt new file mode 100644 index 00000000..b814c879 --- /dev/null +++ b/tcod/data/namegen/README.txt @@ -0,0 +1,70 @@ +/* + * Collections of syllables and other data used for name generation. + * + * All the strings must be enclosed between quotation marks, with no semicolon + * at the end. + * + * SYLLABLE SETS: + * Please use only latin characters, apostrophes and dashes for syllables. All + * other characters will be treated as separators between syllables, eg. "ish" + * and "is'h" are syllables, but "|sh" and "ish!" aren't (the erroneous + * syllables will be read as "sh" and "ish", respectively). If you wish to use + * a special character, please write it after a slash, eg. a semicolon will need + * to be written as "/;" in order to be correctly parsed. Beware: a slash at the + * end of a string will not trigger an error whatsoever, but the final syllable + * will not be added to the list at all. Spaces are a special case: they can be + * triggered either with the above method, or with a single underscore: "\ " and + * "_" are both valid and will produce a space. + * + * PHONEME SETS: + * Phoneme sets should be single characters or digraphs. Please use lowercase + * characters only. "ch" and "tz" are valid consonants, but "Ch" or "trz" are + * not. They will be rejected upon generating phoneme lists. + * + * RULES: + * These denote how a word is generated. A rule is a string consisting of + * normal characters [a-z,A-Z,',-], special characters preceded by a slash (see + * the notes concerning syllables), underscores to denote spaces and wildcards. + * Wildcards are preceded by a dollar sign. Here's the full list: + * "$P" - a random Pre syllable + * "$s" - a random Start syllable + * "$m" - a random Middle syllable + * "$e" - a random End syllable + * "$p" - a random Post syllable + * "$v" - a random vocal + * "$c" - a random consonant + * "$?" - a random phoneme + * So, if we hav the following data: + * syllablesStart = "Ivan" + * syllablesEnd = "Terrible" + * rules = "$s_the_$e" + * the generator will output "Ivan the Terrible". + * The wildcards may also include an integer number. This number marks the per + * cent chance of actually appearing the related wildcard has. The number is + * placed after the asterisk, but before the corresponding character. For + * instance, "*50m" means "50% chance of adding a Middle syllable". + * If multiple rules are specified, they should be separated by characters that + * are not special character or wildcard indicators. A comma is a legible + * separator. + * A rule may be preceded by a special wildcard consisting of a per cent sign + * "%" and an integer number. This means the per cent chance of picking this + * rule should the RNG encounter it. For instance, if two rules are specified, + * each will have 50% chance of being chosen. However, if one of them is + * preceded by the "%50" sign, it will actually have a 100/2*50% = 25% chance of + * being selected (100/2 is the initial chance any single rule from a set of two + * will be picked, for five rules this would be 100/5, etc.). + * The rules are a mandatory field. Also, any field thai it references are to be + * included as well, lest it produce errors or, in the best of cases, generate + * an empty syllable as output. + * + * Don't get paranoid about controlling whether the syllables are repeated. The + * program will ignore repeated entries anyway. This applies to phonemes too. + * + * Please make sure you have enough syllables specified to ensure variety in the + * generated names. A string with 512 characters should be sufficient in most + * cases. Anything below that is a risk of making the names predictable. + * + * I hope this little tool is both fun and useful for you. Take care! + * + * -Mingos + */ diff --git a/tcod/data/namegen/jice_celtic.cfg b/tcod/data/namegen/jice_celtic.cfg new file mode 100644 index 00000000..744d25b9 --- /dev/null +++ b/tcod/data/namegen/jice_celtic.cfg @@ -0,0 +1,15 @@ +//Celtic names from Jice's "The Cave" +name "Celtic male" { + syllablesStart = "Aen, Agno, All, Ba, Beo, Brig, Ci, Cre, Dan, Del, Ela, Eo, En, Er, Et, In, Io, Morr, Nem, Nu, Og, Or, Ta" + syllablesMiddle = "a, ar, ba, bo, ch, d, ig" + syllablesEnd = "aid, ain, an, and, th, ed, eth, gus, lam, lor, man, od, t, thach" + rules = "$s$m$e, $s$e" +} + +name "Celtic female" { + syllablesStart = "Aen, Agno, All, Ba, Beo, Brig, Ci, Cre, Dan, Del, Ela, Eo, En, Er, Et, In, Io, Morr, Nem, Nu, Og, Or, Ta" + syllablesMiddle = "a, ar, ba, bo, ch, d, ig" + syllablesEnd = "ai, an, da, id, iu, ma, me, na, ne, tha" + rules = "$s$m$e, $s$e" +} + diff --git a/tcod/data/namegen/jice_fantasy.cfg b/tcod/data/namegen/jice_fantasy.cfg new file mode 100644 index 00000000..ce3e95d7 --- /dev/null +++ b/tcod/data/namegen/jice_fantasy.cfg @@ -0,0 +1,17 @@ +//Fantasy names from Jice's "The Cave" +name "Fantasy male" { + syllablesStart = "Aer, An, Ar, Ban, Bar, Ber, Beth, Bett, Cut, Dan, Dar, Dell, Der, Edr, Er, Eth, Ett, Fin, Ian, Iarr, Ill, Jed, Kan, Kar, Ker, Kurr, Kyr, Man, Mar, Mer, Mir, Tsal, Tser, Tsir, Van, Var, Yur, Yyr" + syllablesMiddle = "al, an, ar, el, en, ess, ian, onn, or" + syllablesEnd = "ai, an, ar, ath, en, eo, ian, is, u, or" + illegal = "orar, arrar" + rules = "$s$m$e, $s$e" +} + +name "Fantasy female" { + syllablesStart = "Aer, An, Ar, Ban, Bar, Ber, Beth, Bett, Cut, Dan, Dar, Dell, Der, Edr, Er, Eth, Ett, Fin, Ian, Iarr, Ill, Jed, Kan, Kar, Ker, Kurr, Kyr, Man, Mar, Mer, Mir, Tsal, Tser, Tsir, Van, Var, Yur, Yyr" + syllablesMiddle = "al, an, ar, el, en, ess, ian, onn, or" + syllablesEnd = "a, ae, aelle, ai, ea, i, ia, u, wen, wyn" + illegal = "arrar" + rules = "$s$m$e, $s$e" +} + diff --git a/tcod/data/namegen/jice_mesopotamian.cfg b/tcod/data/namegen/jice_mesopotamian.cfg new file mode 100644 index 00000000..8ecab25b --- /dev/null +++ b/tcod/data/namegen/jice_mesopotamian.cfg @@ -0,0 +1,17 @@ +//Mesopotamian names from Jice's "The Cave" +name "Mesopotamian male" { + syllablesStart = "A, Ann, Ash, E', En, Er, Gil, In, Ir, Ish, Mar, Ni, Nin, Re, Ti, Ur" + syllablesMiddle = "am, an, du, esh, gam, gir, ka, ki, li, un, ur, ta" + syllablesEnd = "aki, al, ar, at, du, eph, esh, il, im, ki, nu, uk, ur, uz" + illegal = "aa, e'e" + rules = "$s$m$e, $s$e" +} + +name "Mesopotamian female" { + syllablesStart = "A, Ann, Ash, E', En, Er, Gil, In, Ir, Ish, Mar, Ni, Nin, Re, Ti, Ur" + syllablesMiddle = "am, an, du, esh, gam, gir, ka, ki, li, un, ur, ta" + syllablesEnd = "ag, il, la, na, sag, su, ta" + illegal = "aa, e'e" + rules = "$s$m$e, $s$e" +} + diff --git a/tcod/data/namegen/jice_norse.cfg b/tcod/data/namegen/jice_norse.cfg new file mode 100644 index 00000000..01bd584a --- /dev/null +++ b/tcod/data/namegen/jice_norse.cfg @@ -0,0 +1,17 @@ +//Norse names from Jice's "The Cave" +name "Norse male" { + syllablesStart = "Al, Ae, As, Bi, Fen, Ha, Hag, Ho, Hu, Iv, Jot, Ma, Mio, Mu, Nid, Ors, Ra, Sta, Svar, Tys, Vae, Van, Vol, Y, Ygg" + syllablesMiddle = "an, ar, ba, da, dra, gar, na, tal" + syllablesEnd = "ad, ald, agr, ar, ard, eyr, far, frost, heim, hogg, in, mir, nar, nir, or, osk, rir, sil, sir, ttir, urd" + illegal = "yor, yar, yad, yin" + rules = "$s$m$e, $s$e" +} + +name "Norse female" { + syllablesStart = "Al, Ae, As, Bi, Fen, Ha, Hag, Ho, Hu, Iv, Jot, Ma, Mio, Mu, Nid, Ors, Ra, Sta, Svar, Tys, Vae, Van, Vol, Y, Ygg" + syllablesMiddle = "an, ar, ba, da, dra, gar, na, tal" + syllablesEnd = "a, la, li, va" + illegal = "raa, ya, aea, aea" + rules = "$s$m$e, $s$e" +} + diff --git a/tcod/data/namegen/jice_region.cfg b/tcod/data/namegen/jice_region.cfg new file mode 100644 index 00000000..73f5508a --- /dev/null +++ b/tcod/data/namegen/jice_region.cfg @@ -0,0 +1,7 @@ +//Region names from Jice's "The Cave" +name "region" { + syllablesStart = "Act, Afr, Ag, Agr, Alb, Am, An, Angl, Ant, As, Asys, Asis, At, Atl, Brund, Cath, Cor, Dan, Eb, Eg, Er, Esc, Esp, Est, Eth, Eur, Flor, It, Lyr, Mal, Mir, Myr, Nor, Pel, Rom, Seg, Sib, Sylv, Terr, Tir, Tr, Tyr, Xan" + syllablesMiddle = "ad, ag, al, an, and, ant, anth, ar, ard, as, at, atr, eg, en, ent, ern, et, ian, in, itr, on, op, ov, ur, ymn, yr" + syllablesEnd = "a, aia, ana, as, ea, ene, eos, esia, ia, iad, ias, is, ium, ius, on, ona, or, ova, um, us, ya" + rules = "$s$m$e, $s$e" +} diff --git a/tcod/data/namegen/jice_town.cfg b/tcod/data/namegen/jice_town.cfg new file mode 100644 index 00000000..5a79a0ee --- /dev/null +++ b/tcod/data/namegen/jice_town.cfg @@ -0,0 +1,6 @@ +//Town names from Jice's "The Cave" +name "town" { + syllablesStart = "Ael, Ash, Barrow, Bel, Black, Clear, Cold, Crystal, Deep, Edge, Falcon, Fair, Fall, Glass, Gold, Ice, Iron, Mill, Moon, Mor, Ray, Red, Rock, Rose, Shadow, Silver, Spell, Spring, Stone, Strong, Summer, Swyn, Wester, Winter" + syllablesEnd = "ash, burn, barrow, bridge, castle, cliff, coast, crest, dale, dell, dor, fall, field, ford, fort, gate, haven, hill, hold, hollow, iron, lake, marsh, mill, mist, mount, moor, pond, shade, shore, summer, town, wick" + rules = "$s$e" +} diff --git a/tcod/data/namegen/mingos_demon.cfg b/tcod/data/namegen/mingos_demon.cfg new file mode 100644 index 00000000..649521f1 --- /dev/null +++ b/tcod/data/namegen/mingos_demon.cfg @@ -0,0 +1,16 @@ +//Demon names +name "demon male" { + phonemesVocals = "a, e, i, o, u" + syllablesStart = "Aam, Ab, Ad, Ahr, Alas, Al-A'w, All, Al-M, Ap, As, Ast, Az, Bal, Bal S, Bag, Balb, Ban, Bansh, Baph, Barb, Bath, Bazt, Be'L, Beel, Beelz, Bel, Belph, Ber, Bh, Bifr, Biul, Bush, Caac, Cagn, Caim, Chalk, Char, Chem, Coal, Dag, Dant, Decer, Demog, Dev, Dj, Dragh, Elig, Emp, Errt, Etr, Ett, Eur, Euryn, Gorg, Graph, Grig, Haag, Halph, Haur, Hoeth, Ifr, Inc, Ibl, Ith, Kabh, Kas, Kokb', Kray, Lab, Lam, Lech, Leg, Lil, Lioth, Lix, Luc, Mal, Malph, Mamm, March, Mast, Math, Meph, Merm, Mol, Murm, Naam, Naph, Nek, Neph, Neq, Nix, Noud, Onom, Onos, Orc, Orob, Oul, Paim, Phen, Pont, Proc, Rah, Rak, Raksh, Ram, Rang, Raum, Raz, Rimm, Rub, Rus, Sabn, Salps, Sam, Sat, Sc, Scarm, Seer, Sem, Set, Shait, Shax, Shed, Shez, Sidr, Sitr, Sth, Succ, Surg, Tann, Tart, Tch, Teer, Thamm, Thub, Tlal, Tsab, Val, Vap, Vass, Vep, Verr, Vin, Vol, Vual, Xaph, Xiph, Xitr, Zaeb, Zim, Ziz, Zaln" + syllablesMiddle = "b'ae, ba, be, chi, dra, du, ga, ghi, go, lia, ma, mba, mu, n'e, na, nti, nzu, phe, pho, r'e, rba, rgo, ssa, thi, tryu, ttu, tzi, v-e, vna, xra, ya" + syllablesEnd = "b'ael, bel, bub, bur, bus, ces, chus, dai, ddon, des, dhaka, el, fer, flas, gion, gon, gor, klet, kor, ksha, kuth, laas, lech, les, lion, lith, loch, lsu, mael, math, mejes, meus, mon, moth, mmut, mosh, nai, nar, neus, nex, nias, nnin, nomos, phas, r'el, raal, rept, res, rgon, riax, rith, rius, rous, rus, ruth, sias, stor, swath, tath, than, the, thra, tryus, tura, vart, ztuk" + rules = "$s$v$35m$10m$e" +} + +name "demon female" { + phonemesVocals = "a, e, i, o, u" + syllablesStart = "Aam, Ab, Ad, Ahr, Alas, Al-A'w, All, Al-M, Ap, As, Ast, Az, Bal, Bal S, Bag, Balb, Ban, Bansh, Baph, Barb, Bath, Bazt, Be'L, Beel, Beelz, Bel, Belph, Ber, Bh, Bifr, Biul, Bush, Caac, Cagn, Caim, Chalk, Char, Chem, Coal, Dag, Dant, Decer, Demog, Dev, Dj, Dragh, Elig, Emp, Errt, Etr, Ett, Eur, Euryn, Gorg, Graph, Grig, Haag, Halph, Haur, Hoeth, Ifr, Inc, Ibl, Ith, Kabh, Kas, Kokb', Kray, Lab, Lam, Lech, Leg, Lil, Lioth, Lix, Luc, Mal, Malph, Mamm, March, Mast, Math, Meph, Merm, Mol, Murm, Naam, Naph, Nek, Neph, Neq, Nix, Noud, Onom, Onos, Orc, Orob, Oul, Paim, Phen, Pont, Proc, Rah, Rak, Raksh, Ram, Rang, Raum, Raz, Rimm, Rub, Rus, Sabn, Salps, Sam, Sat, Sc, Scarm, Seer, Sem, Set, Shait, Shax, Shed, Shez, Sidr, Sitr, Sth, Succ, Surg, Tann, Tart, Tch, Teer, Thamm, Thub, Tlal, Tsab, Val, Vap, Vass, Vep, Verr, Vin, Vol, Vual, Xaph, Xiph, Xitr, Zaeb, Zim, Ziz, Zaln" + syllablesMiddle = "b'ae, ba, be, chi, dra, du, ga, ghi, go, lia, ma, mba, mu, n'e, na, nti, nzu, phe, pho, r'e, rba, rgo, ssa, thi, tryu, ttu, tzi, v-e, vna, xra, ya" + syllablesEnd = "b'a, bel, bua, bure, buth, cess, chia, dai, ddea, dea, dhaka, el, fea, fla, gia, goa, gora, klath, kore, ksha, kua, laal, lexa, less, lia, lith, loth, lsa, mara, math, maja, mea, moa, moth, mmuth, mosh, na, nai, neuth, nex, nia, nnine, nomoa, pha, r'el, raala, repte, reshe, rgona, riaxe, rith, rish, rothe, rushe, ruth, sia, stora, swath, tath, thann, the, thra, trya, tura, varte, ztura" + rules = "$s$v$35m$10m$e" +} diff --git a/tcod/data/namegen/mingos_dwarf.cfg b/tcod/data/namegen/mingos_dwarf.cfg new file mode 100644 index 00000000..d73c7a9d --- /dev/null +++ b/tcod/data/namegen/mingos_dwarf.cfg @@ -0,0 +1,29 @@ +//dwarf names +name "dwarf male" { + syllablesStart = "A, An, Ba, Bi, Bo, Bom, Da, Dar, De, Do, Du, Due, Duer, Dwa, Fa, Fal, Fi, Fre, Fun, Ga, Gar, Gim, Glo, Go, Gom, Gro, Gwar, Ib, Jor, Ka, Ki, Kil, Lo, Mar, Na, Nal, O, Ras, Ren, Ro, Ta, Tar, Tel, Thi, Tho, Thon, Thra, Tor, Von, We, Wer, Yen, Yur" + syllablesEnd = "bil, bin, bur, char, den, dir, dur, fri, fur, in, li, lin, mil, mur, ni, nur, ran, ri, ril, rimm, rin, thur, tri, ulf, un, ur, vi, vil, vim, vin, vri" + rules = "$s$e" + illegal = "rur, ueu" +} + +name "dwarf female" { + syllablesStart = "A, An, Ba, Bi, Bo, Bom, Da, Dar, De, Do, Du, Due, Duer, Dwa, Fa, Fal, Fi, Fre, Fun, Ga, Gar, Gim, Glo, Go, Gom, Gro, Gwar, Ib, Jor, Ka, Ki, Kil, Lo, Mar, Na, Nal, O, Ras, Ren, Ro, Ta, Tar, Tel, Thi, Tho, Thon, Thra, Tor, Von, We, Wer, Yen, Yur" + syllablesEnd = "al, ali, ba, bida, bra, da, deth, di, fra, gret, hild, iess, kala, la, laani, li, lona, ma, mae, mala, na, nuda, ra, ta, tala, tu, tuna, vada, vara, ya" + rules = "$s$e" + illegal = "dueal, frefra, grogret" +} + +//surnames have semantic information. Here, they're separated into three +//somewhat coherent sets and either is chosen +name "dwarf surname" { + //1st set - smith & Mr.Muscle surnames + syllablesPre = "Boulder, Bronze, Coal, Copper, Gem, Granite, Hammer, Iron, Marble, Metal, Rock, Steel, Stone, Thunder" + syllablesPost = "bender, breaker, carver, club, crusher, cutter, digger, fist, foot, forger, heart, smasher, smith" + //2nd set - warrior surnames + syllablesStart = "Bear, Boar, Dragon, Giant, Goblin, Elf, Ettin, Foe, Kobold, Ogre, Orc,Spider, Troll, Wolf" + syllablesEnd = "bane, basher, _Battler, _Beheader, boxer, _Butcher, choker, cleaver, crusher, cutter, doom, eater, _Executioner, _Fighter, _Garrotter, grapple, _Gutter, hammer, killer, mauler, masher, ripper, slasher, slayer, slicer, smasher, _Strangler, striker, _Wrestler" + //3rd set - heroic and general + phonemesVocals = "Black, Blood, Bronze, Fire, Firm, Grey, Hard, Ice, Iron, Moon, Oak, Onyx, Red, Steel, Stone, Strong, Thunder, White" + phonemesConsonants = "axe, beard, blade, brand, cheek, fist, foot, hair, hammer, hand, head, heart, pick, shield, spear, spike, sword" + rules = "$P$p, $s$e, $v$c" +} \ No newline at end of file diff --git a/tcod/data/namegen/mingos_norse.cfg b/tcod/data/namegen/mingos_norse.cfg new file mode 100644 index 00000000..a0ddc185 --- /dev/null +++ b/tcod/data/namegen/mingos_norse.cfg @@ -0,0 +1,19 @@ +//Norse names. Most of them are syllables extracted from names that +//actually appear in Norse written texts. Norse names consist of two parts, +//which is easy to reflect in a generator such as this one. +name "Mingos Norse male" { + //these are ready-made names + syllablesPre = "Aunn, Bjoern, Bjolfr, Bjorr, Boltr, Byulfr, Erik, Erpr, Eykr, Feitr, Fotr, Froekn, Gaukr, Gauss, Gils, Gimp, Griss, Gyi, Haegwin, Haengr, Hakon, Hand, Harekr, Hattr, Haukr, Helf, Hjalli, Hjaerne, Hjarrandi, Hnaki, Hneitr, Hrafn, Jarl, Karl, Kar-Toki, Kaun, Kilfisr, Kiuli, Knut, Knutr, Krakr, Leifr, Lokki, Manni, Mar, Moegr, Naemr, Nagli, Nef-Bjoern, Njall, Oelfun, Oenn, Oern, Rafn, Roki, Skjalf, Skog, Spjall, Sveinn, Tannr, Trani, Trjonn, Utryggr, Vagn, Varg, Ve-Finnr, Voettr, Vragi, Vrai" + //and these are syllables to stick together + syllablesStart = "Ab, Adal, Adi, Alf, An, And, Ans, Arn, Arm, Ask, Au, Audh, Ba, Bae, Bag, Bal, Bar, Bas, Bein, Berg, Bern, Bjad, Bjarn, Bjart, Boan, Boed, Boerk, Bogg, Bor, Bot, Bram, Bran, Bratt, Brei, Bro, Brunn, Bukk, Dag, Djur, Dor, Duf, Dun, Ed, Ei, Ein, Ekk, Ey, Fa, Fad, Fal, Far, Fast, Fen, Finn, Fjall, Fjoel, Flae, Fol, Folk, Foest, Frey, Frid, Frost, Ful, Fuld, Gaes, Geir, Gag, Gal, Gam, Gar, Gaut, Geir, Ginn, Gis, Gjaf, Gjal, God, Gnaudi, Gny, Gret, Grim, Grom, Grum, Gud, Gull, Gunn, Gutt, Gyll, Gyr, Ha, Haf, Hag, Hagn, Half, Hall, Ham, Har, Haur, Hedin, Hef, Heg, Heil, Hein, Hel, Hildi, Hjall, Hjalm, Hjoer, Hlif, Hloed, Hoeg, Hoegg, Hoer, Hoes, Hol, Holm, Hord, Horn, Hrad, Hrafn, Hring, Hroeng, Hross, Hug, Hul, Hum, Hus, Hvit, Hyr, Igul, Illu, In, Ingi, Is, Ja, Jar, Jarn, Jat, Jo, Joefur, Kjoet, Kol, Kon, Lamb, Lids, Lik, Ljot, Lyd, Nadd, Nef, Odal, Odd, Oeg, Oel, Oen, Oeng, Oes, Rad, Rafn, Ragn, Rask, Reid, Reyr, Roegn, Rok, Run, Sae, Sig, Skae, Skjald, Skjoeld, Skol, Slag, Snae, Soel, Soend, Spjall, Stafn, Stark, Stein, Stig, Stod, Stygg, Styr, Sunn, Svein, Svart, Svarta, Tid, Tindr, Tjoer, Trygg, Tyr, Thyr, Ud, Ulf, Yngv, Vae, Val, Varg, Ve, Ved, Vest, Vetr, Vid, Vig, Vik" + syllablesEnd = "adr, afr, all, andi, arfr, arr, astr, autr, bi, beinn, bert, bjoern, bodi, bodr, bori, brandr, burinn, burt, daenni, dan, di, din, diarfr, dinn, dr, dridr, dur, eifr, eirr, fast, fasti, fastr, fidr, fill, fing, fingr, finnr, fli, fri, frimr, fuss, gall, geir, geirr, gils, gir, gisl, glir, glumr, grimr, gripr, gur, guri, haldr, hegn, hjalmr, hjoefr, hjofr, hoefdi, hoess, hofdi, horir, horr, hoess, hvatr, ilir, ill, ingr, inn, jadr, jarn, jarr, jartan, jartr, joern, jofr, karl, kell, ketill, kirr, kuldr, kull, kundr, kunnr, laugr, lan, leifr, leikr, li, lidi, lidr, lingr, madr, maer, mann, marr, mingr, modr, mr, mund, mundr, nall, narr, nefr, nir, niutr, olfr, ormr, phorr, pli, r, raeifr, radr, rik, rikr, ring, rinn, rir, roedr, rudr, rukr, si, sir, skegg, skeggi, sjall, steinn, styrr, sur, tir, tyr, utr, ulf, ulfr, undr, ungr, urd, urdr, valdr, vandi, vandill, veinr, ver, vett, vi, vidr, vifr, vind, vindr, vi, vini, vir, visl" + rules = "$s$e, %10$P" + illegal = "bjarnbj, gp, vv, aea, aee, aeo, drd" +} + +name "Mingos Norse female" { + syllablesStart = "A, Aer, Aerin, Aes, Aet, Afri, Agaer, Ager, Al, Alf, Alm, Arinn, Arn, As, Au, Aud, Bau, Be, Beg, Berg, Bir, Bjol, Bod, Bol, Bor, Borg, Bot, Bri, Brun, Bryn, Bus, Dag, Dis, Dom, Dor, Dot, Dri, Dyr, Ed, Ei, Em, Emb, Engil, Er, Es, Ev, Ey, Fal, Fast, Fin, Fjol, Fjor, Fjot, Folk, Frey, Frid, Frost, Gaut, Geir, Ger, Gil, Ginn, Gis, Gjaf, Gre, Grim, Gud, Gy, Gyd, Haf, Hall, Haur, Hedin, Heil, Heim, Hel, Her, Hidin, Hil, Hildi, Hjalm, Hjor, Hlad, Hlif, Holm, Hrim, Hrod, Hun, Igul, In, Ingi, Ingil, Is, Jar, Jo, Jofur, Jor, Jut, Ljuf, Lofn, Mal, Malm, Mar, Mat, Matt, Mund, Nid, Odd, Ol, Olm, Ot, Rad, Ragn, Rand, Rann, Regin, Run, Sal, Sae, Sig, Skjald, Sol, Stein, Svan, Svein, Tid, Ulf, Vet, Val, Ve, Vig, Vil, Yng" + syllablesEnd = "bjorg, borg, da, dis, disa, disla, dora, eida, erna, fasta, finna, frida, frosta, fura, ga, gard, gauta, geid, gerda, gida, gret, grid, grima, gudr, gunn, gunna, heidr, hilda, ja, la, laug, lina, linn, ma, maer, rida, run, ta, trid, trida, truda, unn, ve, velda, vi, vilda, vina" + illegal = "ii, iei, edeid, tg, ee, vev" + rules = "$s$e" +} diff --git a/tcod/data/namegen/mingos_standard.cfg b/tcod/data/namegen/mingos_standard.cfg new file mode 100644 index 00000000..32380548 --- /dev/null +++ b/tcod/data/namegen/mingos_standard.cfg @@ -0,0 +1,17 @@ +//Names based on syllables from J.R.R. Tolkien's and David Eddings' novels. +name "male" { + phonemesVocals = "a, e, i, o, u, y" + phonemesConsonants = "b, c, ch, ck, cz, d, dh, f, g, gh, h, j, k, kh, l, m, n, p, ph, q, r, rh, s, sh, t, th, ts, tz, v, w, x, z, zh" + syllablesStart = "Aer, Al, Am, An, Ar, Arm, Arth, B, Bal, Bar, Be, Bel, Ber, Bok, Bor, Bran, Breg, Bren, Brod, Cam, Chal, Cham, Ch, Cuth, Dag, Daim, Dair, Del, Dr, Dur, Duv, Ear, Elen, Er, Erel, Erem, Fal, Ful, Gal, G, Get, Gil, Gor, Grin, Gun, H, Hal, Han, Har, Hath, Hett, Hur, Iss, Khel, K, Kor, Lel, Lor, M, Mal, Man, Mard, N, Ol, Radh, Rag, Relg, Rh, Run, Sam, Tarr, T, Tor, Tul, Tur, Ul, Ulf, Unr, Ur, Urth, Yar, Z, Zan, Zer" + syllablesMiddle = "de, do, dra, du, duna, ga, go, hara, kaltho, la, latha, le, ma, nari, ra, re, rego, ro, rodda, romi, rui, sa, to, ya, zila" + syllablesEnd = "bar, bers, blek, chak, chik, dan, dar, das, dig, dil, din, dir, dor, dur, fang, fast, gar, gas, gen, gorn, grim, gund, had, hek, hell, hir, hor, kan, kath, khad, kor, lach, lar, ldil, ldir, leg, len, lin, mas, mnir, ndil, ndur, neg, nik, ntir, rab, rach, rain, rak, ran, rand, rath, rek, rig, rim, rin, rion, sin, sta, stir, sus, tar, thad, thel, tir, von, vor, yon, zor" + rules = "$s$v$35m$10m$e" +} + +name "female" { + phonemesVocals = "a, e, i, o, u, y" + syllablesStart = "Ad, Aer, Ar, Bel, Bet, Beth, Ce'N, Cyr, Eilin, El, Em, Emel, G, Gl, Glor, Is, Isl, Iv, Lay, Lis, May, Ner, Pol, Por, Sal, Sil, Vel, Vor, X, Xan, Xer, Yv, Zub" + syllablesMiddle = "bre, da, dhe, ga, lda, le, lra, mi, ra, ri, ria, re, se, ya" + syllablesEnd = "ba, beth, da, kira, laith, lle, ma, mina, mira, na, nn, nne, nor, ra, rin, ssra, ta, th, tha, thra, tira, tta, vea, vena, we, wen, wyn" + rules = "$s$v$35m$10m$e" +} diff --git a/tcod/data/namegen/mingos_town.cfg b/tcod/data/namegen/mingos_town.cfg new file mode 100644 index 00000000..226e969b --- /dev/null +++ b/tcod/data/namegen/mingos_town.cfg @@ -0,0 +1,9 @@ +//Town names. The town name construction is based on real British town names, +//although many starting syllables are made up. +name "Mingos town" { + syllablesPre = "East, Fort, Great, High, Lower, Middle, Mount, New, North, Old, Royal, Saint, South, Upper, West" + syllablesStart = "Ales, Apple, Ash, Bald, Bay, Bed, Bell, Birdling, Black, Blue, Bow, Bran, Brass, Bright, Brown, Bruns, Bulls, Camp, Cherry, Clark, Clarks, Clay, Clear, Copper, Corn, Cross, Crystal, Dark, Deep, Deer, Drac, Eagle, Earth, Elk, Elles, Elm, Ester, Ewes, Fair, Falcon, Ferry, Fire, Fleet, Fox, Gold, Grand, Green, Grey, Guild, Hammer, Hart, Hawks, Hay, Haze, Hazel, Hemlock, Ice, Iron, Kent, Kings, Knox, Layne, Lint, Lor, Mable, Maple, Marble, Mare, Marsh, Mist, Mor, Mud, Nor, Oak, Orms, Ox, Oxen, Pear, Pine, Pitts, Port, Purple, Red, Rich, Roch, Rock, Rose, Ross, Rye, Salis, Salt, Shadow, Silver, Skeg, Smith, Snow, Sows, Spring, Spruce, Staff, Star, Steel, Still, Stock, Stone, Strong, Summer, Swan, Swine, Sword, Yellow, Val, Wart, Water, Well, Wheat, White, Wild, Winter, Wolf, Wool, Wor" + syllablesEnd = "bank, borne, borough, brook, burg, burgh, bury, castle, cester, cliff, crest, croft, dale, dam, dorf, edge, field, ford, gate, grad, hall, ham, hollow, holm, hurst, keep, kirk, land, ley, lyn, mere, mill, minster, mont, moor, mouth, ness, pool, river, shire, shore, side, stead, stoke, ston, thorpe, ton, town, vale, ville, way, wich, wick, wood, worth" + syllablesPost = "Annex, Barrens, Barrow, Corner, Cove, Crossing, Dell, Dales, Estates, Forest, Furnace, Grove, Haven, Heath, Hill, Junction, Landing, Meadow, Park, Plain, Point, Reserve, Retreat, Ridge, Springs, View, Village, Wells, Woods" + rules = "$15P_$s$e_$15p" +} diff --git a/tcod/examples/astar-path-finding.rs b/tcod/examples/astar-path-finding.rs new file mode 100644 index 00000000..4b2c9125 --- /dev/null +++ b/tcod/examples/astar-path-finding.rs @@ -0,0 +1,68 @@ +extern crate tcod; + +use tcod::pathfinding::AStar; + +fn create_path() -> AStar<'static> { + let chess_board: [[i32; 8]; 8] = [ + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + ]; + // Movement like in Checkers: you can only move to the square of the same colour + let can_move = move |from: (i32, i32), to: (i32, i32)| -> f32 { + let (fx, fy) = from; + let (tx, ty) = to; + if chess_board[fy as usize][fx as usize] == chess_board[ty as usize][tx as usize] { + 1.0 + } else { + 0.0 + } + }; + AStar::new_from_callback(8, 8, can_move, 1.0) +} + +fn main() { + let mut path = create_path(); + assert_eq!(path.find((0, 0), (1, 1)), true); + assert_eq!(path.len(), 1); + assert_eq!(path.is_empty(), false); + assert_eq!(path.find((0, 0), (0, 1)), false); + assert_eq!(path.len(), 0); + assert_eq!(path.is_empty(), true); + + assert_eq!(path.find((0, 0), (0, 6)), true); + assert_eq!(path.len(), 6); + assert_eq!(path.origin(), (0, 0)); + assert_eq!(path.destination(), (0, 6)); + + // Explore the path: + assert_eq!(path.get(0), Some((1, 1))); + assert_eq!(path.get(1), Some((0, 2))); + assert_eq!(path.get(2), Some((1, 3))); + assert_eq!(path.get(3), Some((0, 4))); + assert_eq!(path.get(4), Some((1, 5))); + assert_eq!(path.get(5), Some((0, 6))); + + // Make sure we don't segfault on invalid index + assert_eq!(path.get(-1), None); + assert_eq!(path.get(6), None); + assert_eq!(path.get(7), None); + + + // Walk the path (consuming it): + for pos in path.walk() { + println!("Walking to {:?}", pos); + } + + assert_eq!(path.len(), 0); + assert_eq!(path.is_empty(), true); + // Note: origin has moved to the destination: + assert_eq!(path.origin(), (0, 6)); + assert_eq!(path.destination(), (0, 6)); + assert_eq!(path.get(0), None); +} diff --git a/tcod/examples/blit.rs b/tcod/examples/blit.rs new file mode 100644 index 00000000..3a939ebd --- /dev/null +++ b/tcod/examples/blit.rs @@ -0,0 +1,42 @@ +extern crate tcod; + +use tcod::console; +use tcod::{Console, RootConsole, OffscreenConsole}; +use tcod::colors; + + +fn main() { + let mut root = RootConsole::initializer() + .size(80, 50) + .title("Using blit with libtcod") + .init(); + + let mut direct: OffscreenConsole = OffscreenConsole::new(20, 20); + let mut boxed_direct: Box = Box::new(OffscreenConsole::new(20, 20)); + let mut trait_object: &Console = &OffscreenConsole::new(20, 20); + let mut boxed_trait: Box = Box::new(OffscreenConsole::new(20, 20)); + + + root.set_default_background(colors::DARKEST_GREEN); + + direct.set_default_background(colors::RED); + boxed_direct.set_default_background(colors::WHITE); + trait_object.set_default_background(colors::BLACK); + boxed_trait.set_default_background(colors::BLUE); + + root.clear(); + + direct.clear(); + boxed_direct.clear(); + trait_object.clear(); + boxed_trait.clear(); + + + console::blit(&direct, (0, 0), (20, 20), &mut root, (0, 0), 1.0, 1.0); + console::blit(&boxed_direct, (0, 0), (20, 20), &mut root, (20, 0), 1.0, 1.0); + console::blit(&trait_object, (0, 0), (20, 20), &mut root, (0, 20), 1.0, 1.0); + console::blit(&boxed_trait, (0, 0), (20, 20), &mut root, (20, 20), 1.0, 1.0); + + root.flush(); + root.wait_for_keypress(true); +} diff --git a/tcod/examples/chars.rs b/tcod/examples/chars.rs new file mode 100644 index 00000000..cc5c3239 --- /dev/null +++ b/tcod/examples/chars.rs @@ -0,0 +1,32 @@ +extern crate tcod; + +use tcod::{Console, RootConsole}; +use tcod::chars; + +fn main() { + let mut root = RootConsole::initializer() + .size(80, 50) + .title("Example of libtcod's special chars") + .init(); + + root.clear(); + + // The top half of the box + root.set_char(40, 25, chars::HLINE); + root.set_char(41, 25, chars::NE); + root.set_char(41, 26, chars::VLINE); + root.set_char(41, 27, chars::SE); + + // Draw the heart: + root.set_char(40, 26, chars::HEART); + + // The bottom half of the box + root.set_char(40, 27, chars::HLINE); + root.set_char(39, 27, chars::SW); + root.set_char(39, 26, chars::VLINE); + root.set_char(39, 25, chars::NW); + + root.flush(); + root.wait_for_keypress(true); +} + diff --git a/tcod/examples/colors.rs b/tcod/examples/colors.rs new file mode 100644 index 00000000..906862c3 --- /dev/null +++ b/tcod/examples/colors.rs @@ -0,0 +1,38 @@ +extern crate tcod; + +use tcod::{Console, RootConsole, Color, BackgroundFlag}; +use tcod::colors; + + +fn main() { + let mut con = RootConsole::initializer() + .size(80, 50) + .title("Using colours with libtcod") + .init(); + con.set_default_background(colors::DARKEST_GREEN); + con.set_default_foreground(colors::LIGHTER_AZURE); + + con.clear(); + // Uses the default foreground and background: + con.put_char(40, 25, '@', BackgroundFlag::Set); + // Custom foreground and background: + con.put_char_ex(42, 25, '!', Color{r: 240, g: 13, b: 20}, Color{r: 0, g: 0, b: 0}); + + let black = Color::new(0, 0, 0); + let red = Color::new(200, 0, 0); + + con.put_char_ex(30, 30, '.', black, red); + con.put_char_ex(32, 30, '.', black, red * Color::new(200, 0, 0)); + con.put_char_ex(34, 30, '.', black, red * 0.3); + con.put_char_ex(36, 30, '.', black, red + Color::new(25, 60, 0)); + con.put_char_ex(36, 30, '.', black, red - Color::new(25, 60, 0)); + con.put_char_ex(38, 30, '.', black, colors::lerp(red, black, 0.8)); + + let (h, s, v) = red.hsv(); + println!("Red colour's hue: {}, saturation: {}, value: {}", h, s, v); + + con.flush(); + + // Press any key to exit: + con.wait_for_keypress(true); +} diff --git a/tcod/examples/dijkstra-path-finding.rs b/tcod/examples/dijkstra-path-finding.rs new file mode 100644 index 00000000..00bad2cc --- /dev/null +++ b/tcod/examples/dijkstra-path-finding.rs @@ -0,0 +1,50 @@ +extern crate tcod; + +use tcod::pathfinding::Dijkstra; + +fn create_path() -> Dijkstra<'static> { + let chess_board: [[i32; 8]; 8] = [ + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + [1, 0, 1, 0, 1, 0, 1, 0], + [0, 1, 0, 1, 0, 1, 0, 1], + ]; + // Movement like in Checkers: you can only move to the square of the same colour + let can_move = move |from: (i32, i32), to: (i32, i32)| -> f32 { + let (fx, fy) = from; + let (tx, ty) = to; + if chess_board[fy as usize][fx as usize] == chess_board[ty as usize][tx as usize] { + 1.0 + } else { + 0.0 + } + }; + Dijkstra::new_from_callback(8, 8, can_move, 1.0) +} + +fn walk_from(path: &mut Dijkstra, origin: (i32, i32)) { + path.find(origin); + path.reverse(); + println!("Starting from: {:?}", origin); + for pos in path.walk() { + println!("Walking to: {:?}", pos); + } + println!("Arrived at the destination!\n"); +} + + +fn main() { + let mut path = create_path(); + let destination = (0, 0); + path.compute_grid(destination); + + // Let's find multiple paths leading to (0, 0) + walk_from(&mut path, (4, 6)); + walk_from(&mut path, (0, 6)); + walk_from(&mut path, (0, 0)); + walk_from(&mut path, (6, 2)); +} diff --git a/tcod/examples/fov.rs b/tcod/examples/fov.rs new file mode 100644 index 00000000..0572c143 --- /dev/null +++ b/tcod/examples/fov.rs @@ -0,0 +1,54 @@ +extern crate rand; +extern crate tcod; + +use tcod::{Console, RootConsole, BackgroundFlag, Map}; +use tcod::map::FovAlgorithm; + +// We'll use a basic structure to define our tiles. +#[derive(Copy, Clone)] +pub struct Tile { + ch: char, + x: i32, + y: i32, +} + +fn main() { + let mut root = RootConsole::initializer().size(40, 40) .title("FOV example").init(); + + let mut map = Map::new(40,40); + let mut tiles = Vec::new(); + + root.clear(); + + // Set the map. + for x in 0..40 { + for y in 0..40 { + // Place some walls randomly. + if rand::random() { + tiles.push(Tile{x:x, y:y, ch: '#' }); + // Mark this place as non transparent, and non walkable. + map.set(x,y,false,false); + } else { + tiles.push(Tile{x:x, y:y, ch: '.'}); + // Mark this place as transparent and walkable. + map.set(x,y,true,true); + } + } + } + + // Compute the FOV starting from the coordinates 20,20. Where we'll put the '@' + // Use a max_radius of 10 and light the walls. + map.compute_fov(20,20, 10, true, FovAlgorithm::Basic); + + for tile in tiles.iter() { + if map.is_in_fov(tile.x, tile.y) { + root.put_char(tile.x,tile.y,tile.ch, BackgroundFlag::Set); + } + } + + root.put_char(20,20, '@', BackgroundFlag::Set); + + root.flush(); + //Press any key to exit. + root.wait_for_keypress(true); +} diff --git a/tcod/examples/keyboard.rs b/tcod/examples/keyboard.rs new file mode 100644 index 00000000..2599a5f2 --- /dev/null +++ b/tcod/examples/keyboard.rs @@ -0,0 +1,33 @@ +extern crate tcod; + +use tcod::{Console, RootConsole, BackgroundFlag}; +use tcod::input::Key; +use tcod::input::KeyCode::{Up, Down, Left, Right, Escape}; + +fn main() { + let mut con = RootConsole::initializer() + .size(80, 50) + .title("libtcod Rust tutorial") + .init(); + + let mut x = 40; + let mut y = 25; + while !con.window_closed() { + con.clear(); + con.put_char(x, y, '@', BackgroundFlag::Set); + con.flush(); + let keypress = con.wait_for_keypress(true); + // libtcod 1.5.1 has a bug where `wait_for_keypress` emits two events: + // one for key down and one for key up. So we ignore the "key up" ones. + if keypress.pressed { + match keypress { + Key { code: Escape, .. } => break, + Key { code: Up, .. } => y -= 1, + Key { code: Down, .. } => y += 1, + Key { code: Left, .. } => x -= 1, + Key { code: Right, .. } => x += 1, + _ => {} + } + } + } +} diff --git a/tcod/examples/minimal.rs b/tcod/examples/minimal.rs new file mode 100644 index 00000000..59613ca8 --- /dev/null +++ b/tcod/examples/minimal.rs @@ -0,0 +1,13 @@ +extern crate tcod; + +use tcod::RootConsole; + +fn main() { + let mut root = RootConsole::initializer().size(80, 50).title("Minimal libtcod loop").init(); + + while !root.window_closed() { + root.flush(); + let key = root.wait_for_keypress(true); + println!("Pressed key: {:?}", key); + } +} diff --git a/tcod/examples/mouse.rs b/tcod/examples/mouse.rs new file mode 100644 index 00000000..56ec2ffa --- /dev/null +++ b/tcod/examples/mouse.rs @@ -0,0 +1,41 @@ +extern crate tcod; + +use tcod::input as input; +use tcod::{Console, RootConsole, BackgroundFlag}; + +fn main() { + let mut con = RootConsole::initializer() + .size(80, 50) + .title("Move the cursor inside the window") + .init(); + + let mut x = 40; + let mut y = 25; + + while !con.window_closed() { + + loop { + match input::check_for_event(input::KEY | input::MOUSE) { + None => { + break; + } + Some((_, event)) => { + match event { + input::Event::Key(ref key_state) => { + println!("{:?}", key_state); + }, + input::Event::Mouse(ref mouse_state) => { + x = mouse_state.cx as i32; + y = mouse_state.cy as i32; + println!("{:?}", mouse_state); + } + } + } + } + } + + con.clear(); + con.put_char(x, y, '@', BackgroundFlag::Set); + con.flush(); + } +} diff --git a/tcod/examples/namegen.rs b/tcod/examples/namegen.rs new file mode 100644 index 00000000..0f3f110c --- /dev/null +++ b/tcod/examples/namegen.rs @@ -0,0 +1,16 @@ + extern crate tcod; + +use tcod::namegen::Namegen; +use tcod::random::{Rng, Algo}; + +fn setup_namegen() -> Namegen { + let rng = Rng::new(Algo::MT); + let mut namegen = Namegen::new().unwrap(); + namegen.parse_with_rng("data/namegen/mingos_standard.cfg", &rng); + namegen +} + +fn main() { + let namegen = setup_namegen(); + println!("{}", namegen.generate("male").unwrap()); +} diff --git a/tcod/examples/print_macros.rs b/tcod/examples/print_macros.rs new file mode 100644 index 00000000..08a6e025 --- /dev/null +++ b/tcod/examples/print_macros.rs @@ -0,0 +1,28 @@ +#[macro_use] +extern crate tcod; + +use tcod::{Console, RootConsole, BackgroundFlag, TextAlignment}; + +fn main() { + let mut root = RootConsole::initializer().size(80, 50).title("Displaying text").init(); + + // No optional parameters + tcod_print!(root, At(1, 1), "Any text params may be {}", "formatted with println! formatting"); + + // One optional parameter + tcod_print!(root, At(1, 3), Wrap(6, 2), "Simple wrap"); + tcod_print!(root, At(1, 6), Bg(BackgroundFlag::None), "No background flag"); + tcod_print!(root, At(75, 8), Align(TextAlignment::Right), "Right align"); + + + // Two optional parameters. The optional parameters may be given in any order + tcod_print!(root, At(1, 10), Wrap(6, 2), Bg(BackgroundFlag::None), "Bg and wrap"); + tcod_print!(root, At(70, 12), Align(TextAlignment::Right), Wrap(6, 3), "Align and wrap"); + + // Three optional parameters + tcod_print!(root, At(40, 25), Wrap(10, 10), Bg(BackgroundFlag::None), Align(TextAlignment::Center), + "This text is printed with every optional parameter, format: {} {}", "string", 1); + + root.flush(); + root.wait_for_keypress(true); +} diff --git a/tcod/examples/roguelike-tutorial-1.rs b/tcod/examples/roguelike-tutorial-1.rs new file mode 100644 index 00000000..710f1e41 --- /dev/null +++ b/tcod/examples/roguelike-tutorial-1.rs @@ -0,0 +1,70 @@ +//! Port of the Complete Roguelike Tutorial for Python + libtcod to Rust +//! +//! This is the complete code of the part one of the tutorial: Graphics: +//! http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod,_part_1 +//! + +extern crate tcod; + +use tcod::console::{Root, Console, FontLayout, FontType, BackgroundFlag}; +use tcod::colors; +use tcod::input::Key; +use tcod::input::KeyCode::{Up, Down, Left, Right, Escape, Enter}; + +// actual size of the window +const SCREEN_WIDTH: i32 = 80; +const SCREEN_HEIGHT: i32 = 50; + +const LIMIT_FPS: i32 = 20; // 20 frames-per-second maximum + +fn handle_keys(root: &mut Root, player_x: &mut i32, player_y: &mut i32) -> bool { + // if let Some(keypress) = root.check_for_keypress() // real-time + let keypress = root.wait_for_keypress(true); + + match keypress { + // Alt+Enter: toggle fullscreen + Key { code: Enter, alt: true, .. } => { + let fullscreen = !root.is_fullscreen(); + root.set_fullscreen(fullscreen); + } + Key { code: Escape, .. } => { + return true // exit game + } + // movement keys + Key { code: Up, .. } => *player_y -= 1, + Key { code: Down, .. } => *player_y += 1, + Key { code: Left, .. } => *player_x -= 1, + Key { code: Right, .. } => *player_x += 1, + _ => {} + } + return false; +} + +fn main() { + let mut root = Root::initializer() + .font("arial10x10.png", FontLayout::Tcod) + .font_type(FontType::Greyscale) + .size(SCREEN_WIDTH, SCREEN_HEIGHT) + .title("Rust/libtcod tutorial") + .init(); + + tcod::system::set_fps(LIMIT_FPS); + + let mut player_x = SCREEN_WIDTH / 2; + let mut player_y = SCREEN_HEIGHT / 2; + + while !root.window_closed() { + root.set_default_foreground(colors::WHITE); + root.put_char(player_x, player_y, '@', BackgroundFlag::None); + + root.flush(); + + root.put_char(player_x, player_y, ' ', BackgroundFlag::None); + + // handle keys and exit game if needed + let exit = handle_keys(&mut root, &mut player_x, &mut player_y); + if exit { + break + } + } +} diff --git a/tcod/examples/roguelike-tutorial-2.rs b/tcod/examples/roguelike-tutorial-2.rs new file mode 100644 index 00000000..03db7a30 --- /dev/null +++ b/tcod/examples/roguelike-tutorial-2.rs @@ -0,0 +1,173 @@ +//! Port of the Complete Roguelike Tutorial for Python + libtcod to Rust +//! +//! This is the complete code of the part two of the tutorial: The object and the map. +//! http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod,_part_2 +//! + +extern crate tcod; + +use tcod::console::{Root, Offscreen, Console, FontLayout, FontType, BackgroundFlag}; +use tcod::colors::{self, Color}; +use tcod::input::Key; +use tcod::input::KeyCode::{Up, Down, Left, Right, Escape, Enter}; + +// actual size of the window +const SCREEN_WIDTH: i32 = 80; +const SCREEN_HEIGHT: i32 = 50; + +// size of the map +const MAP_WIDTH: usize = 80; +const MAP_HEIGHT: usize = 45; + +const LIMIT_FPS: i32 = 20; // 20 frames-per-second maximum + +const COLOR_DARK_WALL: Color = Color{r: 0, g: 0, b: 100}; +const COLOR_DARK_GROUND: Color = Color{r: 50, g: 50, b: 150}; + +type Map = Vec>; + +struct Object { + x: i32, + y: i32, + char: char, + color: Color, +} + +impl Object { + pub fn new(x: i32, y: i32, char: char, color: Color) -> Object { + Object { + x: x, + y: y, + char: char, + color: color, + } + } + + /// Move by the given amount + pub fn move_by(&mut self, dx: i32, dy: i32, map: &Map) { + if !map[(self.x + dx) as usize][(self.y + dy) as usize].blocked { + self.x += dx; + self.y += dy; + } + } + + pub fn draw(&self, con: &mut Console) { + con.set_default_foreground(self.color); + con.put_char(self.x, self.y, self.char, BackgroundFlag::None); + } + + pub fn clear(&self, con: &mut Console) { + con.put_char(self.x, self.y, ' ', BackgroundFlag::None); + } +} + +#[derive(Copy, Clone)] +struct Tile { + blocked: bool, + block_sight: bool, +} + +fn make_map() -> Map { + let mut map = vec![]; + + // fill map with "unblocked" tiles + for _ in 0..MAP_WIDTH { + let column = vec![Tile{blocked: false, block_sight: false}; MAP_HEIGHT]; + map.push(column); + } + + // place two pillars to test the map + map[30][22].blocked = true; + map[30][22].block_sight = true; + map[50][22].blocked = true; + map[50][22].block_sight = true; + + map +} + +fn render_all(root: &mut Root, con: &mut Offscreen, objects: &[Object], map: &Map) { + for object in objects { + object.draw(con); + } + + // go through all tiles, and set their background color + for x in 0..MAP_WIDTH { + for y in 0..MAP_HEIGHT { + let wall = map[x][y].block_sight; + let (x, y) = (x as i32, y as i32); + if wall { + con.set_char_background(x, y, COLOR_DARK_WALL, BackgroundFlag::Set); + } else { + con.set_char_background(x, y, COLOR_DARK_GROUND, BackgroundFlag::Set); + } + } + } + // blit the contents of "con" to the root console + tcod::console::blit(con, (0, 0), (SCREEN_WIDTH, SCREEN_HEIGHT), + root, (0, 0), + 1.0, 1.0); +} + +fn handle_keys(root: &mut Root, player: &mut Object, map: &Map) -> bool { + // if let Some(keypress) = root.check_for_keypress() // real-time + let keypress = root.wait_for_keypress(true); // turn-based + match keypress { + // Alt+Enter: toggle fullscreen + Key { code: Enter, alt: true, .. } => { + let fullscreen = !root.is_fullscreen(); + root.set_fullscreen(fullscreen); + } + Key { code: Escape, .. } => { + return true // exit game + } + // movement keys + Key { code: Up, .. } => player.move_by(0, -1, map), + Key { code: Down, .. } => player.move_by(0, 1, map), + Key { code: Left, .. } => player.move_by(-1, 0, map), + Key { code: Right, .. } => player.move_by(1, 0, map), + _ => {} + } + return false; +} + +fn main() { + let mut root = Root::initializer() + .font("arial10x10.png", FontLayout::Tcod) + .font_type(FontType::Greyscale) + .size(SCREEN_WIDTH, SCREEN_HEIGHT) + .title("Rust/libtcod tutorial") + .init(); + + let mut con = Offscreen::new(SCREEN_WIDTH, SCREEN_HEIGHT); + + tcod::system::set_fps(LIMIT_FPS); + + // create object representing the player + let player = Object::new(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, '@', colors::WHITE); + + // create an NPC + let npc = Object::new(SCREEN_WIDTH / 2 - 5, SCREEN_HEIGHT / 2, '@', colors::YELLOW); + + // the list of objects with those two + let mut objects = [player, npc]; + + let map = make_map(); + + while !root.window_closed() { + // render the screen + render_all(&mut root, &mut con, &objects, &map); + + root.flush(); + + // erase all objects at their old location, before they move + for object in &objects { + object.clear(&mut con); + } + + // handle keys and exit game if needed + let exit = handle_keys(&mut root, &mut objects[0], &map); + if exit { + break + } + } +} diff --git a/tcod/examples/samples.rs b/tcod/examples/samples.rs new file mode 100644 index 00000000..abbe7153 --- /dev/null +++ b/tcod/examples/samples.rs @@ -0,0 +1,1761 @@ +extern crate tcod; +extern crate tcod_sys as ffi; +extern crate rand; + +use tcod::console::*; +use tcod::input::*; +use tcod::system; +use tcod::colors; +use tcod::colors::Color; +use tcod::chars; +use tcod::pathfinding::{Dijkstra, AStar}; +use tcod::map::{Map, FovAlgorithm}; +use tcod::image; +use tcod::namegen::Namegen; +use tcod::line::Line; +use tcod::noise::{Noise, NoiseType, DEFAULT_HURST, DEFAULT_LACUNARITY, MAX_OCTAVES}; +use tcod::image::{Image, blit_2x}; +use tcod::bsp::{Bsp, TraverseOrder}; +use rand::Rng; +use rand::ThreadRng; +use std::char::from_u32; +use std::fs::read_dir; +use std::cmp::{min, max}; +use std::time::Duration; + +const SAMPLE_SCREEN_WIDTH : i32 = 46; +const SAMPLE_SCREEN_HEIGHT : i32 = 20; + +const SAMPLE_SCREEN_X : i32 = 20; +const SAMPLE_SCREEN_Y : i32 = 10; + +trait Render { + fn initialize(&mut self, console: &mut Offscreen); + + fn render(&mut self, console: &mut Offscreen, root: &Root, + event: Option<(EventFlags, Event)>); +} + +struct ColorsSample { + cols: [Color; 4], + dirr: [i8; 4], + dirg: [i8; 4], + dirb: [i8; 4], + rng: ThreadRng, +} + +impl ColorsSample { + fn new() -> Self { + ColorsSample { + cols: [Color::new(50, 40, 150), + Color::new(240, 85, 5), + Color::new(50, 35, 240), + Color::new(10, 200, 130)], + dirr: [1, -1, 1, 1], + dirg: [1, -1, -1, 1], + dirb: [1, 1, 1, -1], + rng: rand::thread_rng(), + } + } + + fn cycle_color_component(&self, color_component: u8, dir: i8) -> (u8, i8) { + let delta : i16 = (5 * dir) as i16; + let new_component = (color_component as i16 + delta) as u8; + + let new_dir = if new_component == 255 { -1 } + else if new_component == 0 { 1 } + else { dir }; + (new_component, new_dir) + } + + fn cycle_colors(&mut self) { + for c in 0..4 { + let component = self.rng.gen_range(0, 3); + match component { + 0 => { + let (n_c, n_d) = self.cycle_color_component(self.cols[c].r, self.dirr[c]); + self.cols[c].r = n_c; + self.dirr[c] = n_d; + }, + 1 => { + let (n_c, n_d) = self.cycle_color_component(self.cols[c].g, self.dirg[c]); + self.cols[c].g = n_c; + self.dirg[c] = n_d; + }, + 2 => { + let (n_c, n_d) = self.cycle_color_component(self.cols[c].b, self.dirb[c]); + self.cols[c].b = n_c; + self.dirb[c] = n_d; + }, + _ => panic!("Random number generator is broken!") + } + } + + } + + fn set_colors(&self, console: &mut Console) { + enum Dir { + TopLeft = 0, + TopRight, + BottomLeft, + BottomRight, + }; + + // ==== scan the whole screen, interpolating corner colors ==== + for x in 0..SAMPLE_SCREEN_WIDTH { + let xcoef = (x as f32) / ((SAMPLE_SCREEN_WIDTH-1) as f32); + + // get the current column top and bottom colors + let top = colors::lerp(self.cols[Dir::TopLeft as usize], + self.cols[Dir::TopRight as usize], + xcoef); + let bottom = colors::lerp(self.cols[Dir::BottomLeft as usize], + self.cols[Dir::BottomRight as usize], + xcoef); + for y in 0..SAMPLE_SCREEN_HEIGHT { + let ycoef = (y as f32) / ((SAMPLE_SCREEN_HEIGHT-1) as f32); + + // get the current cell color + let cur_color = colors::lerp(top, bottom, ycoef); + console.set_char_background(x, y, cur_color, BackgroundFlag::Set); + } + } + } + + fn print_random_chars(&mut self, console: &mut Console) -> colors::Color { + // ==== print the text with a random color ==== + // get the background color at the text position + let mut text_color = console.get_char_background(SAMPLE_SCREEN_WIDTH/2, 5); + // and invert it + text_color.r = 255 - text_color.r; + text_color.g = 255 - text_color.g; + text_color.b = 255 - text_color.b; + // put random text (for performance tests) + for x in 0..SAMPLE_SCREEN_WIDTH { + for y in 0..SAMPLE_SCREEN_HEIGHT { + let mut col = console.get_char_background(x, y); + col = colors::lerp(col, colors::BLACK, 0.5); + // use colored character 255 on first and last lines + let c = if y == 0 || y == SAMPLE_SCREEN_HEIGHT-1 { + '\u{00ff}' + } else { + let r = self.rng.gen_range('a' as u32, 'z' as u32); + from_u32(r).unwrap() + }; + + console.set_default_foreground(col); + console.put_char(x, y, c, BackgroundFlag::None); + } + } + + text_color + } +} + +impl Render for ColorsSample { + fn initialize(&mut self, console: &mut Offscreen) { + system::set_fps(0); + console.clear() + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + _event: Option<(EventFlags, Event)>) { + self.cycle_colors(); + self.set_colors(console); + let text_color = self.print_random_chars(console); + + console.set_default_foreground(text_color); + // the background behind the text is slightly darkened using the Multiply flag + console.set_default_background(colors::GREY); + console.print_rect_ex(SAMPLE_SCREEN_WIDTH/2, 5, SAMPLE_SCREEN_WIDTH-2, SAMPLE_SCREEN_HEIGHT-1, + BackgroundFlag::Multiply, TextAlignment::Center, + "The Doryen library uses 24 bits colors, for both background and foreground."); + } +} + +struct OffscreenSample { + secondary : Offscreen, + screenshot : Offscreen, + init : bool, + counter : i32, + x : i32, + y : i32, + xdir : i32, + ydir : i32 +} + +impl OffscreenSample { + fn new() -> OffscreenSample { + OffscreenSample { + secondary : Offscreen::new(SAMPLE_SCREEN_WIDTH/2, SAMPLE_SCREEN_HEIGHT/2), + screenshot : Offscreen::new(SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + init : false, + counter : 0, + x : 0, + y : 0, + xdir : 1, + ydir : 1 + } + } +} + +impl Render for OffscreenSample { + fn initialize(&mut self, console: &mut Offscreen) { + if !self.init { + self.init = true; + self.secondary.print_frame(0, 0, SAMPLE_SCREEN_WIDTH/2, SAMPLE_SCREEN_HEIGHT/2, + false, BackgroundFlag::Set, Some("Offscreen console")); + self.secondary.print_rect_ex(SAMPLE_SCREEN_WIDTH/4, 2, SAMPLE_SCREEN_WIDTH/2-2, + SAMPLE_SCREEN_HEIGHT/2, BackgroundFlag::None, TextAlignment::Center, + "You can render to an offscreen console\ + and blit in on another one, simulating\ + alpha transparency."); + } + + system::set_fps(30); + blit(console, (0, 0), (SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + &mut self.screenshot, (0, 0), 1.0, 1.0); + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + _event: Option<(EventFlags, Event)>) { + self.counter += 1; + if self.counter % 20 == 0 { + self.x += self.xdir; + self.y += self.ydir; + if self.x == (SAMPLE_SCREEN_WIDTH/2 + 5) { self.xdir = -1 } + else if self.x == -5 { self.xdir = 1 } + if self.y == (SAMPLE_SCREEN_HEIGHT/2 + 5) { self.ydir = -1 } + else if self.y == -5 { self.ydir = 1 } + } + + blit(&self.screenshot, (0, 0), (SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + console, (0, 0), 1.0, 1.0); + blit(&self.secondary, (0, 0), (SAMPLE_SCREEN_WIDTH/2, SAMPLE_SCREEN_HEIGHT/2), + console, (self.x, self.y), 1.0, 0.75); + } +} + +struct LineSample { + bk_flag: BackgroundFlag, + bk: Offscreen, +} + +impl LineSample { + fn new() -> Self { + let mut line = LineSample { + bk_flag: BackgroundFlag::Set, + bk: Offscreen::new(SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + }; + + for x in 0..SAMPLE_SCREEN_WIDTH { + for y in 0..SAMPLE_SCREEN_HEIGHT { + let col = colors::Color::new( + (x * 255 / (SAMPLE_SCREEN_WIDTH - 1)) as u8, + ((x+y) * 255 / (SAMPLE_SCREEN_WIDTH + SAMPLE_SCREEN_HEIGHT - 2)) as u8, + (y * 255 / (SAMPLE_SCREEN_HEIGHT - 1)) as u8); + line.bk.set_char_background(x, y, col, BackgroundFlag::Set); + } + }; + line + } + + fn next_flag(&mut self, flag_byte: i32) { + let max = BackgroundFlag::Default as i32; + if flag_byte >= max - 1 { + self.bk_flag = BackgroundFlag::None; + } else { + self.bk_flag = unsafe { + std::mem::transmute(flag_byte + 1) + } + } + } + + fn set_alpha(&mut self, elapsed_seconds: f32, flag: BackgroundFlag) { + let alpha = (1.0 + (elapsed_seconds*2.0).cos()) / 2.0; + self.bk_flag = unsafe { + let alpha_value = ((alpha*255.0) as u32) <<8; + let new_flag = flag as u32 | alpha_value; + std::mem::transmute(new_flag) + }; + } +} + +fn seconds_from_duration(duration: Duration) -> f32 { + duration.as_secs() as f32 + (duration.subsec_nanos() as f32 / 1_000_000_000.0) +} + +impl Render for LineSample { + fn initialize(&mut self, console: &mut Offscreen) { + system::set_fps(30); + console.set_default_foreground(colors::WHITE); + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + event: Option<(EventFlags, Event)>) { + let elapsed_seconds = seconds_from_duration(system::get_elapsed_time()); + let flag_byte = self.bk_flag as i32 & 0xff; + if flag_byte == BackgroundFlag::Alph as i32 { + self.set_alpha(elapsed_seconds, BackgroundFlag::Alph); + } + if flag_byte == BackgroundFlag::AddA as i32 { + self.set_alpha(elapsed_seconds, BackgroundFlag::AddA); + } + + blit(&self.bk, (0, 0), (SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + console, (0, 0), 1.0, 1.0); + let rect_y = ((SAMPLE_SCREEN_HEIGHT - 2) as f32 * ((1.0 + elapsed_seconds.cos()) / 2.0)) as i32; + for x in 0..SAMPLE_SCREEN_WIDTH { + let component = (x * 255 / SAMPLE_SCREEN_WIDTH) as u8; + let col = colors::Color::new(component, component, component); + console.set_char_background(x, rect_y, col, self.bk_flag); + console.set_char_background(x, rect_y+1, col, self.bk_flag); + console.set_char_background(x, rect_y+2, col, self.bk_flag); + } + + let angle = elapsed_seconds * 2.0; + let cos_angle = angle.cos(); + let sin_angle = angle.sin(); + let xo = ((SAMPLE_SCREEN_WIDTH / 2) as f32 * (1.0 + cos_angle)) as i32; + let yo = ((SAMPLE_SCREEN_HEIGHT / 2) as f32 + + sin_angle * (SAMPLE_SCREEN_WIDTH / 2) as f32) as i32; + let xd = ((SAMPLE_SCREEN_WIDTH / 2) as f32 * (1.0 - cos_angle)) as i32; + let yd = ((SAMPLE_SCREEN_HEIGHT / 2) as f32 - + sin_angle * (SAMPLE_SCREEN_WIDTH / 2) as f32) as i32; + + let line = Line::new((xo, yo), (xd, yd)); + for (x, y) in line { + if x >= 0 && y >=0 && x < SAMPLE_SCREEN_WIDTH && y < SAMPLE_SCREEN_HEIGHT { + console.set_char_background(x, y, colors::LIGHT_BLUE, self.bk_flag); + } + } + + let display_flag : BackgroundFlag = unsafe { + std::mem::transmute(flag_byte) + }; + console.print(2, 2, format!("{:?} (ENTER to change)", display_flag)); + + if let Some((_, Event::Key(key))) = event { + match key.code { + KeyCode::Enter => self.next_flag(flag_byte), + _ => {} + } + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +enum NoiseFunction { + Perlin = 0, + Simplex, + Wavelet, + FbmPerlin, + TurbulencePerlin, + FbmSimplex, + TurbulenceSimplex, + FbmWavelet, + TurbulenceWavelet, +} + +static VALUES: &'static [NoiseFunction] = &[ + NoiseFunction::Perlin, + NoiseFunction::Simplex, + NoiseFunction::Wavelet, + NoiseFunction::FbmPerlin, + NoiseFunction::TurbulencePerlin, + NoiseFunction::FbmSimplex, + NoiseFunction::TurbulenceSimplex, + NoiseFunction::FbmWavelet, + NoiseFunction::TurbulenceWavelet]; + +struct NoiseFunctionIterator { + val: usize +} + +impl NoiseFunction { + fn iter() -> NoiseFunctionIterator { + NoiseFunctionIterator { val: 0 } + } + + fn from_value(val: u8) -> Self { + match val as usize { + x if x < VALUES.len() => VALUES[x], + _ => panic!("Wrong value to convert to NoiseFunction") + } + } +} + +impl Iterator for NoiseFunctionIterator { + type Item = NoiseFunction; + + fn next(&mut self) -> Option { + match self.val { + x if x < VALUES.len() => { + let retval = VALUES[self.val]; + self.val += 1; + Some(retval) + }, + _ => None, + } + } +} + +static FUNC_NAMES: [&'static str; 9] = [ + "1 : perlin noise ", + "2 : simplex noise ", + "3 : wavelet noise ", + "4 : perlin fbm ", + "5 : perlin turbulence ", + "6 : simplex fbm ", + "7 : simplex turbulence ", + "8 : wavelet fbm ", + "9 : wavelet turbulence ", +]; + +struct NoiseSample { + func: NoiseFunction, + noise: Noise, + dx: f32, + dy: f32, + octaves: u32, + hurst: f32, + lacunarity: f32, + img: Image, + zoom: f32 +} + +impl NoiseSample { + fn new() -> Self { + let noise = Noise::init_with_dimensions(2) + .hurst(DEFAULT_HURST) + .lacunarity(DEFAULT_LACUNARITY) + .init(); + NoiseSample { + func: NoiseFunction::Perlin, + noise: noise, + dx: 0.0, + dy: 0.0, + octaves: 4, + hurst: DEFAULT_HURST, + lacunarity: DEFAULT_LACUNARITY, + img: Image::new(SAMPLE_SCREEN_WIDTH * 2, SAMPLE_SCREEN_HEIGHT * 2), + zoom: 3.0 + } + } + + fn new_noise(&self) -> Noise { + Noise::init_with_dimensions(2) + .hurst(self.hurst) + .lacunarity(self.lacunarity) + .init() + } + + fn draw_noise(&mut self) { + for y in 0..2*SAMPLE_SCREEN_HEIGHT { + for x in 0..2*SAMPLE_SCREEN_WIDTH { + let x0 = self.zoom * x as f32 / (2 * SAMPLE_SCREEN_WIDTH) as f32 + self.dx; + let y0 = self.zoom * y as f32 / (2 * SAMPLE_SCREEN_HEIGHT) as f32 + self.dy; + let mut coords = [x0, y0]; + let value = match self.func { + NoiseFunction::Perlin => + self.noise.get_ex(&mut coords, NoiseType::Perlin), + NoiseFunction::Simplex => + self.noise.get_ex(&mut coords, NoiseType::Simplex), + NoiseFunction::Wavelet => + self.noise.get_ex(&mut coords, NoiseType::Wavelet), + NoiseFunction::FbmPerlin => + self.noise.get_fbm_ex(&mut coords, self.octaves, NoiseType::Perlin), + NoiseFunction::TurbulencePerlin => + self.noise.get_turbulence_ex(&mut coords, self.octaves, NoiseType::Perlin), + NoiseFunction::FbmSimplex => + self.noise.get_fbm_ex(&mut coords, self.octaves, NoiseType::Simplex), + NoiseFunction::TurbulenceSimplex => + self.noise.get_turbulence_ex(&mut coords, self.octaves, NoiseType::Simplex), + NoiseFunction::FbmWavelet => + self.noise.get_fbm_ex(&mut coords, self.octaves, NoiseType::Wavelet), + NoiseFunction::TurbulenceWavelet => + self.noise.get_turbulence_ex(&mut coords, self.octaves, NoiseType::Wavelet), + }; + + let c: u8 = ((value + 1.0) / 2.0 * 255.0) as u8; + let color = colors::Color::new(c/2, c/2, c); + self.img.put_pixel(x, y, color); + } + } + } + + fn draw_rectangle(&self, console: &mut Offscreen) { + console.set_default_background(colors::GREY); + let height = if self.func as u32 <= NoiseType::Wavelet as u32 {10} else {13}; + console.rect(2, 2, 23, height, false, BackgroundFlag::Multiply); + for y in 2..(2+height) { + for x in 2..25 { + let old_col = console.get_char_foreground(x, y); + let color = old_col * colors::GREY; + console.set_char_foreground(x, y, color); + } + } + } + + fn draw_menu(&self, console: &mut Offscreen) { + for cur_func in NoiseFunction::iter() { + if self.func == cur_func { + console.set_default_foreground(colors::WHITE); + console.set_default_background(colors::LIGHT_BLUE); + console.print_ex(2, 2 + cur_func as i32, BackgroundFlag::Set, TextAlignment::Left, + FUNC_NAMES[cur_func as usize]); + } else { + console.set_default_foreground(colors::GREY); + console.print(2, 2 + cur_func as i32, FUNC_NAMES[cur_func as usize]); + } + } + + console.set_default_foreground(colors::WHITE); + console.print(2, 11, format!("Y/H : zoom({:2.1})", self.zoom)); + if self.func > NoiseFunction::Wavelet { + console.print(2, 12, format!("E/D : hurst ({:2.1})", self.hurst)); + console.print(2, 13, format!("R/F : lacunarity ({:2.1})", self.lacunarity)); + console.print(2, 14, format!("T/G : octaves ({})", self.octaves)); + } + + } +} + +impl Render for NoiseSample { + fn initialize(&mut self, _console: &mut Offscreen) { + system::set_fps(30); + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + event: Option<(EventFlags, Event)>) { + self.dx += 0.01; + self.dy += 0.01; + + self.draw_noise(); + blit_2x(&self.img, (0, 0), (-1, -1), console, (0, 0)); + + self.draw_rectangle(console); + self.draw_menu(console); + + if let Some((_, Event::Key(key))) = event { + match key.printable { + '1'...'9' => + self.func = { + let number = key.printable.to_digit(10).unwrap() as u8; + NoiseFunction::from_value(number - 1) + }, + 'e' | 'E' => { + self.hurst += 0.1; + self.noise = self.new_noise(); + }, + 'd' | 'D' => { + self.hurst -= 0.1; + self.noise = self.new_noise(); + }, + 'r' | 'R' => { + self.lacunarity += 0.5; + self.noise = self.new_noise(); + }, + 'f' | 'F' => { + self.lacunarity -= 0.5; + self.noise = self.new_noise(); + }, + 't' | 'T' => if self.octaves < MAX_OCTAVES - 1 { + self.octaves += 1; + }, + 'g' | 'G' => if self.octaves > 1 { + self.octaves -= 1 + }, + 'y' | 'Y' => self.zoom += 0.2, + 'h' | 'H' => self.zoom -= 0.2, + _ => {} + } + } + } +} + +struct FovSample { + px: i32, + py: i32, + recompute_fov: bool, + torch: bool, + map: Map, + dark_wall: colors::Color, + light_wall: colors::Color, + dark_ground: colors::Color, + light_ground: colors::Color, + noise: Noise, + light_walls: bool, + algorithm: FovAlgorithm, + torch_x: f32, +} + +fn clamp(a: f32, b: f32, x: f32) -> f32 { + if x < a { a } else if x > b { b } else { x } +} + +impl FovSample { + fn new() -> Self { + FovSample { + px: 20, py: 10, + recompute_fov: true, + torch: false, + map: create_map(), + dark_wall: colors::Color::new(0, 0, 100), + light_wall: colors::Color::new(130, 110, 50), + dark_ground: colors::Color::new(50, 50, 150), + light_ground: colors::Color::new(200, 180, 50), + noise: Noise::init_with_dimensions(1).init(), + light_walls: true, + algorithm: FovAlgorithm::Basic, + torch_x: 0.0, + } + } + + fn display_help(&self, console: &mut Offscreen) { + console.set_default_foreground(colors::WHITE); + console.print(1, 0, + format!("IJKL : move around\nT : torch fx {}\nW : light walls {}\n+-: algo {:11?}", + if self.torch { "on " } else { "off" }, + if self.light_walls { "on " } else { "off" }, + self.algorithm)); + console.set_default_foreground(colors::BLACK); + } + + fn display_map(&mut self, console: &mut Offscreen, dx: f32, dy: f32, di: f32) { + iterate_map(&mut |x, y, c| { + let visible = self.map.is_in_fov(x, y); + let is_wall = c == '#'; + if !visible { + let color = if is_wall { self.dark_wall } else { self.dark_ground }; + console.set_char_background(x, y, color, BackgroundFlag::Set); + } else { + let mut light: colors::Color; + if !self.torch { + light = if is_wall { self.light_wall } else { self.light_ground }; + } else { + let mut base = if is_wall { self.dark_wall } else { self.dark_ground }; + light = if is_wall { self.light_wall } else { self.light_ground }; + let r = (x as f32 - self.px as f32 + dx) * + (x as f32 - self.px as f32 + dx) + + (y as f32 - self.py as f32 + dy) * + (y as f32 - self.py as f32 + dy); + if r < SQUARED_TORCH_RADIUS { + let mut l = (SQUARED_TORCH_RADIUS - r) / SQUARED_TORCH_RADIUS + di; + l = clamp(0.0, 1.0, l); + base = colors::lerp(base, light, l); + } + light = base; + } + console.set_char_background(x, y, light, BackgroundFlag::Set); + } + }); + } + + fn handle_event(&mut self, console: &mut Offscreen, clo: &mut F) + where F: Fn(&mut FovSample) -> () + { + console.put_char(self.px, self.py, ' ', BackgroundFlag::None); + clo(self); + console.put_char(self.px, self.py, '@', BackgroundFlag::None); + self.recompute_fov = true; + } + + fn next_algorithm(&mut self) { + match self.algorithm { + FovAlgorithm::Restrictive => return, + _ => self.algorithm = unsafe { std::mem::transmute(self.algorithm as i32 + 1) } + }; + } + + fn previous_algorithm(&mut self) { + match self.algorithm { + FovAlgorithm::Basic => return, + _ => self.algorithm = unsafe { std::mem::transmute(self.algorithm as i32 - 1) } + }; + } +} + +impl Render for FovSample { + fn initialize(&mut self, console: &mut Offscreen) { + system::set_fps(30); + console.clear(); + self.display_help(console); + console.put_char(self.px, self.py, '@', BackgroundFlag::None); + iterate_map(&mut |x, y, c| { + if c == '=' { + console.put_char(x, y, chars::DHLINE, BackgroundFlag::None) + } + }); + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + event: Option<(EventFlags, Event)>) { + if self.recompute_fov { + self.recompute_fov = false; + let radius = if self.torch { TORCH_RADIUS as i32 } else { 0 }; + self.map.compute_fov(self.px, self.py, radius, self.light_walls, self.algorithm); + } + + let mut dx = 0.0; + let mut dy = 0.0; + let mut di = 0.0; + if self.torch { + self.torch_x += 0.2; + + let tdx = self.torch_x + 20.0; + dx = self.noise.get(&mut [tdx]) * 1.5; + dy = self.noise.get(&mut [tdx + 30.0]) * 1.5; + di = self.noise.get(&mut [self.torch_x]) * 0.2; + } + + self.display_map(console, dx, dy, di); + + if let Some((_, Event::Key(key))) = event { + match key.printable { + 'i' | 'I' if self.map.is_walkable(self.px, self.py - 1) => { + self.handle_event(console, &mut |s| s.py -= 1); + }, + 'k' | 'K' if self.map.is_walkable(self.px, self.py + 1) => { + self.handle_event(console, &mut |s| s.py += 1); + }, + 'j' | 'J' if self.map.is_walkable(self.px - 1, self.py) => { + self.handle_event(console, &mut |s| s.px -= 1); + }, + 'l' | 'L' if self.map.is_walkable(self.px + 1, self.py) => { + self.handle_event(console, &mut |s| s.px += 1); + }, + 't' | 'T' => { + self.torch = !self.torch; + self.display_help(console); + }, + 'w' | 'W' => { + self.light_walls = !self.light_walls; + self.display_help(console); + self.recompute_fov = true; + }, + '+' => { + self.next_algorithm(); + self.display_help(console); + self.recompute_fov = true; + }, + '-' => { + self.previous_algorithm(); + self.display_help(console); + self.recompute_fov = true; + }, + _ => {} + } + } + } +} + + +struct PathSample<'a> { + px: i32, + py: i32, + dx: i32, + dy: i32, + dark_wall: colors::Color, + dark_ground: colors::Color, + light_ground: colors::Color, + using_astar: bool, + dijkstra_dist: f32, + dijkstra: Dijkstra<'a>, + astar: AStar<'a>, + recalculate_path: bool, + busy: f32, + old_char: char, +} + +const TORCH_RADIUS : f32 = 10.0; +const SQUARED_TORCH_RADIUS : f32 = (TORCH_RADIUS*TORCH_RADIUS); + +static SMAP : [&'static str; 20] = [ + "##############################################", + "####################### #################", + "##################### # ###############", + "###################### ### ###########", + "################## ##### ####", + "################ ######## ###### ####", + "############### #################### ####", + "################ ###### ##", + "######## ####### ###### # # # ##", + "######## ###### ### ##", + "######## ##", + "#### ###### ### # # # ##", + "#### ### ########## #### ##", + "#### ### ########## ###########=##########", + "#### ################## ##### #####", + "#### ### #### ##### #####", + "#### # #### #####", + "######## # #### ##### #####", + "######## ##### ####################", + "##############################################", + ]; + +fn iterate_map(closure: &mut F) where F: FnMut(i32, i32, char) -> () { + for (y, line) in SMAP.iter().enumerate() { + for (x, c) in line.chars().enumerate() { + closure(x as i32, y as i32, c) + } + } +} + +fn create_map() -> Map { + let mut map = Map::new(SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT); + iterate_map(&mut |x, y, c| { + if c == ' ' { map.set(x, y, true, true) } // ground + else if c == '=' { map.set(x, y, true, false) } // window + }); + map +} + + +impl<'a> PathSample<'a> { + fn new() -> Self { + PathSample { + px: 20, py: 10, + dx: 24, dy: 1, + dark_wall: colors::Color::new(0, 0, 100), + dark_ground: colors::Color::new(50, 50, 150), + light_ground: colors::Color::new(200, 180, 50), + using_astar: true, + dijkstra_dist: 0.0, + dijkstra: Dijkstra::new_from_map(create_map(), 1.41), + astar: AStar::new_from_map(create_map(), 1.41), + recalculate_path: false, + busy: 0.0, + old_char: ' ', + } + } + + fn display_map(&mut self, console: &mut Offscreen) { + iterate_map(&mut |x, y, c| { + let wall = c == '#'; + let color = if wall { self.dark_wall } else { self.dark_ground }; + console.set_char_background(x, y, color, BackgroundFlag::Set); + }); + } + + fn recalculate(&mut self) { + if self.using_astar { + self.astar.find((self.px, self.py), (self.dx, self.dy)); + } else { + self.dijkstra_dist = 0.0; + self.dijkstra.compute_grid((self.px, self.py)); + iterate_map(&mut |x, y, _c| { + let d = self.dijkstra.distance_from_root((x, y)); + match d { + Some(d) if d > self.dijkstra_dist => self.dijkstra_dist = d, + _ => {}, + } + }); + self.dijkstra.find((self.dx, self.dy)); + } + self.recalculate_path = false; + self.busy = 0.2; + } + + fn draw_path(&mut self, console: &mut Offscreen) { + if self.using_astar { + for (x, y) in self.astar.iter() { + console.set_char_background(x, y, self.light_ground, BackgroundFlag::Set); + } + } else { + iterate_map(&mut |x, y, c| { + let wall = c == '#'; + if !wall { + let d = self.dijkstra.distance_from_root((x, y)); + if let Some(d) = d { + let color = colors::lerp(self.light_ground, + self.dark_ground, + 0.9 * d / self.dijkstra_dist); + console.set_char_background(x, y, color, BackgroundFlag::Set); + } + } + }); + for (x, y) in self.dijkstra.iter() { + console.set_char_background(x, y, self.light_ground, BackgroundFlag::Set); + } + } + } + + fn move_creature(&mut self, console: &mut Offscreen) { + self.busy = 0.2; + if self.using_astar { + if !self.astar.is_empty() { + console.put_char(self.px, self.py, ' ', BackgroundFlag::None); + let (x, y) = self.astar.walk_one_step(true).unwrap(); + self.px = x; + self.py = y; + console.put_char(self.px, self.py, '@', BackgroundFlag::None); + } + } else { + if !self.dijkstra.is_empty() { + console.put_char(self.px, self.py, ' ', BackgroundFlag::None); + let (x, y) = self.dijkstra.walk_one_step().unwrap(); + self.px = x; + self.py = y; + console.put_char(self.px, self.py, '@', BackgroundFlag::None); + self.recalculate_path = true; + } + } + } + + fn handle_event(&mut self, console: &mut Offscreen, clo: &mut F) + where F: Fn(&mut PathSample) -> () + { + console.put_char(self.dx, self.dy, self.old_char, BackgroundFlag::None); + clo(self); + self.old_char = console.get_char(self.dx, self.dy); + console.put_char(self.dx, self.dy, '+', BackgroundFlag::None); + if SMAP[self.dy as usize].chars().nth(self.dx as usize).unwrap() == ' ' { + self.recalculate_path = true; + } + } +} + +impl<'a> Render for PathSample<'a> { + fn initialize(&mut self, console: &mut Offscreen) { + system::set_fps(30); + console.clear(); + // we draw the foreground only the first time. + // during the player movement, only the @ is redrawn. + // the rest impacts only the background color + // draw the help text & player @ + console.set_default_foreground(colors::WHITE); + console.put_char(self.dx, self.dy, '+', BackgroundFlag::None); + console.put_char(self.px, self.py, '@', BackgroundFlag::None); + console.print(1, 1, "IJKL / mouse :\nmove destination\nTAB : A*/dijkstra"); + console.print(1, 4, "Using : A*"); + + // draw windows + iterate_map(&mut |x, y, c| { + if c == '=' { + console.put_char(x, y, chars::DHLINE, BackgroundFlag::None) + } + }); + self.recalculate_path = true; + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + event: Option<(EventFlags, Event)>) { + if self.recalculate_path { self.recalculate() } + + self.display_map(console); + self.draw_path(console); + + self.busy -= system::get_last_frame_length(); + if self.busy < 0.0 { + self.move_creature(console); + } + + if let Some((_, Event::Key(key))) = event { + match key { + Key { printable: 'i', .. } | Key { printable: 'I', .. } if self.dy > 0 => + self.handle_event(console, &mut |s| s.dy -= 1), + Key { printable: 'k', .. } | Key { printable: 'K', .. } if self.dy < SAMPLE_SCREEN_HEIGHT-1 => + self.handle_event(console, &mut |s| s.dy += 1), + Key { printable: 'j', .. } | Key { printable: 'J', .. } if self.dx > 0 => + self.handle_event(console, &mut |s| s.dx -= 1), + Key { printable: 'l', .. } | Key { printable: 'L', .. } if self.dx < SAMPLE_SCREEN_WIDTH-1 => + self.handle_event(console, &mut |s| s.dx += 1), + Key { code: KeyCode::Tab, .. } => { + self.using_astar = ! self.using_astar; + if self.using_astar { + console.print(1, 4, "Using : A* "); + } else { + console.print(1, 4, "Using : Dijkstra"); + } + self.recalculate_path = true; + } + _ => {} + } + } + if let Some((_, Event::Mouse(state))) = event { + let mx: i32 = state.cx as i32 - SAMPLE_SCREEN_X; + let my: i32 = state.cy as i32 - SAMPLE_SCREEN_Y; + if mx >= 0 && mx < SAMPLE_SCREEN_WIDTH && + my >= 0 && my < SAMPLE_SCREEN_HEIGHT && + (self.dx != mx || self.dy != my) + { + self.handle_event(console, &mut |s| { + s.dx = mx; + s.dy = my; + }); + } + } + } +} + +type CharMap = [[char; SAMPLE_SCREEN_WIDTH as usize]; SAMPLE_SCREEN_HEIGHT as usize]; + +struct BspSample<'a> { + bsp: Bsp<'a>, + generate: bool, + refresh: bool, + map: CharMap, + dark_wall: colors::Color, + dark_ground: colors::Color, + bsp_depth: i32, + min_room_size: i32, + random_room: bool, + room_walls: bool, +} + +fn random_val(mut low: i32, high: i32) -> i32 { + let mut rnd = rand::thread_rng(); + + if low >= high { low -= 1 } + rnd.gen_range(low, high) +} + +impl<'a> BspSample<'a> { + fn new() -> Self { + BspSample { + bsp: Bsp::new_with_size(0, 0, SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + generate: true, + refresh: false, + map: [['#'; SAMPLE_SCREEN_WIDTH as usize]; SAMPLE_SCREEN_HEIGHT as usize], + dark_wall: colors::Color::new(0, 0, 100), + dark_ground: colors::Color::new(50, 50, 150), + bsp_depth: 8, + min_room_size: 4, + random_room: false, + room_walls: true, + } + } + + fn rebuild(&mut self) { + self.bsp.resize(0, 0, SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT); + for row in &mut self.map { + for item in &mut row.iter_mut() { + *item = '#'; + } + } + if self.generate { + self.bsp.remove_sons(); + let rw = if self.room_walls { 1 } else { 0 }; + self.bsp.split_recursive(None, + self.bsp_depth, + self.min_room_size + rw, + self.min_room_size + rw, + 1.5, 1.5); + } + let mut map = self.map; + self.bsp.traverse(TraverseOrder::InvertedLevelOrder, + |mut node| self.visit(&mut node, &mut map)); + self.map = map; + self.generate = false; + self.refresh = false; + } + + fn visit(&self, node: &mut Bsp, map: &mut CharMap) -> bool { + if node.is_leaf() { + self.visit_leaf(node, map); + } else { + self.visit_node(node, map); + } + true + } + + fn visit_leaf(&self, node: &mut Bsp, map: &mut CharMap) { + let mut min_x = node.x + 1; + let mut max_x = node.x + node.w - 1; + let mut min_y = node.y + 1; + let mut max_y = node.y + node.h - 1; + + if !self.room_walls { + if min_x > 1 { min_x -= 1 } + if min_y > 1 { min_y -= 1 } + } + if max_x == SAMPLE_SCREEN_WIDTH - 1 { max_x -= 1} + if max_y == SAMPLE_SCREEN_HEIGHT - 1 { max_y -= 1} + if self.random_room { + min_x = random_val(min_x, max_x - self.min_room_size + 2); + min_y = random_val(min_y, max_y - self.min_room_size + 2); + max_x = random_val(min_x + self.min_room_size - 1, max_x + 1); + max_y = random_val(min_y + self.min_room_size - 1, max_y + 1); + } + + node.x = min_x; + node.y = min_y; + node.w = max_x - min_x + 1; + node.h = max_y - min_y + 1; + + for x in min_x..(max_x+1) { + for y in min_y..(max_y+1) { + map[y as usize][x as usize] = ' '; + } + } + } + + fn visit_node(&self, node: &mut Bsp, map: &mut CharMap) { + let left = node.left().unwrap(); + let right = node.right().unwrap(); + + node.x = min(left.x, right.x); + node.y = min(left.y, right.y); + node.w = max(left.x + left.w, right.x + right.w) - node.x; + node.h = max(left.y + left.h, right.y + right.h) - node.y; + + if node.horizontal() { + // vertical corridor + if left.x + left.w - 1 < right.x || right.x + right.w - 1 < left.x { + // no overlap + let x1 = random_val(left.x, left.x + left.w); + let x2 = random_val(right.x, right.x + right.w); + let y = random_val(left.y + left.h, right.y + 1); + self.vline_up(map, x1, y - 1); + self.hline(map, x1, y, x2); + self.vline_down(map, x2, y + 1); + } else { + // straight vertical corridor + let min_x = max(left.x, right.x); + let max_x = min(left.x + left.w - 1, right.x + right.w - 1); + let x = random_val(min_x, max_x + 1); + self.vline_down(map, x, right.y); + self.vline_up(map, x, right.y - 1); + } + } else { + // horizontal corridor + if left.y + left.h - 1 < right.y || right.y + right.h - 1 < left.y { + let y1 = random_val(left.y, left.y + left.h); + let y2 = random_val(right.y, right.y + right.h); + let x = random_val(left.x + left.w, right.x + 1); + self.hline_left(map, x-1, y1); + self.vline(map, x, y1, y2); + self.hline_right(map, x+1, y2); + } else { + let min_y = max(left.y, right.y); + let max_y = min(left.y + left.h - 1, right.y + right.h - 1); + let y = random_val(min_y, max_y + 1); + self.hline_left(map, right.x - 1, y); + self.hline_right(map, right.x, y); + } + } + } + + fn vline_up(&self, map: &mut CharMap, x: i32, mut y: i32) { + while y >= 0 && map[y as usize][x as usize] != ' ' { + map[y as usize][x as usize] = ' '; + y -= 1; + } + } + + fn vline_down(&self, map: &mut CharMap, x: i32, mut y: i32) { + while y < SAMPLE_SCREEN_HEIGHT && map[y as usize][x as usize] != ' ' { + map[y as usize][x as usize] = ' '; + y += 1; + } + } + + fn vline(&self, map: &mut CharMap, x: i32, y1: i32, y2: i32) { + let mut y = y1; + let dy = if y1 > y2 { -1 } else { 1 }; + map[y as usize][x as usize] = ' '; + if y1 == y2 { return } + loop { + y += dy; + map[y as usize][x as usize] = ' '; + if y as i32 == y2 { break } + } + } + + fn hline(&self, map: &mut CharMap, x1: i32, y: i32, x2: i32) { + let mut x = x1; + let dx = if x1 > x2 { -1 } else { 1 }; + map[y as usize][x as usize] = ' '; + if x1 == x2 { return }; + loop { + x += dx; + map[y as usize][x as usize] = ' '; + if x as i32 == x2 { break } + } + } + + fn hline_left(&self, map: &mut CharMap, mut x: i32, y: i32) { + while x >= 0 && map[y as usize][x as usize] != ' ' { + map[y as usize][x as usize] = ' '; + x -= 1; + } + } + + fn hline_right(&self, map: &mut CharMap, mut x: i32, y: i32) { + while x < SAMPLE_SCREEN_WIDTH && map[y as usize][x as usize] != ' ' { + map[y as usize][x as usize] = ' '; + x += 1; + } + } +} + +impl<'a> Render for BspSample<'a> { + fn initialize(&mut self, _console: &mut Offscreen) { + } + + fn render(&mut self, console: &mut Offscreen, _root: &Root, + event: Option<(EventFlags, Event)>) { + if self.generate || self.refresh { + self.rebuild() + } + + console.clear(); + console.set_default_foreground(colors::WHITE); + console.print(1, 1, format!("ENTER : rebuild bsp\nSPACE : rebuild dungeon\n+-: bsp depth {}\n*/: room size {}\n1 : random room size {}", + self.bsp_depth, + self.min_room_size, + if self.random_room { "ON" } else { "OFF" })); + if self.random_room { + console.print(1, 6, format!("2 : room walls {}", + if self.room_walls { "ON" } else { "OFF" })); + } + + for x in 0..SAMPLE_SCREEN_WIDTH { + for y in 0..SAMPLE_SCREEN_HEIGHT { + let wall = self.map[y as usize][x as usize] == '#'; + console.set_char_background(x, y, + if wall { self.dark_wall } else {self.dark_ground }, + BackgroundFlag::Set); + } + } + + if let Some((_, Event::Key(key))) = event { + match key { + Key { code: KeyCode::Enter, .. } | Key { code: KeyCode::NumPadEnter, ..} => + self.generate = true, + Key { code: KeyCode::Spacebar, .. } => + self.refresh = true, + Key { printable: '+', .. } => { + self.bsp_depth += 1; + self.generate = true + }, + Key { printable: '-', .. } if self.bsp_depth > 1 => { + self.bsp_depth -= 1; + self.generate = true + }, + Key { printable: '*', .. } => { + self.min_room_size += 1; + self.generate = true + }, + Key { printable: '/', .. } if self.min_room_size > 2 => { + self.min_room_size -= 1; + self.generate = true + }, + Key { printable: '1', .. } | Key { code: KeyCode::Number1, .. } | + Key { code: KeyCode::NumPad1, .. } => { + self.random_room = !self.random_room; + if !self.random_room { self.room_walls = true } + self.refresh = true + }, + Key { printable: '2', .. } | Key { code: KeyCode::Number2, .. } | + Key { code: KeyCode::NumPad2, .. } => { + self.room_walls = !self.room_walls; + self.refresh = true + }, + _ => { /* ignore */ } + } + } + } +} + +struct ImageSample { + img: image::Image, + circle: image::Image, + blue: colors::Color, + green: colors::Color, +} + +impl ImageSample { + fn new() -> Self { + let mut i = ImageSample { + img: image::Image::from_file("data/img/skull.png") + .ok() + .expect("Could not load data/img/skull.png"), + circle: image::Image::from_file("data/img/circle.png") + .ok() + .expect("Could not load data/img/circle.png"), + blue: colors::Color::new(0, 0, 255), + green: colors::Color::new(0, 255, 0), + }; + i.img.set_key_color(colors::BLACK); + i + } +} + +impl Render for ImageSample { + fn initialize(&mut self, _: &mut Offscreen) { + system::set_fps(30) + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + _event: Option<(EventFlags, Event)>) { + console.set_default_background(colors::BLACK); + console.clear(); + + let elapsed_seconds = seconds_from_duration(system::get_elapsed_time()); + let x = (SAMPLE_SCREEN_WIDTH/2) as f32 + (elapsed_seconds as f32).cos() * 10.0; + let y = (SAMPLE_SCREEN_HEIGHT/2) as f32; + let scale_x = 0.2 + 1.8 * (1.0 + (elapsed_seconds / 2.0).cos()) / 2.0; + let scale_y = scale_x; + let angle = elapsed_seconds; + let duration = system::get_elapsed_time(); + let elapsed_milliseconds = duration.as_secs() as u32 * 1000 + duration.subsec_nanos() / 1_000_000; + let elapsed = elapsed_milliseconds / 2000; + + if elapsed % 2 != 0 { + // split the color channels of circle.png + // the red channel + console.set_default_background(colors::RED); + console.rect(0, 3, 15, 15, false, BackgroundFlag::Set); + image::blit_rect(&self.circle, (-1, -1), console, (0, 3), BackgroundFlag::Multiply); + // the green channel + console.set_default_background(self.green); + console.rect(15, 3, 15, 15, false, BackgroundFlag::Set); + image::blit_rect(&self.circle, (-1, -1), console, (15, 3), BackgroundFlag::Multiply); + // the blue channel + console.set_default_background(self.blue); + console.rect(30, 3, 15, 15, false, BackgroundFlag::Set); + image::blit_rect(&self.circle, (-1, -1), console, (30, 3), BackgroundFlag::Multiply); + } else { + image::blit_rect(&self.circle, (-1, -1), console, ( 0, 3), BackgroundFlag::Set); + image::blit_rect(&self.circle, (-1, -1), console, (15, 3), BackgroundFlag::Set); + image::blit_rect(&self.circle, (-1, -1), console, (30, 3), BackgroundFlag::Set); + } + + image::blit(&self.img, (scale_x, scale_y), angle, console, (x, y), BackgroundFlag::Set); + } +} + + +struct MouseSample { + left_button: bool, + middle_button: bool, + right_button: bool, + mouse_state: Option, +} + +impl MouseSample { + fn new() -> Self { + MouseSample { + left_button: false, + middle_button: false, + right_button: false, + mouse_state: None, + } + } + + fn format(&self, mouse: &Mouse, root: &Root) -> String { + format!("{}\n \ + Mouse position : {:4}x{:4} {}\n \ + Mouse cell : {:4}x{:4}\n \ + Mouse movement : {:4}x{:4}\n \ + Left button : {} (toggle {})\n \ + Right button : {} (toggle {})\n \ + Middle button : {} (toggle {})\n \ + Wheel : {}\n", + if root.is_active() {""} else {"APPLICATION INACTIVE"}, + mouse.x, mouse.y, + if root.has_focus() {""} else {"OUT OF FOCUS"}, + mouse.cx, mouse.cy, + mouse.dx, mouse.dy, + if mouse.lbutton { " ON" } else { "OFF" }, + if self.left_button { " ON" } else { "OFF" }, + if mouse.rbutton { " ON" } else { "OFF" }, + if self.right_button { " ON" } else { "OFF" }, + if mouse.mbutton { " ON" } else { "OFF" }, + if self.middle_button { " ON" } else { "OFF" }, + if mouse.wheel_up { "UP" } else if mouse.wheel_down { "DOWN" } else { "" }) + } +} + +impl Render for MouseSample { + fn initialize(&mut self, console: &mut Offscreen) { + system::set_fps(30); + console.set_default_background(colors::GREY); + console.set_default_foreground(colors::LIGHT_YELLOW); + move_cursor(320, 200); + show_cursor(true) + } + + fn render(&mut self, + console: &mut Offscreen, + root: &Root, + event: Option<(EventFlags, Event)>) { + console.clear(); + + match event { + Some((_, Event::Mouse(mouse))) => { + if mouse.lbutton_pressed {self.left_button = !self.left_button;} + if mouse.mbutton_pressed {self.middle_button = !self.middle_button;} + if mouse.rbutton_pressed {self.right_button = !self.right_button;} + + self.mouse_state = Some(mouse); + }, + Some((_, Event::Key(Key {code: KeyCode::Number1, ..}))) => { + show_cursor(false); + }, + Some((_, Event::Key(Key {code: KeyCode::Number2, ..}))) => { + show_cursor(true) + }, + _ => {} // Ignore other events + } + + if let Some(mouse) = self.mouse_state { + console.print(1, 1, self.format(&mouse, root)); + } + + console.print(1, 10, "1 : Hide cursor\n2 : Show cursor"); + } +} + +struct NameSample { + sets: Vec, + cur_set: usize, + delay: f32, + names: Vec, + name_gen: Namegen, +} + +impl NameSample { + fn new() -> Self { + let mut n = Namegen::new().unwrap(); + + let entries = read_dir("data/namegen").ok().expect("Could not read data/namegen"); + for entry in entries { + match entry { + Ok(e) => { + let path = e.path(); + let extension = path.extension().unwrap().to_str().unwrap(); + if extension.ends_with("cfg") { + n.parse(&path); + } + }, + _ => {} + } + }; + + NameSample { + sets: n.get_sets(), + cur_set: 0, + delay: 0.0, + names: vec![], + name_gen: n, + } + } + + fn display_names(&self, console: &mut Offscreen) { + console.set_default_background(colors::LIGHT_BLUE); + console.clear(); + console.set_default_foreground(colors::WHITE); + console.print(1, 1, format!("{}\n\n+ : next generator\n- : prev generator", + self.sets[self.cur_set])); + for (i, name) in self.names.iter().enumerate() { + if (name.len() as i32) < SAMPLE_SCREEN_WIDTH { + console.print_ex(SAMPLE_SCREEN_WIDTH - 2, 2 + i as i32, + BackgroundFlag::None, TextAlignment::Right, name) + } + } + } + + fn limit_names(&mut self) { + while self.names.len() >= 15 { + self.names.remove(0); + } + } +} + +impl Render for NameSample { + fn initialize(&mut self, _: &mut Offscreen) { + system::set_fps(30); + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + event: Option<(EventFlags, Event)>) { + self.limit_names(); + self.display_names(console); + + self.delay += system::get_last_frame_length(); + if self.delay >= 0.5 { + let name = &self.sets[self.cur_set]; + self.delay -= 0.5; + self.names.push(self.name_gen.generate(name).unwrap()) + } + + if let Some((_, Event::Key(key))) = event { + match key.printable { + '+' => { + self.cur_set = (self.cur_set + 1) % self.sets.len(); + self.names.push("======".to_owned()); + }, + '-' => { + if self.cur_set == 0 { + self.cur_set = self.sets.len() - 1 + } else { + self.cur_set -= 1; + } + self.names.push("======".to_owned()); + }, + _ => {}, + } + } + } +} + +struct MenuItem<'a> { + name: String, + render: &'a mut Render +} + +impl<'a> MenuItem<'a> { + fn new(name: &str, render: &'a mut Render) -> Self { + MenuItem { name: name.to_owned(), render: render } + } +} + +impl<'a> Render for MenuItem<'a> { + fn initialize(&mut self, console: &mut Offscreen) { + self.render.initialize(console); + } + + fn render(&mut self, + console: &mut Offscreen, + _root: &Root, + event: Option<(EventFlags, Event)>) { + self.render.render(console, _root, event); + } +} + +struct Options { + fullscreen_width: i32, + fullscreen_height: i32, + font: String, + font_type: FontType, + font_layout: FontLayout, + nb_char_horiz: i32, + nb_char_vertic: i32, + fullscreen: bool, + renderer: Renderer, +} + +impl Options { + fn new() -> Self { + Options { + fullscreen_width: 0, + fullscreen_height: 0, + font: "consolas10x10_gs_tc.png".to_owned(), + font_type: FontType::Greyscale, + font_layout: FontLayout::Tcod, + nb_char_horiz: 0, + nb_char_vertic: 0, + fullscreen: false, + renderer: Renderer::SDL, + } + } +} + +fn main() { + let mut colors = ColorsSample::new(); + let mut offscreen = OffscreenSample::new(); + let mut mouse = MouseSample::new(); + let mut path_sample = PathSample::new(); + let mut fov = FovSample::new(); + let mut image_sample = ImageSample::new(); + let mut names = NameSample::new(); + let mut line = LineSample::new(); + let mut noise = NoiseSample::new(); + let mut bsp = BspSample::new(); + let mut samples = vec![MenuItem::new(" True colors ", &mut colors), + MenuItem::new(" Offscreen console", &mut offscreen), + MenuItem::new(" Line drawing ", &mut line), + MenuItem::new(" Noise ", &mut noise), + MenuItem::new(" Field of view ", &mut fov), + MenuItem::new(" Path finding ", &mut path_sample), + MenuItem::new(" Bsp toolkit ", &mut bsp), + MenuItem::new(" Image toolkit ", &mut image_sample), + MenuItem::new(" Mouse support ", &mut mouse), + MenuItem::new(" Name generator ", &mut names), + // MenuItem::new(" SDL callback ", &mut ), + ]; + let mut cur_sample = 0; + let mut options = Options::new(); + let mut console = Offscreen::new(SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT); + + parse_args(&mut options); + + if options.fullscreen_width > 0 { + system::force_fullscreen_resolution(options.fullscreen_width, + options.fullscreen_height); + } + + let mut root = Root::initializer() + .size(80, 50) + .title("libtcod Rust sample") + .fullscreen(options.fullscreen) + .renderer(options.renderer) + .font(options.font, options.font_layout) + .font_type(options.font_type) + .font_dimensions(options.nb_char_horiz, options.nb_char_vertic) + .init(); + + let mut credits_end = false; + while !root.window_closed() { + if !credits_end { + credits_end = root.render_credits(60, 43, false); + } + + print_samples(&mut root, cur_sample, &samples); + print_help_message(&mut root); + + let event = check_for_event(KEY_PRESS | MOUSE); + samples[cur_sample].render(&mut console, &root, event); + + blit(&console, (0, 0), (SAMPLE_SCREEN_WIDTH, SAMPLE_SCREEN_HEIGHT), + &mut root, (SAMPLE_SCREEN_X, SAMPLE_SCREEN_Y), 1.0, 1.0); + + // erase the renderer in debug mode (needed because the root + // console is not cleared each frame) + root.print(1, 1, " "); + root.flush(); + + if let Some((_, Event::Key(key))) = event { + match key.code { + KeyCode::Down => { + cur_sample = (cur_sample + 1) % samples.len(); + samples[cur_sample].initialize(&mut console); + }, + KeyCode::Up => { + if cur_sample == 0 { + cur_sample = samples.len() - 1; + } else { + cur_sample -= 1; + } + samples[cur_sample].initialize(&mut console); + }, + KeyCode::Enter if key.left_alt => { + let fullscreen = root.is_fullscreen(); + root.set_fullscreen(!fullscreen); + }, + KeyCode::PrintScreen => { + // TODO + }, + KeyCode::Escape => break, + _ => {}, + } + } + } +} + +fn print_samples(root: &mut Root, cur_sample: usize, samples: &[MenuItem]) { + for (i, sample) in samples.iter().enumerate() { + if i == cur_sample { + root.set_default_foreground(colors::WHITE); + root.set_default_background(colors::LIGHT_BLUE); + } else { + root.set_default_foreground(colors::GREY); + root.set_default_background(colors::BLACK); + } + let y = 46 - (samples.len() - i); + let fun = &sample.name; + root.print_ex(2, y as i32, BackgroundFlag::Set, TextAlignment::Left, fun); + } + +} + +fn print_help_message(root: &mut Root) { + root.set_default_foreground(colors::GREY); + root.print_ex(79, 46, BackgroundFlag::None, TextAlignment::Right, + format!("last frame : {:3.0} ms ({:3} fps)", + system::get_last_frame_length() * 1000.0, + system::get_fps())); + + let time = system::get_elapsed_time(); + let millis = time.as_secs() as u32 * 1000 + time.subsec_nanos() / 1_000_000; + root.print_ex(79, 47, BackgroundFlag::None, TextAlignment::Right, + format!("elapsed {:8}ms {:4.2}s", + millis, + millis as f32/ 1000.0)); + + root.print(2, 47, format!("{}{} : select a sample", + chars::ARROW_N, chars::ARROW_S)); + + let fullscreen_text = if root.is_fullscreen() { + "windowed mode" + } else { + "fullscren_mode" + }; + + root.print(2, 48, format!("ALT-ENTER : switch to {}", fullscreen_text)); +} + +fn parse_args(options: &mut Options) { + let mut args = std::env::args(); + + while let Some(opt) = args.next() { + match opt.as_ref() { + "-font" => { + if let Some(font) = args.next() { + options.font = font; + } + }, + "-font-nb-char" => { + if let (Some(h), Some(v)) = (args.next(), args.next()) { + options.nb_char_horiz = h.parse().ok().unwrap(); + options.nb_char_vertic = v.parse().ok().unwrap(); + } + }, + "-fullscreen-resolution" => { + if let (Some(w), Some(h)) = (args.next(), args.next()) { + options.fullscreen_width = w.parse().ok().unwrap(); + options.fullscreen_height = h.parse().ok().unwrap(); + } + }, + "-fullscreen" => options.fullscreen = true, + "-font-in-row" => options.font_layout = FontLayout::AsciiInRow, + "-font-greyscale" => options.font_type = FontType::Greyscale, + "-font-tcod" => options.font_layout = FontLayout::Tcod, + "-renderer" => { + if let Some(renderer) = args.next() { + match renderer.parse::().ok() { + Some(0) => options.renderer = Renderer::GLSL, + Some(1) => options.renderer = Renderer::OpenGL, + Some(2) => options.renderer = Renderer::SDL, + _ => { + println!("Invalid renderer"); + std::process::exit(1) + } + } + } + }, + "-help" | "-?" => { + println!("options :"); + println!("-font : use a custom font"); + println!("-font-nb-char : number of characters in the font"); + println!("-font-in-row : the font layout is in row instead of columns"); + println!("-font-tcod : the font uses TCOD layout instead of ASCII"); + println!("-font-greyscale : antialiased font using greyscale bitmap"); + println!("-fullscreen : start in fullscreen"); + println!("-fullscreen-resolution : force fullscreen resolution"); + println!("-renderer : set renderer. 0 : GLSL 1 : OPENGL 2 : SDL"); + std::process::exit(0) + }, + _ => {}, + } + } +} diff --git a/tcod/examples/shapes.rs b/tcod/examples/shapes.rs new file mode 100644 index 00000000..0cd4f6ac --- /dev/null +++ b/tcod/examples/shapes.rs @@ -0,0 +1,26 @@ +extern crate tcod; + +use tcod::{Console, RootConsole, Color, BackgroundFlag}; + +fn main() { + let mut root = RootConsole::initializer() + .size(80, 50) + .title("Example of libtcod's special chars") + .init(); + + root.clear(); + + root.set_default_background(Color{r: 255, g: 0, b: 255}); + + root.rect(5, 5, 10, 5, false, BackgroundFlag::Set); + + root.horizontal_line(30, 2, 15, BackgroundFlag::Default); + root.vertical_line(28, 4, 9, BackgroundFlag::Default); + root.horizontal_line(30, 14, 15, BackgroundFlag::Set); + root.vertical_line(46, 4, 9, BackgroundFlag::Set); + + root.print_frame(15, 25, 35, 10, false, BackgroundFlag::Set, Some("Hello World!")); + + root.flush(); + root.wait_for_keypress(true); +} diff --git a/tcod/examples/text.rs b/tcod/examples/text.rs new file mode 100644 index 00000000..169cf90c --- /dev/null +++ b/tcod/examples/text.rs @@ -0,0 +1,22 @@ +extern crate tcod; + +use tcod::{Console, RootConsole, BackgroundFlag, TextAlignment}; + +fn main() { + let mut root = RootConsole::initializer().size(80, 50).title("Displaying text").init(); + + root.print_ex(1, 1, BackgroundFlag::None, TextAlignment::Left, + b"Ascii text aligned to left.\xf8"); + root.print_ex(78, 1, BackgroundFlag::None, TextAlignment::Right, + "Unicode text aligned to right.\u{f8}"); + root.print_ex(40, 15, BackgroundFlag::None, TextAlignment::Center, + "And this bit of text is centered."); + root.print_ex(40, 19, BackgroundFlag::None, TextAlignment::Center, + "Press any key to quit."); + + let wrapped_text = "This text is wrapped to form X lines: https://xkcd.com/688/"; + let lines = root.get_height_rect(10, 25, 22, 10, wrapped_text); + root.print_rect(10, 25, 22, 10, wrapped_text.replace("X", &lines.to_string())); + root.flush(); + root.wait_for_keypress(true); +} diff --git a/tcod/fonts/README.txt b/tcod/fonts/README.txt new file mode 100644 index 00000000..0148b44b --- /dev/null +++ b/tcod/fonts/README.txt @@ -0,0 +1,36 @@ +This directory contains antialiased fonts for libtcod. +These fonts are in public domain. + +The file names are composed with : +__.png + : aa 32 bits png with alpha channel + gs 24 bits or greyscale PNG + : as standard ASCII layout + ro standard ASCII layout in row + tc TCOD layout + +The terminal8x8 font is provided is every possible format as en example. +You can try them with the provided samples : + +./samples_c -font fonts/terminal8x8_aa_as.png -font-nb-char 16 16 +./samples_c -font fonts/terminal8x8_aa_ro.png -font-nb-char 16 16 -font-in-row +./samples_c -font fonts/terminal8x8_aa_tc.png -font-nb-char 32 8 -font-tcod +./samples_c -font fonts/terminal8x8_gs_as.png -font-nb-char 16 16 -font-greyscale +./samples_c -font fonts/terminal8x8_gs_ro.png -font-nb-char 16 16 -font-greyscale -font-in-row +./samples_c -font fonts/terminal8x8_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod + +The libtcod 1.3.2 (non antialiased) terminal font is still there and still works : +./samples_c -font terminal.png -font-nb-char 16 16 + +All other fonts are provided only in gs_tc format (greyscale, TCOD layout). +To try them : + +Terminal fonts with different size (you can use them as template to create new fonts) : +./samples_c -font fonts/terminal7x7_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod +./samples_c -font fonts/terminal10x10_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod + +Custom fonts : +./samples_c -font fonts/caeldera8x8_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod +./samples_c -font fonts/lucida8x8_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod +./samples_c -font fonts/celtic_garamond_10x10_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod +./samples_c -font fonts/dundalk12x12_gs_tc.png -font-nb-char 32 8 -font-greyscale -font-tcod diff --git a/tcod/fonts/arial10x10.png b/tcod/fonts/arial10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..64691f1bbd47ca4f7346f8d502efccfb8a325ece GIT binary patch literal 14870 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 i%m0rr=&oN{Bjy3Cx-_~ooA8ktL{VNr{gP literal 0 HcmV?d00001 diff --git a/tcod/fonts/arial8x8.png b/tcod/fonts/arial8x8.png new file mode 100644 index 0000000000000000000000000000000000000000..b05f533ea72e9ba4a73176dba1391b7f8e9ce90b GIT binary patch literal 11559 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 Or1V5h?xT!Z=>Gs2E+Ah3 literal 0 HcmV?d00001 diff --git a/tcod/fonts/celtic_garamond_10x10_gs_tc.png b/tcod/fonts/celtic_garamond_10x10_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0bc4a0f4f808d11e82cbfa5a3e11f93d917ee2 GIT binary patch literal 8558 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

F4AUuIr>SlugWfa zas&1}XX+iV>u9C%3&8ceRPAZ#larz0;V?f~wCs6&W@fZq$3sYu;L`3c@#KIp_8T%v zN=w1i`}gk$DC9PQ4P5 zO^xgte*mwtz)u7^bL}Z2D*9`BnwBVR!`Res-;WFX-^$8;3JMB3x{UO6JHb={Q(z;4 zgMtFWr86EocUuT%K6b{;R!S2_7EVBj=bPO@EpqYwckP3{10{31czfFT<;xel=?VaU z09g)zRbWdjZf}?1;K28#00iVP*FaoEt!8N0<}fGfM1Hefn4O%IBw+FS^=nacR1_d( z`loJN8$;>dZCPwCX#tkHC|e-E6$amG92X_tRqFWz9b{KZ33%S@f9L1naSGrf7Xo%= z_r8<4IrF&~P)c`CPrSb}X~Nly=2@-s4OK$+PSfoJ*J;^{9Byaf;uQ;=`p~F}ZUBsHnHM7mRDrBW{&OZ7wb@5s{IBr~m%_ z1HL62j9gHEZAOlkmRjoS|M^r^)e&$Y*Voq(5d?gEm1s2jckP?t&o2=lz?w=+cK{CU z{QYZYW(M5h>eg11?}ZE4x|w7}1%>vz+pAzaQg0uhj+0;dz#L%V5@ASa=!?D9(<_xY$uwM{%XEt{(Wj+3&_%N~&w$@2thNC#=4%4jjo2pZ`VVsrBtL zsecn-6|h0!jDGLde#8ryqpW~k9O7fW^Z_$w8}296>t zR5Vp-XlMwWFA|B2;^M2Pr)e#fj3vUwdK^Olh4Rx70nYyQ>(>VNQPtwgg55UNn1k-t z@LHqh&t09NjWyricn}K+rqbZ;z!ErrR)a#1w@f|jRNx~9dnb&;Yurv}yJ{+!n#^Y$ z^8^&y+`oVJng$2wN7;A2yR-Gp%}<$@fF&Nc5KQ{~88|SmOAK4>jmFwqMI=%RQw50( zMAK2-gTG?R`@SN@RZXFR1M$=v)}Fr`3?-xn;sNgGEHZ`y-C$3qrnGpRVpx#F!^6OQ z1G`ukU5(+ynC&SORM;M-kY%O}&uBg4a|2L~5di+5QW8UL1+Mq4}` zMG|8@>i2-10+|DjO#>k9WCms+A!B*cjLZVwRvR=(fs=Ix<~DDUj+%EzLt?<)+=1D_ z!K)1j(rc%@@$z(6v9N^4W)}4dws-f;cbE-1{v)2*=WOo}2uti)jLB#>{{C$SttJ=C zu=}S)dlfr9TbRCmeRXGt@X{efrSRqDq{^|XzSmS?HTM^j>Jmrh?B`hwkQjiYZov+3^VH~Z- zz9=Xt_^(=dd3ohx=ziB&5*k{7JD6q)ii$@^N3I?odsC&_2n1$WwQiHsvhm&J^lD#h z$JJg7*u&G)Q}Bl_*4dC72Di1n2kH#u+fouXSJI1Bx(fU_060bvI~u)s)tXWTM2Hum=ITVSR4TaSh(i#42$pF1se0)z2f zT>Mvs;nh-CFcuz3)3TX2C*JRYkv*kAUug@-ViN1uv?=H>k<3YEFxpDpRaXg0cLi1=6RhGADfB zbES-(u17Iph$DFNXMUc)zNiSgNO%&w?--RDA|=aT!{G2QRQ)r> zx+=66^~?!nO+Q{4(~A$^!gV^{8nfLi?oz&prWG6A?FaLmAMxL+`DgHUapPikuvD2g zuNa~&eV#vhxE9S{^Kr^`aSDCq+jJmGHqLfTvBb!2Mc z3#?$WqelQw1*&91W00=yrnt^h{ul@)B4g2Dj?T3zPftTTy{-qH1FaTXwE6nhEq z;bd`;wrHUH;(pgOui%5W8XDyD-xvPtA5zuo2-PKQ2nD-K!Z>l<4{t&)#T@g#vCY=^&v=_os8tb2cs zxzdm_F)S>0WM&QGsQiZW%R!m2q|2-xcBDGoBGPAY9?#;taLF)S%sXQXWh`z&%(=B z2=rS7^t~d*G~e;l`O(oTpR>1q-gUGu0%J*)97&TGF82y%TD^pt#?cDQ)3 z^c6alti_k!VED4QTT^0~m5tItb~~EEY^$hHNnQtI?uE?`bD>2dPJ(ZYnY2nr^s z>yROQeSMvFu*M{r(}=Kj)M9T=gp~ekTeKY+8tA8K_?oA?#IVTE-4L=R zK`7krR~f_)k5!g!cpXHJ^}1Ui2t6<#z%F_7(+pekLmN?XR#q0878S?l*9nq#1#OwR z@$nJLyys)N9}8466`-b%IVM}t_vQkWF;F37-Qf+aA@97sgN}rvl~c|%m-qKaittlj zpYVf(e&QuY3A5g7-ES_ea27Zm(#w)|&ukK->Z)rWP`#AB`d2NhvP#1iT=k=`#;eL+ z-ri<^0sBJXgw(uib3{8(a+&*iAxE^B@HLQi4;H70USZsCS;@fY%j9o-JKrQ#h-nIb zJUPD2+}zxGRi+$L`B938cWcJ)d>QZDb*e-w4zjY2S-+}Zg*!iDBWW*y*1{FQ-sXcA zgJ$`zI`SRz$?^dmsd1B2pmEt8tBIav4o{h208K|E6%XbMhvU=7fC3TF1wHM_a)ku! zT$)r$JS?;Ek|y4d2RAPKE^G37XBeE2008PN$eiPsyIjzGCDzA00mQ*4M3|CeIH}Lc zs7PSKQ-MA_-cObwCEAl^h%HUu4~#VRm94@RMV`GxzVeD?1R*1l)O_O^G<6TOc8K0T zG#_y~=MUVv?o@f%usu=uk~k(Nrf5wJ7Tt+)^k+F0bH?g`Nix|oZ|t$x;TqV=F0ml$ zu3fGlvPa2eO%xcs5fpt20-7}}ND#N48}%OD0ShhS>P&NYk6CuKvD%E%zl zla@Bp-nMynX z83OPegD>OC>PE69y;Pw60|Qq)_LxrNJzP`R&D6vlWeQL@@XW83p1wnyfJp+ztgNgo zFcRfmyj)zXT522S`wMN`+uL}g3~PC%Ijn%mJc)6!O1f+`wX{UU#5$@fLEUNS>z7V! zgQx22>VD*X_JFsbx%qOT&F8^`2k!3f$2#t~CNrAa+IX8Dx3{-^b`e2g#tC1+xDxk0 zM}t&(uEAjdfOdaBFfW?ob%kdOS<2bK4tE7KUbkb*LW@*!T_3{gdU0OboAid3sAN$r zuRY*@JO5Y)Q^IqP&T#{R#{;(BBo9cF*V7YFE$6Q;UqLz?A2p}k9&bbj1tM&jNnFA7u}74bwp z@zy_2-fubb}?KYx1XGxe9S4cp{{U~D8s7D^>G@iE8g;+ zhh&y*pjPPg_LnimCI#IF9j3z)6m8UJt;AF;O8iEtVvY>i5bkKN!!Ufj0{TMLY^#Uf zW`2)9nZMrJ+OoE2^Vpj&Zb~mcSO|#&kaazT{Yp}Z=<#;|Lk*uoD~gNN#bFR~!Uc(V zI87E&POXzDINYB<&GxhnK)kEO0if#cfVhXezFfaiP*f*@g_u^9D6-S6>zJaEN#;f< zBVwS2h+XSi(y+y2XmK%{eF?n&iHnN^ckrs<#}9eoUEEP>&76HVP8yTk+$k^)`SHsn z0?_;~y}h3@NC$E!rl#We1PMWa>5YDESyvsvf&>j}BJsp^L&;&amZ2Yhwll4|TSq_0 zgNcQeN)+V|;67Ql%HKjed-=0xfjIoXuy6riI`Ul(1ChEuYLmCdCdIq9+0)VW6}Me>GZ-?8*7Z zh1uDX>7A~U7|24Dmhkhbos+8X2wYjyfI}iU_PiR$;fQT63Md0!n0sCS9!TnQCsEO~ z2Of`P#c}6by)<6phFKkzO3dg5a**2opd|iCW8}6uoM|!|xf++API#YVi-Nz3>pgpN zF*yy@EEPTE^e>p8>$_`Yz;VIh@Y&TURJw4$AEuBp{YI5)D`MWV)>gWo-K?ApVCI03 zN=pf3K_GFePfR4QP3Y#p@}uW3jfjr6q+lIL=E350MX7xIKU`N3Svx8zjzn$xd6KV zJ`3=N&`F!h_q8XSLHyll@b!~m3&Ob^RNxbI|47#J+GB%1N;&rxY#5}8|KIC+!;}^I-`mf}SBaLo1}PL|TT)f=Ed9TJ{b#g+TdyNm zgFpiJV($pAf#j|(Ep>i}0FK>yz+DH@qxyQ0cW30m51IZ?7h1pT4hy?i$BK&8stA05 O0s|?dB3*$n3Hl#-2bk~x literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas10x10_gs_tc.png b/tcod/fonts/consolas10x10_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9b913f28dbce3fa4154eb91898de8fffe9cb75 GIT binary patch literal 8651 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 HT7>)$K!AdZ literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas12x12_gs_tc.png b/tcod/fonts/consolas12x12_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..4789d02f613babb4bcf0cda5c9c0aecf88e71253 GIT binary patch literal 8204 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas8x8_gs_tc.png b/tcod/fonts/consolas8x8_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..fab3c4c3f4a4275590492121891190f0ae4ae3fd GIT binary patch literal 5936 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 ZjC@6X#%rvnyZwRyT55W#RS?_o{{cn@EtCKN literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas_unicode_10x10.png b/tcod/fonts/consolas_unicode_10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e824cb64312803a9314acc0adaa48b3e55fbf8 GIT binary patch literal 24558 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas_unicode_12x12.png b/tcod/fonts/consolas_unicode_12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..608b28c00d296bfa496d313a2fa7032e4c5eb7b8 GIT binary patch literal 30673 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

XL}klIw2>vdp)pK--3uO%wFs^-ToVX zDI%lCCLNDpN?#wh&NsWe^|I_DELInxIaIy? zvq_!>vZLbY=CTf=;@Qb$Wnqg4#C<`@w(3=%SO&ks43d#DEtAabz@X}(t1cZsziq4d z&DHPU-78J4sp^$YU6NJbHZgu@s#F2J4Zd4yrT;@&sy=_j^WFuHzAGGlX|BAnd?G`R zd~by0t!B#Tnu(PY<2M5T5aCK^t4xl|TX#8J$P#uFw|k2UH%lq2{8^GjM+uEo$;k41 zqa$+$hlDu306olID!fd*8@93jYFC&WnISKpOL8P0DzNz3k1jPg8P>4ge-fyd(>jeCBA3?4klc;|Ua>7>m}3^U*(0g{Bj|4WYJpN955caLif z?y>{+F;3TuI+2l&w=AYwUk-B>N5k#-@w}knwY35bMt9}T$D3Y`{QFRKTNEGFII4Do zCCTcN^hV!p8KXxjB3}lyyzkvRZP`)6x7kiLxx#4qi)l;i68y$3cv`XmwnM`tl$9Y*Pt{Ex3| z-fW2wD2|#$F9uxpH~3@2tr5}kJO>dH16tg)VBR29siuQ^wOAnk9?r_VsuBgFP8oN&wM`jzZ@90NumtW|d(yR7!R_6W0`c;jJ&%O4?YIFRQhF&?ZE?Q1Ji>8<4 zs-ipEPePl`nQeAmbe*Fr%x!7Gs-!*VwXFl8&eZ zJ^b+G<6_Jl0y4xS*SD_F>7<_cEefHb2VT);r^duDPkgOp_b#cHiN7;Iu ziUbzls^h=kOgd?7?8+T(cq>aBl(3iJBagK0`Rk!(#&U=RKb{`*(HZV=oxrRH+$i)t z&esFcM|&wNkltXXs2@g8xOSlTA91-94_!hSPD-Yl&7O0N}^f5jFS2}4iSXVg3D<1v}+{m!zieJzq#c5-CyA8TZw!vsdMVkzA!@|RTJ8xbFnM$ zrV`U0)28`N^|A1Qr~qVZ2!H5^)wK8(q2wqXX1k%I*DOTO>%F;gzb(ZDJ9U@~B)$lIWKxUYkC6QGEt(N?&T8F_?s#{Ni{XVU?Pu zc2uoLRLP$4zP&~xQ_MZ(PPI8H!sFGILS;4QYtFK>Y?xJkl7CQ8wcF+RSwH-71mQoZ zr*&7lUB1Z3G_wE#q;h_h_2f2@{4?@#Vn_prs7e`j6=sLD5I>~JlMs8iFDyS{!*Bn` zgZn?8%^LTUwbu+CNF+fU_7w^i>4R7o03yuGzI$gO;k7SpX%4$B2`^|MY-mY|Q;eCa zh>y;Ymb0D7mhZ8E`b~PovDv_82!Vr)u$BE^V=12>)4C{~k1g`!*HUyfW6br>6;L^3 zQIJrf|8S~-Hs&qebRQsg#t2Flh7POsK{^#`CrScpN8^`}JJOD5AavEr IRjkAQA1Uv0bpQYW literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas_unicode_16x16.png b/tcod/fonts/consolas_unicode_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ee8aba5d1934d7f5cecfcfa944f1a6c6316f48 GIT binary patch literal 42003 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

70ZlZ0!*7v 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

1Xv>s*SNRk}0uhJGRJsgCwXNkN9z) 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/consolas_unicode_8x8.png b/tcod/fonts/consolas_unicode_8x8.png new file mode 100644 index 0000000000000000000000000000000000000000..6716f3dd51b7c9c1b3115a5f5451993d5e314b5e GIT binary patch literal 50472 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


{F4Go7QBPpM(ub0GSs9_3mdyw>b1YF$D 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/courier10x10_aa_tc.png b/tcod/fonts/courier10x10_aa_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..50498e3ecbc1070c426fd89d4e71e3b15ec0bf4c GIT binary patch literal 11760 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/courier12x12_aa_tc.png b/tcod/fonts/courier12x12_aa_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c4555d9cf0751f8b24b8650ed77744a8efd772 GIT binary patch literal 11935 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/courier8x8_aa_tc.png b/tcod/fonts/courier8x8_aa_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..675a743d2f6d1c9176c5c1284ccff80b3b58ae32 GIT binary patch literal 9126 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 LvQ(9XN#OqhJ}X_7 literal 0 HcmV?d00001 diff --git a/tcod/fonts/dejavu10x10_gs_tc.png b/tcod/fonts/dejavu10x10_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3adbe8661bf28ac1199ce662588fa4d9317162 GIT binary patch literal 8439 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/dejavu16x16_gs_tc.png b/tcod/fonts/dejavu16x16_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..347df6432641d9a0bbacd61cb21c10c7805c89da GIT binary patch literal 12140 zcmcI~hg%a*)b7$jq$#~f6%gstdoR*NdIu3{h9ZO}kSHAl1QZaY2uLr|dsmPe5kiO1 zBOoBXCwKXM&%J-a{q}iwb|%@)%+8rP=Y8Lkm?!$0WVaY^0RTXzt)=!90C2%704F8{ z%Mi0MQt(3JrDfp*0Hk+sP8=ZPGd%#@GH_K@ee%S`)7R6-#nX#TTUC|K>y_sV*OyKJ z5HOo%yrk}ad zcnJyccQl6lw_|Tj6Rol5C4}Wi#|~aDzs`4`Y&+c;!PHMFpvw=lY7sVgYX=Gc&<^ zyrbH552+;_a2+y~1bYHMF^IkqqgXl|27ufo8t`oouLDNOD@R8q5*o=pjimUxyP={?E2+-sNB`*@lwYM*BeorH=6ioOFhF!x?hdkNdx|&sR|Vmv{;&ap0Sq z0?z9sfnpm+yb~QBN^{??l~VvXX!Y!#;3dX`yM!$x{IPqA*P6Na0r(5;WN!elRpSyg z9;{XDCk6nu+&6sRl$nmY>G`_|nY#(*yGgI?CBjv>zW1n5s@!@GXMSb>p!}^0Z{)}~ z7Cw8S2_+V>E<=~d6fbhY9+M_=c`u3!2jc8*-nKU+_{u+t?>ey0M&mq-HRntqru!6e z#@?-ketTCI37R!PBD_rR)YmJs9*`I*u+pEYnO_2|8Y7FHk zZr7_e7fUjRYvhssdhRQdkw}}H`Ri33qx?IGFX&%oE)=tg3ab6WU4Q6_9({i)EZEnp zQZ2<#lHxd2%~5{4tdH@VX*phN%&{Y)+8_VU8}%*{34DJQHivu4TIRau`qNs)Y|LC@ zRI?7R*;M44;xb57n#yemZcI$HI+B-fo7RZ*Vi_qf{C z1;)Sc{MPvG@sx9uza&#ki;**BVD`Ct4UzN*ezu1{Bi6FkdejRvAVW-xY&qNRNckYU_Nh z$on|X=tAdm>RR>3w}ooq<30VfUuM6DHZ}jG{lPo(zfBfN6V@N?%*&8TPekv`;7?zb zu3N}39>>scEG#LqosRxQ@yXM~oUef|m?mlP*2l*mxj!=T2^p7^7M3oSlA0Wv3>hbu z*cydYYM4ASS}h@&NG&rd&3dwJ#AM`LB3m3)>Rjw;tXL3gaUDZw(W~2Qpju#Z8Yx%xa$=et4lsw3_aH z_SsjT1kGENb{HDFNWJ%9Yv*;RJG|C5LPYP7cuu;gzjZfJ7Su357zwAgKE^N6sNw)kppVrf&WQIS<~f3mfrwTP;y zSwBU;EPK+q_uGEMKto9*!?*Qm!nw)@NJEH&^D{c<#vhfvyD9A{AuS>C*YZSUQ8VOa zES4;xK6S6CWlUujGe$q}Du(@Yem zM(6F2V48wpCR5+S&-S&)zQ^7+%R#@7vodQldv=QFs&*xIU3a7AbB4uo9%NfQ^7+;K zQ+3I3eN2%w=cBMYsyx&{)!>bDJ(^Rv+W{KsxVIMb8HZH3@C!%$8pAsd87Qs3it9XD44x7K~ZMT>7-_6 zNBLcDvoeix;@gV1>)jRXEwqi^yTaA+9&{Hcv!Ugju9w zf>*RTHoG1FPZK)Oocu{fVXsi2$OtYnK=i(;SP3yWc-d6v2M zOC4ruLB2`}kCz>&tDVEBm8=!g)z@_CLO*T10>6y*97Pn-mI&VAmq}I9jn#Jn zW!q#&tq+=f4{GMt@0vB4WmL)7LAHFiqqi7dGU-4Xz4zXj^oruE>&>eoRm5`ycQzd+ z4>MFrM=KP1hTNVS9ZMhkl6H`m(g_LvdcD=P%}_Ph*VA{eV<6y>i0zT-rw_ z^#CB~K8Q=h0N@-8UN->%DhvQy_5dK04ghqX$#y?90Dvn>TTR(GVD@j8K{Rv!aX-q^ z@+JN=8E=kvxSwdL6bKp!`s|rS+s~5WF_t{6jnH9jNbolymG(yZmtxyG+PvC#R*!1= zIZ>xE(Y!;V`DfRmc72e${oX%MLk{E;2Wtw%^h$Vd<$D@$k45sv@)F~2onC$@Eb(g- z(;M(+zV)`Nc*i6d#e+J1kl^@kBIB&Xz{%oiHrf)l*HZacR^5<3UUs)L8%;&U@O8+Q zNLeXim6FOZ8?6z7IFvgGLCIhWq`w#3W-f{ym{(P!#(z_;x*%G7Z2J}LQ<{qy_m$0* z+pgi9u%1!=3DL1g39P#Kz0)U36=KwB{K^k+e)?lsZ)T>DB7Pl1>Ig4pO=5PnR40x7 z5L8;=FS3NyXfACvLu!r$$7QJm?{@D{6Wt+&l6!h#+bt@@?1MFR`m*5rHz`xT3kf@1 zX{j`S4hwmzN*@V+d2!t_iF%#QGg!mC4ddQPFWfY@9`}|cS!gqe%PA~DO05M6Kfptn zndtr=IlR&e&I#&YZA@2eHTIaUR=I|ETM(gJTsTWj4so|*&x*vs;OSCF@f`Wpsgp&5fLhCH`YN5e!+qd`(}QF#Dnsh{ zc-4g~pDU?^iWP%9&tKxhOwgSQFyV`nxxO z1Pa!pcKuX^m?chbRX<`xRC5uo~;pz)hXAeXN*XJ*~(h!PF;w^AJy&bJOiHjcYsP^YpcD@6XjX zQ7xImG-_->`W^~*kvAf_p1f`gV^NWVf;@B?rtFiOc7{H~SXM;tu zi1jz_^je3e#1jkoS)?+!0}~h{8~Dq_w=c!sLst(qk|XFAnx8Cq&oSefAWvO0EIpS> zGiM%L!;bOc+;1&i#z)Oeu$db1~j3Vp{8D zt|U?e`p7)qTNNz4W#DjFQ-aU^A-iqJZ?`WAY~}R0VNhK3g&AGA#N~S#+Lz-E487JK zyOMg-z(1+V+BYId_&;+|B(8pqvaqy*$z|d!`8FG%D}&J+H*VeCz6FejQ!Jc&&c5)C z{MQhGlRHw&iaPyD{Uc7;;91N0l8@L&IYc}@oPS8|W^4+#RV!GCB`vejuP95`T~q|7 z8vuJpEemnn3Hh+h7jTn)`kK)-BmX;PcLSCsEUqRb;_|efTQpFU!CQ#e13iMTdKm#I z`=goeSJ@DJxbSUtO8lO~wrZ9veby)2ihASK%|9D3di4QYm4@|1V>_BDx9K7A-?oVn z68lJkHq@TbLg-KM{);;4#~I@uarGMIwQwA}OzVm|vt+L)gh;bmvLw zelDM$508sGU8^pR(#LQ}olx*e{~a-=@cL$AAuHgUJnqv=W`oZ|zkq*&!!P!8Bno}~ zp6LBuD*ReyM6pE$AS5OFDYs@?2S&Y<_XSDe+$fT_N(HWbo@y0CdT=)4KEK7l>^R=o zx(MRMD?L)~bFJj(e|aZN!$i@0+2xN6petsGsuih8(^WM?F6RCuQhEwtT>CRoO3+;g z+k3`C{?LD$wF@TgiWG-k0OydEFm~hHVY28G!Qe5~5ZlF{JGz3k9n*$B1`5KLgvmdh@@@s1j}a+MdNL| z3Y`@1=VkSVlI&Yl@J;bwVtQY%Q+76-K54+mM_1>5w@r#;tVqbZMDYRWlt&QOjzw;( zYu%lpLEl{0#2!gvob`RnFIJ**-^5>Zs0BOJkJEswyRhv%bO+G&92IlLZ+MBLB;QlK zO$m6C%Cq!+(xK~&1zTV!=OQSJ&3j7?x%EtEXdaNd4Z}PqpUM~B9pgR#c z7`*v!fuaKdbcw8SmD(RK9b%z!uOUqA-_zqGcMuKObx*CB3mEpr!C~F2cy7-X%-etXi7wIUf6oxHP7kp-sI?&}Ahv@ZYJ_zY-z)8vQ z>qIqP5O!)RZbJ6ddp)J5N{B$Tpnb=JVtkP#N23!}MI$sMdh2cON1S229~)>H6{Rd+ z9Ke3F=iW%5iNRF7fZjfy=gPY;yPOgQ*6P(E2_Iap^tQR%l9GNvDNoexFUgJ-ytC02 z@`d?}SerU_d!*L*iSr!x>H2Ki2%^CI68 z`jGE(4*_GmMqO=fe#pBq>cDIx=KlH}AQc+tAWUE9XKI1w%^ej{THpk&Vos}x59f`I zj&^zdI`iUM;fJ@bA@!J-RDnn1+~dO7yxg!byshJ)3fZKXylAjFlqO`9%yqzwSz3bk z2wTU>!v%)??0ZKgX)T<;;ebY#)z|+G+$O{uta%6GE&U?Z{IO`6Ed4Tu?bA!&{T20F zz2A^5f4M4DEmBD(U$|$m5f^kd@C%uL_MpW7fNpN!=8Wa|AFRedRG`6~u*$jf$d$+A z&}YF4FnObLiY^pmgSc9z9xu4UiXLhS@L{3jjrEnDd^x|=-f%jTr(FH1^>lOVCWP}j z|7vhv(vx#-P545>`ey=8ri3hNN)YHNn5vubqX8fbHSM#d~B?swHCkgoBV*m&Z%kSFhLZjK{awLH6SQej zBO)SFQxjt*clG!8-y$cJ0DwA*#5b-EW2h=7Uopwrp0+(i94ef!V)ryri&;DQolU=y zU7foTo|1UTAgdV}ApShU&J6F#DJ||YEg%N`0?K_A5>q6Qg|@UTo!~<*0AUyofwGd5 z#cyyl$3gNf-m4n!gz)h?0AjVINWy&YUZt7>ZHc_hE+f3bPeX67JYx`>_j@efPO`n> z0A;Gs9ptSBXpMi6$s#|#42jK)9?g=~oSU1wSuC@Qiyrb}+R48_yYt3Q4&uT-nwz%Q zdz0ccf)>qX$6-rwWV}rXE-220E|~;XLu!ki9-FDJQVH%^>iyojS^Ao`h7<9%346bU z-U{Egg1Y_qBP82vR`C2Q(5rE4TBr1o)f!)r6y(R0ioCb!2$)~-U&nb1mK&=6!cXDR+ z?e2P%H8RQ}Qd+TG+V9$Ky|B<|w@qwlY>Xe>?-k~nf<8d_Y#KaEI*y+L=unA?bMC=E z6@Ps~ppn~os|d%%Q|DVi*XO`E+0NufK~18{ZAMb^A;#i{w@NJRxuZRHBX?=p)>v@? zeE3I7KtfV-^Y2Wpn%WW4%xNJHa74Y3oh1vHTjdNq^Yy;k$oSwSEU^%t{ z%LKFY^I{kOW@?=`!zdJTDHP6>1i89A*f$!|&C;yV4Uoy_mziG2TgYZ|fzstIWLf+V zXZ;)nJ=V}O_7KcD`e-FiXb{zTwi0)Aj?Nj6Vhz^~#NlEMG0o2_fvW^f z_9%V7;9>T6Z;xpm=Hp}J+iEkm~HisFX^|ZYfvILfb zS?=A7HBdNTiw3;5CLZjg6|oj_*sDXI@$0d~P%g~HRA;PFk-lC$YWw&*xRb%D68cVO z7tBshPOerpmC1NxZ-5ve)}a9k^)L-8@Dd=m5O%t2!&&i0-*$Jgy(|j`?Us_0`^-=@ zw{z2#TB?cUKb7Y-l$pdpA;h%t+PNOpc41cl2v-OorS>|p9RcVp|GM!|u>5|x*QqFi zvGQyehdvG2u4v@$ivm47m>=qSN&v5QM#NrUhj@d%dG9UCgCx)xhfbY+ccGOB?D!$L zPJVz(gNX*vHCd3rg;%=G8xt(<`2AR3UjDA`!+2xMsHmvB1aJ$|>Jq@71AoF58@MA` zg`v9-4BuIk8r|3^3^@Du#ruMSRe>5@3Xc1)+p`0X{)|od!H)hUoeda-iqihy8F=^w z=ZVQoRog)$PvL)*Z08VIt!1Q2%ZE-RGQiKxtfi>?{AqJ$VP9r}%O%WejuYN!C; z2w?7H%C$4_7!?jYsee=~h^cBnnN|D3NsL>@lQJ$w12WVf*rRa+bc3So*OfCU0USya zH>${d+Eq=dqQ?a1es`w3YA~x@);b!<=gUGPxA($%r)#^o3mO4$nZ>ulvCp1#7`u6| zOiI95HVm}qz{$;W4OoqrEW9V%cD|AMi0t$Q!%;g}bKD=Q`TP+0=B$=LaWm2QK)6#x zkr&AdwyM4Ta<|o}s%_*VGm3)sw{uR2hG*M8VaUmh^WDAS?JKh4{+q36)_Fm5y+YTS z>yHXaYiMZrQ&!cHhq~I3G}^xW9&`5yT)f_4BXZ#8PP(Cc)C8H4> z_mo}efH;?orlW*LJ^}cf0EAwQ=fu7~-Hj3Iym}gZI3oFI=p85E0_5Vr34t%{IQB^z z&*Q{!t?Q_AM&vJ6UGUF_A0g-?N`ZgiH5#1*vkku3ELzF*?4atzUhk<_P2IiOx%PirCXoBf2abTX+x;0*d9SpR|EwUP)7DzLiuf zj7u<{FW}2h@*4A0gI80z(|Mm2(9O}@c!sKui_(DIW^~<3=jr0>m5bx;*&Uzj3+Vph z>pi`9RX$|j{@$Ydh4!zhc*`J~MHDw1A=)hcTi)bpPtf>A6 zga8Kyhb>1XG$N-6g*j;ieeq!q_A}-nt<#)gf+{I#e{N%gI|O@)DuP|Dvc@wE3an%f z3F|YHM?IQ*J6ArpW68uUn0LK_?4*1f3f{ql9Ld2P6;)4NNnr+3cs5&6*MisEcGx`4 z#CxtkcsOKyHg1O;jcFb=c3#Jao)6jmzVYYPor=&c>TA%G6tZIeMIFt$SB;^tnA2)l z6_cI0LLY})2dzYW;O103${14=;yiZlS;{;#2s1h-G$^KGE9-MEX+iJcLrj*4YZsN}oeipk?G=DoGk zP&WAnfw5taA~_8+l`CZ zXJQKWoyW*%p)!YA z8@2&+{<{c5P{cv22WGqHJUHu6+#g1+F{yDSb4ee>gM!g-p`oYY4lW`0%%CfxLeDKs zA9k!taUc$7*Q+)(C9hro6eyOF>s}fhTd5lo_j_-Iawa(DALz$E41XUInMJ?(L3sp5 zt?t-4K4L(LU*Ct|ip`_UMhnPYTddj@?G%0$3a9MYW2(=IKfWly6y1zBv=dfPf%F_L z3v=D{y0;OpjA^amcd|?gmGqpaRTmM#%0S?Acn0u?_9n4&v$GjZ`C0wDyMhaCfhijK zR1gScfaQl=k8nX&7R&izcQ+1*K39*3!f>dlpfW5V^6S$b@U^_^?Nw#a^%v<~{>2yC zi7Kk75a8edVZX1Jms0*%v3Sh;L#qm+g$2buF>(qDC#LD&d#5E++hZtLiwpw0=f_ZMeX>l z2bVNNjgs4D9Ztx2`jF#^ivw-j%S8Idjb97z_+}KU5P#Wu_0hjGFq?D=x?XASOk|{o zIt{U)T{zM!Sg?3nH;`blaQ#R-Su1A2o4G>5MFsDdvAph3;x4MplJ_o|z7Zq5hF_gp zeNtA7J^Y^>LJLpWwb7}pd-<&Gq4-Fr-bKo6W`C`IFygRpE8#}YZ6N$IDpg*F^Q2!0 zorCV=(ylxFd)e{l^paypbU844B6{ncdj0JbzoVAGpEbh)r*>ppXAbf7J+baUz|g)@o+s|2y1L=>uOTZ737eH5&tHU;G%&|$>^#&f z*po{5dn$7+iSV)Tcg=W8AGvnJ-N#B#`crH8zfOjs+e`Jj<;WsSNkD6Wn)4X_XpQb} zo5fv+Jo%MQ@UvI*o4c5@keGUqr4Tu0-2cWXC$4jygKmE5YjiA4HMTR?xH((zKC$Ur z&h4E^0GrKyUY|-bRb^K+*XTK9FN3rD_wPh3ct3UCij;&Yj$Nx?e5Fn6i;5mw2@v@U zazJ{oJ3!ycAh;f=AJz?j%O*UCE$>{v5T?pKkSls7qN1sCkFE-h&x6 z&V60>Di-KEkOLvzCP-|JsUwht&n=AOJp->k5d+GUKQBztWDC-USr2vT_VRews!7pV zbg%9vbA9=bQ~nIt#eK*IfUtxIq^j<1DaH_>(z^K>GA30UN!aB}^t2x5+f4UahY;PX zapk(!R-M+?R#Vw&6S)6dSy|Z%cM(v5K7QfeJbZVlhPDdaJSBQe;bY^G^Nqb5E&77cs{1dt0OITahDB8%K7_tTKon z78I&oStpfW>~|h7qtSAv8|bA< zXuy^JI62%Fb`33iRlCvkJ;3whzYsgY9tbOr*Y(cs?j)!Y^^cS{h|;Xx+yv6KLQ*=x z_uDO&*Hr^YLe@=e5mH9So~cgM_&8az{`!Tjpq4Zh9e+7AIXRgwfh@QV-2Z!e30m02 z-CgH3<`uK^OPoEw);>+cm%6T;Kv^layC)r`#o@$bSp_{KvtESv_*~BcmwuzsB9Caj9 zGTs>NW~FJUmauAmYNyciC`R%@h=*$CQS%7saV8174&`E3%|~g}4S)L1P2zelLTJ5d zEpL`pU36&(M40~FkMRX{O+zk76UejI_hw5KCxgkNdh5q8?rCl;I0%G+ZiD_DU@PwFQ+p}HIG@ zM*Oy3oRCI;sXK;Q@d>8xZcGWs#ah`8J&L z#tm^$MzVwAD46w-%_V*dKafic1c!Rb^p`X<=a=|`HYk8-CqJ=B6Z>tFx%#eiEs3njQ;wu<4XI}_L`{1o zjz8*H4^g$O@X*dGmYmDPt-68JkR5N~oxL-r!-L$yACS?VBBLm|sp509{@Mgthsr9q zt~hwvz(g%7kGId-A)|$(;*PqZfPb=#^O%WQcHw@BvRQe%+5JXuf3;R$L_X#d>!E*))qVI?Amj z4>@6dbcAcv6sz4+HwUe9Q!TCqakcjE~ZW4aB}zx<1`4ZHr2hvgX14TXREB|P(f z5NZQPThQA{6jutla_bp^tt6pKZI*Nl+Q`NkhrHLTytk}lS}$bg5UxEw@iRvr`EQ`I z5cEq)jWoL3cE|TU+`^mqIlH#3a0}yLcX5@N`)jU1KqjDqyr{Z(F=e9!Lg>ovL3L$k zoRUH?@|SC7VagKH+_1G&0BBs&7!Rz`(6&^9;e1O-RV9$Sk#jh#n908gihZk265Nwn zI@~1Q+x+LPxnwoikSVx8|~fI*y$p}IGGESF^%On z8J+i0)mv#;yM8(uw6_?eVMbwJ$FzybgR)+8nxCNqbRoNylXhTgQe1-x8EBCz8ah{1 zf>aN|`vNg5HxVz_yRgP`SIv~{AcUx1bxO)>=#2aFcj#kHP+!m(=ZklKCSQja@t`Qt zrIyZs{k&n=9AO(YvAn6>dg|jI$)Dn-=Fh7_#74=ki+{rbbIl44()73gY>Z@1-UTjUjmLO){X4~sQxey#F()2Q3i!Xtegb&K5wG7d8)?mes!--!*1| z$z%xcVnK~5A;)RLfw><_HP^m$ z_7WUUpbqd(3~;g-^e%F9gzksrc+5AkA13~Qf$7B3nr~dr-nd* zgOb?59m^@=WH)-8J4s$PW~qu`#^|C^{8QhtHZ#k{HI>Lw6@5ixcIZ%ZgMi7JxfluW6k7(VQpfy@FAVqfvX88Z4ntuVgmo zBH4(a2bHStwUDtLKV~7!uvpqhUv^X<*R=o>3^2LStwq8T*%L^3bm3O#=vDP7$X90) z?b~6u34ri*0+VNr%|soy&dvODTBfEbGf4DK)0{wMaEK%u9e-~7ZLE!r`LGdCl0T5+ zK^zv){PU9fuvkBdBf-2#Y87-|GWU?^#jZbT`8p&O)2U<9N?YG@onknS8pLWco? zml7mD-uF-V_FDJubALMP>~+q$JNDH}bqdl)qyPX=Ks8kK008Gc1QdyJ@9zKwdF(xr zcxsru1pu;#|2;TB?k7e7Ak}e#KwiCa^ziX`>*(PLfE+JXPL(xd;OUwkdUV7fJ>_^fZOT(#4if4YF&v+l=yZD?sH);K|3JjxB_+WV=ybv4 zaiohx+Z;tn;l(j=!&e)D#V+%m=fB5pn-}CU)hGFl6GSLt@=Og8T`@R$g)-ZNpW%c3 z0~_1?ilL-jo&Ys*;~S2*H=H=YMX;>w^T#NnZUDz`hKv|MY3HE?S)%W#c9nC?aNrR* zD4!HbO=37Lpcs&(TnZ?v;lT5=pXvh$e86hN)@BQM#RphD3;8_*!1FJ10&xJ-bPhTk zL<#_UXcwabILZLk6NYiBfUzJzYp>Za1uXIbf>0xS4d81FfEuSJYXFGJ0YTlENFD$` z5U~2e$>|3~QvEy`1pq_}-F>wuH-6)kwd3RBNk~ddzTIzxcaLpswr+n-RCy`_z=luo z)Gb(`@ey2x5bkzc^yC2F(Si)|?mXVUfl9F%Kwy`RPCWmsjq2x*ZA(kPwzn5w^edZM z4;uyDI`mqijBZ^21Z1Rnd zP;N3kB5%^W>5*K5_-D*yl_S-1vOHu^5VgZdB+~CH$Uo4hTrUYGNwXcPe_TyoHSp-G zVKrVy?3wLEy)QmZs49v?9N$+NWX-0eVXS5Ra#5ok#KI-|V3|aM1TR9j_u1pLa?Pfv z?GOI-Guj9XMH_2?Ip=AT9|}+h#z6WdxM*S_!q3`1;zH|7VAC|yYSZp|oLF#0o~Xtn z&a|QBH!clCQt4pO^B#FPMH&{}TO0XqPRl zWKf)|w_5%g_CPH8wQ|j8q+XqFbooQkcezqy;q*|=FEvFOGmjh@9M7HVc6{0&tY)yi z%$hWs9>J>bWbNRc`jS&b(S;AjIB+xNF%mI4F!?gpWowl(&BQYe!UQFR_OdZKR5>07 z#=J=04|FNRq!}+Vo@Oxf3cxBVODoqZ$qY^mMqtSm7WzT8Y6c?uTNNa;nNUY8ud=n?G=c&vb`=o`Me~-aF=DB1jnt>9`bDRFqevI zwF%joxm0FmWg1s$ROwc!?{$gS?w944cByulT!m694Ze70_DtO&d7L00qrarTT1Hw% zuPrBiR?A=M@`d?xhl=kv_p*cRf^G|VftE+vntvDOk|jvs26p3iS$3vQZcNxn&P9kO zA7_;PF6QMS%PKI4KGKDl_bEcYSZ7#gZA7HBP01F|sU@mWB{&V3ZEK1VE1PG~_GlZVM$$Xjo*dhPcbj4VgC+Cdw( zUzeI3AUoY7UrU*MF*bN@-l$fSU-M+Xqo$+mL0Q|&w3k%{^A3GqkB~#iiWa7?zZMD6 zwMaK)khOyigG0;r+P;IduC$=`pu`(FB8uoG$|}~^tif-aylJHkrPp%DKOHCpeLu~_ z3OE=~P){t1Y#|?x@bo+7>*vj=J1{u3y$wH!iI3F`8{yBA=g(svSpCtp{le$W%X}kX z`Yb=MF|T*O99?%He&BQvy;3+TTF6siBJy^!?+4_k?yo5Yvce2Om-Xsk9f(e-Lohsg>yQx6yEk_M zcT+$a{0WW&UTmmRs44E%MZgD+Z%GQ$XuH1+OZ!R*h&ClUrR1=huwOkj9F9N!e5~O( z$7GMEj5|?Az6#!%pCq#WZ5`hiO#Un~I?^agA;~kw_|cS5mYDC<3gqp&%B4!C%37X- zkd9Ox-wQEb`AU9g*=31#(RPIaetVPAIpcg|sH-N66hCjRxVvlj`t|-v^k)7h*;XJ! zw!jZ_Pyf&3y{D07^cDOxVChUnt(cdR>Hkrp<}IgBcyj#E_em0|e=lpV!()Ld@u`?a zh#4>2%VP~*?SRxjDV<{eT;D~$fPb|`JgfNFsYRi+nkQXApZgx9FhY+y4DXwOwSx?RWS176G;lq9K>YkJSVwe56R_(jC}q?gd_=1_wJM`)^~h z!%~@51<%L!M;nLHA0<8=7T)dC^wMmkBELjw8u76j|L&@GmTHjo@<)?y(Gfh4G9;{) zZH+_ny3OfS?Hgs)26sIT&~^#6=ot>{X~uEcBQqfV6&bX*vaoNiV=Q2@-fVptmCr0s z7aLbgi)P583t8k|@%zOb?J@iVLP?Y#w=0W>DX-sKpcldbO zC)c(jeCT_>iSMAKtpot|Ngu9s)9&9OTMa$!dpG(70N~*O@bB)P?|tbzK>*mb0s!f3 z0ATP)wfwGjZ%YfHDoQZF(fZ<6+K<<$ndxI@Jjkie4kk1UX7 z7)70V2?ykr&&N`Lhgwk?{%86%E%ycG#MKd}pGIUu2D=1?i5wGARNi-@88=ukXeBsM z#2qK99Z3yMZM760s>v&b&ZJK_f{RbN<4W5Fw(^yUAE>6N{b}b<+A4MWux^C4W)#}copl#LdG$_*Q{$AK@EE!w9cT6uVhscZLQI<+n$uf9(Vd0tUUvp znd5?@*xkzg3&=Q*Wy``Dlzq(0c$gSwAWt5UCuA24T*i& zdmiL0Sy}lal}lT{^2EOYZEXEEDxD2q$-qF3K=A$AyL@dGE0?BV&%shB*mqPXk0qS`aGsvC?bts-DrmND_*tE!iSZYo#PTc^zOoUc4Us|sdOvY?0?^;n$>^iR=l zR#F3tlfX8#Gpf!pBCIvct*auqDSYb$giuVbAnql1nw=z`rdq3@$Av_@O0`##KoFR} zz`*Tb05DqQ_9@pq`UxAg%A)45=$2nXCbNhIZKM#QrZO%74y8r?#v!D&LKPn{Q(Sy@5P}W)nxK1m&DP z)+vFXuU$MN#v9A^0$tV|4L3BfBNscT3MI_;APZG{j*1{tkM5wMR-NJsP8$d$FBW+t z-^nfi;Q}rYa(kVk@{iTBNe3Qm)G>Gafd=_ke`;{e7d#sr5r$KC$z@i%S~iw4(wo$A z6!mGzMh<%j4i8wl9vi0z|R_{rbXFt z=+LQD0>)vBA`c%WeNQB{GHWb`<2Mrdm9c@KserA_> ztSm1U7v?v%M5g*lcTA?-=dF24kX@ z$4kNnfG?Y%{}~z@;`j|jPfwWs1@1QX7V5qQ-(22Yoo5MHI)3=z?Jb-)wqvmVE#&SL zJHxEIRj3eBP*})32xV9Qj>TdJli3rCJko;4u3Xkla42>qa!c*!s4p<_;{q-;s1a}cD1%5^ft$(O|L3;Y!5roG?R^S z!wRGW({66J0&>(oybv`4#Xx4xgs^gwa!v22>QB&Ul@;;ee`VJ;qJVfGC?b0T;+gop;xe~7$Aj0F3Q)6lv`Xwk(4sy8D-}eJ zC+0gsykYRFs^`=m9v)6tXf&E#AsB>Mc5gxN|J~X7aUx6Y`;eF%PU*pWxp;LzU8prZ zQPo4g>*!Pb^ATUWc5XCQ=JZg0d~a_Lhk#ny%-kG`9mI@{QMiS?eS5NxmY6s}qWSn& z+*=ATp^h+M@XHWRyVuZkD?ip-#x(G}8HV<|Wh3ycuht0w)HM}cXQSod@nzmeK;;VL z;ZqnKikskMdXR?gZoa-~lSO@nxA!aPyhem>&j}GR5^oIr1}aa(p-eV=mc!hVk=i(r0m-Fy7 zqjLAFitfLhXcq^QS;&%eU`Flgvfop>n=Mt?{yR>ziSbghbnueS!n;%Q=RqkXRPj0i zi!7?aO$$YymI3pIY@6cp0&W6@nt_RC@>yFOz9t1KUq)WwN(PsZ;^lr0U1qyBsax0` zvR_&7i?NVDG*zI^vtt^LctwD)3GF)^5O!_oy0jbu)pRAYMSZUC?}Ov|{S6mB=1sH# z8wetRY)xKItH=RqTFQ|VGa1}vbS3q#XM3;mXS?sF|WD_7E={uTxXl4W&t zPZYHu1rWR>rs1={cEH3^PqLA&UALwlmXDhiG0YdY~GmJj#a?=d2Tv@ z!C;!wSic&Br$yh%+RUHdxQdJLqU;+#R|6qoAcS-jW)439abr`DIB78BKU%B0%EKs8 zUv$@ZRb)Y+0|y=!-{URG;&3YTj{Jd5+>l6=wYgxU;`RK0fxZIADT+Xfume zqVm3ETvM|<>poVtv@I8>4w%x*A&+9(I}1>mG9(P|@l!*6KlI!ve|r=oZMIAmp@k>G zYD_0o%fR{{vaW=1eSk@=L!zLh39(=L!;LavzSL$)rY9x0nsLPZvsqk?U*)iiYdYgd z=3;OwPTPZ32SuU4cHKzDoLUHah4{dQyn0I#NtYyUU;YzMJ6B1<9mZ6+u$X+!LE_eB znOPDeE-2$i7HV$ zDsThcj1mc;$=shdwj+|(YE-~fNnGfF;55v0FiH`rj$l)K!JMyg&81>s0HZGEF2W5} za;}mVm)9gf5ZZNFpyPflXWPPn^oZW~+0q5IdzF<%3TN<;DK~T3iYdfT>p?@&KwT=( zND8w=?_Z+K!uyTBb9qjg{pKO+MAnu`_Pj>uES0r(xiJJLUG%N`WLw2Cy#ZXzP1^U$ zyq73CXk8~&1$~KP<4$C|Z!ng@MY+joURr_=hV6ork%-xn9rzP?{I@FdfpJn9h4%N8Qk&?*I*WGW0D!PerUPuSZ|EV*NdEJ0FMY~ z6uP0^#hKCcp<_n2$*~7xbMLhI&7t4T`%D?*afop{1#61ONn~_L90K_;wd5d4{H#p+qQo zxiag$-w}O3P|ItAieYy-JpgLbhPQ0qR~!VuDMVKGDSOxL4uIgpI2kF>r3>p4W{$q0 z+E&iCCJ2or=<-RH)+P<51r!4kmEnM*Izebo7MC%QPXySZL2p(80|CH}JLJze5SnwE z9Y_FJrLjFA$WI0y)7ZzT0#46?s$sJ@HNZj`pmosx@eG&|0ED&79W;U3CZKDGnyelm zB?p8JW1@HgqCmi|pM&EA5Sb0os_&c2{(D+Oy}^g~RCc{=3+FSnFe_34&)eqaf~-74 zTJ%q8C0`T1hAIm7_-8YUhKW=CKKKOy`N&fI#5>eeDK-N6TXW_I9{>49t>AOZ z?Ckp5+RTd|%2uxj%!98Tdu+SRuiVZcvX>`EzdKeq!$fVuG>A@r_xw84DPbN?xfA(j z;ZKsrWfR%WCCfPb53M&X7JRg;hW9-aRiOz7q9yFH$|=0PPsVQEu3-2tZpmXLfLa%M zg1}^fG8@pXV{L9~3!ko)69Cw6b?=_wA-xsq6tO()ceAT-rIG&x2zAg(@dSWZs+@u* z0}Tp&qyV6rAI4X!#B|urz~4o}+)cdDO?GJ~8L7y9LmpYr3^tV)^|Iu?2}nq`lfImPeI z-I2O;E7Gusn?1Em`x_VX-q{a^H=-iZ7MlDVQ}>f-gs1~!RDMWt-j7ug*s8v^N zGIoDVee9hP#}B*6jcwoRZq6G;&*D?# z6&|Ajmlurd)a&BwB=%XNN~T3nqs6iUlY0_LFO{nc5Jq1OqswT-eWA|=Bj~iWOR5Xg z#~(V;JDoUx-Sk1;TTExw%N#KuLvLwpW^Ud(^dqPE_#mP$#*v2+#&Da#kC1e>*yO_l9#YQcx#3wn?|a5w!$I#)UqpO8s;1-xRZg3R>56m61J{>nJG zM%`4*c(we_L`J1)MUDa1n910&{CQb)g=3k!i9#{N@+y|Z^1IG=eU)Ov{5sp!Hq>J> z5M#p!el}N%%8$Nb55_l@#yNAa z(3Qy*_`LK;gWQ6oft-_Mo_vTwwpYT_U6w_tZ~mX5ip_ULm6F%#uQQh;lUqh*izd}S zsZ%95qpVjsSHUPSs)&n(i;YWLcUyM{YNXo&=Y>Dld9Kqp_-n9ma4K5@CMPm2x&hmO zO~Wuvb}v7?L;UaDSY z?v&&A+JA_ji1H@J+VvTd`5FWm5&YWm4ZUMiZ_W3e)b`Y1Wbmgex!V-cvy_!AFIgbo z-@IsL%w(3JLtl0jf_o1$wuBrlhN*{V#8weBXx<;rImWPY4M%#%7Vn6InD|)jaI|2i zydaDTwb?jA;0PDe(&41mI+;QHCUda0;p2wSODds)$yh6i%!=^hG$4qrGf_ci-u}3L7N?Yu-=g$D zDJi@kRS4NlcWS_?G zN#b4q9+nn)Mo<)7PhD0CKKGP!in z_m9D%ax(2A5h=-^J(VlibW;(I+m3%6-lMDRqw24F-^Dixv8Lbt>DutQir7-%Evy95zr-Qg(4FmI^rM~Ru-Qe!`++R*Xlzh}S7htjY(_ZEB ztX|gBfBx?31LCJ2%}AToOxyqq@623*EQ@__ds}eBY`WH%=GShR4{g7 z8fT+#A!LbZe0}~ghe`fHY+McPJbmVakQttZ59>_P?gO3K3u)iVD}S`S9d;OV*!r_1 zkZVPmQIYv4lky$K?A$jBjM+Eb(XraRQ05@dd}{w!ISeYeJLUESuOL`=6#OtOs0nHVKaJ;iEJ_C4yj&e`=7ppc|6{qzO3!r`InzqWO9 z2Xn$oAv5Xy;I$$-)4KLh*O$XS&W`ku)1ED*6>GI1z z7+ugfA&H6@zD_<$qEaDF%1%Omr1*%HAYU{F8W%%tdS1$c^;WfI3o=ymI zI*FYg8qFFl$lT9N?F0vvTy1w@8Nbe>dQhw#KR<|xygD?yz;*jA__6F3VW{-if*yzP z+&G=p9T|_5UZgUnrrr?U$~w3Ni3!Z(`%NN8C0!)|s7nmGFigeEk3pJ7x&RRH1OP%K z0O0Hff87EAUts{)wgUi}EC8T)PqFP)2LPrvEmb9x4|9KQI#VW^4|You(>w+4jh<6X z$##DzBAcf5C8D;wAFjP8Pq4(@WulZI)m#*(8A<<%d-m`b&F@cwN7ntO1@2v6k6c|3 zhsAQQz8{wk5Q|kNmzZf^X;e?K0-AQh4CJWl?>XS7nkht3co^LI%leo&G4B&i-U5DY z063aGn&(I7J3r(>-!J638(^-PEuC1vbGN^q94~G^MG(&~A_Ug_cdl5jQPW(iv}z+K za+Xu1HMPVx{d)z4SG@aT>udA; zEbn-H@_0T*cKAUs{>OY-NZB4It|~oi8BB$jt2PhVTfzq(sIjd|o8?tj)L-k7vX!KX z4tr;Bw4@omV2iACGo&>lWxMFe491}0&I$H)xd^c7taM@yE@{=`IQZ+5ZAJ;La=+|w zyLe$IS%LFB!srDr7I~bZb}p{FTHSz^vCJrOn>Ry%pQ7v2Y^HxA!0n(f@bZNW^O|#K zsQSOW_$2)7Hq+(9_Leee4r|be_@}=}y}N90O-)@AO48KlR%XO?i&$ks+;(FNoeY|) zA#;%PM7%Dt)zkBc>h0)Qc~jHsN$oAyiboq-^N9Ky*P~ez1sjDqgy}(7Q?B(SjoPSL z=Sj7`d~VU<#Oa|Ik)qACOYLW+y#~E6oLW;^aOa1UVKvw(k`|u0?ll}zZ^~DowWdK3 zYMD{~-T*E|VV1&KA;3n~Ab5J-k*SsP0S!_pPE*pMQ8V1@F~}$>WJ8qmYwrdsqfU?t zn&$KDy7bh=w*@~Sh{?F0?3Zf;SzI15zl8-pOR9wnj>!|KY=BcZUlHh^iRv0>b81m5 z%+o5ujMTT1yvN0(kB(FysZ2|!+4G|7$&Hp!8KqcaQ%zsCk1x`3qi4ih2Gfnd4rHCc z`KvT)$t%X6ax*!A&oMK5vUvYxsBg?N zgZ00*5R9$_Syg1nrIrs={(Xht-YIlL;n@?rbc7fpEOH2$#eT5iFSshr>cn#@l#^AK zUUaNHXv!Q}e*UN;-5n%x`pb_t@pL4LAdmN$XkXU$fJPtJ+1uM^E@boD8UyA4;tCm> zJyGXT+midO+d2KbbW}?fSp>|Ia_RD)KnjwOZ zk#&q}qmS?RH+mS|FdTJ8@eiF7O~$GXTBHj3{6f|0Kko}r(J?`uwQChCZnCPB`4;G} zRo(|CD##YA#6Q)cqoh&9%i*yIWQK;n%-b))(7bAhRfvsu*B?}28+8vFF4?jz)h&f- zx(9%&yauBEbKSur?k>I;r*>43o(MYz$G>p}81cj}D3e{j4EbU2)4kE-ys=Fw>B z73pKvFIwZYbBK1jcm<#=;)SWHt~?`SLM1d>IYui=hzuZ!=(e-wg}lBW$)5@H6y2~N;PKU{x zfp2@xZtmMVVYiIt#Bc5gZ!O_Q8VS#c%iVL&&hG`(CcfFGFu%I089u%F9O8^omj9k% zs8zdKR*JQNOyk|K>M}f2>oLPV5d`x%tlMp`2uK6E4$0s)A2J_zVNU5JtZOA_wW$0x zXw@P{nrx!jR|28%J8`J|+h)uK7EHSR(uon2VK|rNN3Ex@EU7gyGJp=?2j24l!iUsJ zzC{^{55Hnh-h{> z%Kc7x`?7xUVYQc=%aE*xjN^MdI2=V#CR<+L4#B28Xx@<|qV6EL^G4r0w3Ol>5jzCo z{1wCxjOaP)Z4n~h>E~|5y${ADz3>z^gJQM59kx>iG$$aBolvIZ-6b#wg13R~JCN@xi1Ww&=8s|9u!`L0NG?XTdsSwY-D+gU%A^F2j*cE5 zK1gqe4(Z-{)#2gkNzgFsRvKL>EVH$;LKsP{u3c2)DlH=uUR1>K;c#;_^q8BQd%&w+ zZM0cFsSZF*v}zHJ`^J|ce_?PHke85ogdz4_D)Mvmp<_h=O1?%O%4#Kt*avNW(~^7f z{KuDnWm@N6aqbm48is3){O^#&z{l0Sf@Brg4uOupGubY|g7u@T;W^e!2bTSlx^;x} zv;{?Q+&-o=`J({YZf{$9cE1q8H_u-+B(Ty+WBqHlvWSVhFRa^0- zardsVg{#yo;fyNH!V^jGaLt7X;@YOsaeL;DRAJG=aNh6qDWs7*#UhoAm*kR*tebS3q9(%-;fqN@C%32dVUrto$QT<5DHeo+2BWzAGsa!fIHDkKSM(>)$OTSW7 z>L0s}e6Nm;{Brs0AjpG2Qr%3qU~pj~waeJmr{Kstum&MFeGjC+t!E0U^7VM?O<;on zW+u|T(`Uu|NW(>x?SA!q?G$^f^shv)R+n;Iy|fxKk8*N4`y49+zpg9iK#e%XP0+T! zqaq8%EvTeCg4l(Bs&yRB)nbdhJi&xae$pJyl@o)WgV3;FvjX~x?@VuepLSxeU%}C9 zGT%1n;hPAoy6oZi?>{o76AEr5uQg$L9&TrWCp$k64!r## z5Wzh8U_Qr&>;()aQ$J7M6oYB?b6?%(2P}X+ib=S9Rxq|W1U_&d$B_IA1dro?}5cY%xRt3bR^LrE~YkIzDxoj2F5 zL1+6VZ6P<;FVE`8exyYQB6xQzKz}js7n^kFkxw5s0L|{U~qNPXxaE@+L@L>Rs)MAH4JR zJ9gW^y zJ()BJ38r+LJxk#G#fwKgI8v`JK}c5<)e^G z0&)^iG}F{3TAd=rB@bb>-Dd%C4ZgPme=pvG3T`7B=Y7jhW-tl=+AsLS$~U#P8e)m< z9vz9)UX9JOV8u zo>Em-Jhbl88%5wAvxs#C$k-d3BqmBHnqE**Q7z*$G_pnv?uR-a_X9EM;yfEM8S*k( z_c^NL3k}R=w{Zo&57Y_@-46XmkilD(&XxhQRO?ULb!T!rcG-r#H!mOtNwL>iX3w?m ziTL(vDEri$1XnOg0kw#&a<*mnPaJAd5|P} zg{`9z2*_6V8{Bu@pVDU9(w{qy{YX&e_NK)auA8igCol4s?W18)azn)cpLlG_JyksX za)x#vC94@$r6;X^@DO?S>P6zs+;(3j2X8%p!z&#Xq33;lK5Wkyu_I{M9H>xN^I{8A z`w71P;f$h$V{GdEPdz-?YVW{4KMH0ENN#g}6mdM=L|;74g|2Vh)yW*f9<@qNZGBh{ z6IJa$HIf${&3m;tdvcW@WHbE=QiS_A+Ti?E|NBss5muS`EG+Jv?4QVNAVtPA|f`#xP*t=(fm02iw=o}ULXqXicyqmVA z6JIUR)BD3DVDbF7s^Qz9=vNt{rCP!*bmn_snkjho>51kXZ7)=a75j@RY$9z4^D8R4 z-!|OI1QRKai%0xBz60=sJE?x=f`LJ#t!B8n< zlTU=5Yz%3uCvh;c0()y&CFg=+!}cp4X3wSNaF~7eIc#f6ao|>(B)qk*JbVU$v+IBn zwYkbq`^r%ZUlNgq^2CvhnUOAASNRB}>p{kWaboee9y;W@+--H(7q9hG!Pd(VgyJo?e4c7 z7Q}bRW2~tjh$G(btv1uL21ib0#zKzIg5;YsMoDBpK{;dh39#28KxlkCS<#IIQKo-4 z@+*a@Y4@8tgJInsmqtRs;DXUO{M-iI;n9BS)x!KGR1(*2u*4kS`-b3=d{F53?<&1m zL;z1x_A%6lnVGo@JNS0V40q#d&?ob77N6+zn-zR~zQYsuHifgE=dL@$LXEYe zOmO)}=R%>$xw4k(3s6%d5c;JGZdNi#s5$PFZ+gC|C81n#wiP_p=!bE3x4n{#rxBpX zuqHTPTGRc+1J}vWa&@o^&AvP4#ARph`0B8obl?JUeiZzm`0Ma3>H$BWAms(sON*3l zdrOkrw{PPu_wp*_gc#C#1O<`%=UO$=P5@)#rqE6;^w)|PPZGa7;VB$ERESxf;oHJj zIb;nRTC}8~E%;)JZ&27sV_F&UiL|WZ#kyuse~GRDBh9{Sv~=R_xp%o6d`(HL5B86+ z=F-ofN8l%kV=py;nH?IUAS-JEie2vvI$Qbctr_TaC5`AGw(SV=O!OTWclok+qLo6vIWGPw?!L=B z-HNoCncK9l)xp@taNhFiDMPM82xTyaYR-LpB#L_P&ma>%u?>V5+><_M9^2T3Nx4@Y zZTM5-mxjT&Ud>Yc2X}%xxS|{IF?o6ttnho3_s?Z@9WbI_>V9o7I7H{0UxbyxqC7L~ z)wRDrP%FB)1%|j*6huxaOc8cr4748?Ulq`WR$g)G_B+&_N#dMsOjO2$OKW^)k*JNi zHi|mHgKEHjS2~*8w~?6BdFyo zA+pzl$w*>cemC5&_L@^GpI;kqcj{S25zj-Xj#ejy9IK`%ZU$I{KA{*xVlS=DXY(g( zjO26xIUXHmG5ci^O;a^*F>Sx^Ke!xox5HPeCJR85SLuawyNH`PSy7tTSd?HK`zBKF z$g$$Qt{S#rAdxp5F>DK5?pdw6yYZk!o8_FLl$#d@VkFpV@+0hhKhBXBI5=a@KtG9=5PeVh;JzkRgWZQr z0qb~H{=&ZYDC(&QR?CcP7K*;MM|PyHMXw$3^>Y|b{S_ZZHq#LX%{AC6eHab&vCcFFo8oO_s*xj zak=u5a9WXnOyGFETkWzR+upS5u4-<)wahSs6#I^PcKMB8Px^v&hTpjAGxwo(!3R&? zvhIO?5}Ra{4B*13MDw0XQR?x@`0J3rSZ(uMVFzWe1aGYfMeaFx{~)H+mslx$6VE+# zVBMaFV#&03{wt)LrWR$WY2BI2JZKWa+_!yIz|B@C8*Cl}0&K6hPOYQwi;Cp6 zcut^4&hvuHgjM%*%6>+mDmwQN1=-?`IU>*V2^Ma|q^X4_#@5h|oD~ienA3qE{DgRV zkT=qzfzWMMPWJ~&NsXO@1Uy39WNUA9 zB6BHnU)<%u-ZCJB9=h_j3dlbw=ZPao!h+P$V>d;G>qh6B>^m}t>Kh*8;;y@QaIN|U z%YC28DTQ35<>fz0CoUfz((38!n~n*auSjeQ_1zTd+hEFwPLqHC+yIsCswgyLr97D{ z#qZJDOm};=m}u-a&GIafObdLxJlGfp_BhhR-M#Pm+tEbsypBu|k&`aFc_#@Y{>O7A zAn*uJvp%9xh~9ynUSIDmt9-aP7Wf7x!!PMqoe+wUo2!!{$qzQ-TS&^Gp&{V6#sIzB zcbCSO+AGt(IWL%_L#(RJ_+pt!oA+U(pL8>VKnE5h270p>NVsUF2= z=SP>i@D8{$@;xZ$snnaWF_vL)C0u;zL!$j}Alkucb)X0C>Dt zR{3ik-BkS~XzMbgCDfWL2R-qFnVYS%sKp0a(}29|w3In=ym{tneUyY}ra#+fiyq;7 zy;(|qeSM)L*+@M!vS#`BZ$Lie+N~{q*-_a^Fdy!0a{3kukK3?rf$=;7q0D8i>YAFQ zWvk4ADEm18OiHsk5 zoz2n{4h~ZckpvhQIKFHf(18b7!Rvh>h`Kq41fEZpH0`pGjsf!4CJKH4k0Dkw!c)6N z@HhWQ?$rYS?Lhs1BM@}`r_TSC7CdJDe-sj2LvJVm4cD>Hto{aF_&q;BOHEI;M%ga> Fe*iDY7c>9> literal 0 HcmV?d00001 diff --git a/tcod/fonts/dejavu_wide16x16_gs_tc.png b/tcod/fonts/dejavu_wide16x16_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..b487360d7a7c20cae2e7fb0d3e6339b9fead743f GIT binary patch literal 13190 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/lucida10x10_gs_tc.png b/tcod/fonts/lucida10x10_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..4e68dce8f2680467dac43d4920ac664de1a10eb8 GIT binary patch literal 8876 zcmcgx1y>wRvtEKbAvl2`i!bi(?hYZiyL*tuU4u(-ch}(V5ZppYa0yu~=r`~E5x39T z?b)3(U0qK-Rn=7!t)?Q2iAI730)a5)<)kz~AUHALS`Fn5@O`K$xCl(BE^_+rAQ1Yy z|2}Y_>|7!c2u;;iQc_LL#@WN!-NxC4LS9mm!o|(m%GSXW1oGL))3nyoJSGsn+qsrd zj0*mu=&XT{LZKlM8;qAs%SefeqYy<|xQ?$r@K#zHfpoke3O*qrI1XPOf)RtZhWv}N zC?T{sDrWL=&%fAyrRVNo=B0I2HbU&2f7aw5@Mq2NB#za^I1Yi0re~A^s~K>e8oPI$od2q90u3#k<6!v z5{w5D^GlE@1BuDN1?OebYJv(7Kqgb>X8RyDW{?S8(7_TYIPX5o9}Z;jg%TgGAQ?pQ z&N500WFrWwnbV1p2I;YZ@T?Sv`9W*UAU1hjD>+a@JE(sa2fYb|f&pSvj|yi1A^3w# z#;K`&Kw()RJej|`LRU<6IERb?QdvzxonU@xr~wMIE3&RG3pxF)JRuVvkLerJY%!KW z-z;JdC>Qn**fa=Kkc(1p4DhmCY$Qs?^m?_a;x6ow@XOeb{% zUaSX=`*oik{sjs>-QE27_7e={Foen?-2WJyzE&!IKbL|UX0~;ZDErio{`y3=L^UjL z)~Uycx37-tnjn=O2jeKEik3)W7@=8wwfMOUd4w0);plnv z|GWc%{&qVLe5Xf&54H*2oAZ9X6n&O0paBJ2$)~u2Kt@tv7Olx<(J>SdNU8wJ*dR`N zJwOEMM|wYixHW+OWWp0B0UjQdz>z?+2!8Ko!cY?;K_4;GK*ngo`dy5St6$wFBGm

hnIiOg3lH|} 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

C4L#@5Bukpc- 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/prestige12x12_gs_tc.png b/tcod/fonts/prestige12x12_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b99ccd0a5edf2e7705363bb1bfe54063aa1c84 GIT binary patch literal 7794 zcmc&&g;Nwzw_ifKyF(i3UUFe+mXaR$L#sQf&#b+k(Pe-vInyZfZ{iYiv{S>%;^!Ji+&dUx?>s{@iA~tsZqWn6SG3K$_DZE z`DalJg^CdVL{0zz1gO^GEo6TIa;>c)6_X>GmpxHnzt1_A)Kyh3Il zdH5S>U{V+`=f@(pQ*`?`xCP$Vaklk@pe8`U;i?hR?LWFvD*V*Cva+|kyR1H-U}iOD z6#Qt{_qNCA;r(rh^!@ea&#rCOP$7#@74(~*eG?au61wRW>Lxyg2PN!$|^v*VFMB`-fJq;L(g{djt}y~%TjCc7yLsB@G>2~6fKx3EFG(%>L6 z_UhTb1^~|6U3=#_vCv@l;ak(bPiJxuDg|r+n5|lhI{@%Tk(Ez>tU+!V3jk0o2<5Jm zr@iQ<;_1Pl>wU4-i+gV=7NNj8(5FD8fb$MU=V8fJ6{f%$HCac`ZOK0mq8I7WwU0`5 zBjD>Z_)Z|>M)=PPE3cQcBNQ85eguouig`5##X8oQB@v4Jy75nJQElHovabjV>n@@y-TLhEu3%lvEdeo};m+w7+(!J@9HHUjNLX zl`&)VWBgF%Amae-!WR!eiadNc#*ULZhYFL*j@p;1HWN}xJr_qktS=xgc$~SPMVRGk zV9edj9YmfyhVxndGy7*+Zhrj=cqx1Xj%$E47}rm#c%v6wqii6ow^M;VpI&JI&(%5B zqt&ykkSdRc+m*ZO%Y6+odH9H7(hup^27lEp`1W?EV~7dYhPuIzhuI0gGRiwtbb$Ta zBg0+mAaKG$DLv|CuO;%ol5N{ccBFG!|EL794dB6Q!jG&^;Y!O%W%pl zG-V_&Yxv+!CA5X@ioV@0Wv7{WU2kA{5ZAH||IYn?biw=&`VY?k$}Uy#j4>MUSTPWI zQ&iG}qVBHJ^!&q!zq(+Heh|3C>a$hGRzz~^taR~$a)L5pyu*P6I|e&5 zyN2eG=4tk8&DK(`QYnZOWO#C7vS@NKOEgDDa7k!CXFq2tXS2o9)X$WsxxD#1RIPs3 zwAAFZxx*#W6lhXnY+!29pj@3>&9>NH-Cjmq)~c1NRhhSF*I)Oyd9=Brg}QEU83R$% z?A#n|WoJ!k*D_esf128v8r&9~@F0VUAH70QNpDIY;@RjyCTS?Skv;Y0R4#b%BK?rx z&Ul(=dRcg(bp~E8xdv zZcal^-$^;5_EhZD;WTyf`ByCW^WA+%xgc0#fKF15Oa5;oFoEzRljl~A79WaPcEMnRvot2Tg_}g^7~UY^Ywn_ zRPvMqL8MN|!Qu?2)i0~K{t!Hl$mmF;D7i$p7-O1Q!3LpO{7h3h|kt!V!=4qSna(A9gvT^M$F}X*XI2RGI~3A8+Rv=GLwJA z!p*;Ms_!DQjG}^%ghw(R1c}j-Nc$sC#9dAi&vs7g%a(}a-$&nP_mY2BY&K>YY|hP~ zb*{>-8IbZjxkJ>Sbx^p3XRkGaqvBHs1Rt`VBbi5$?Zf0OBqP}=7@m^+$z1`?teM(u zcVzd=)@Qs58d?81=n~h$&+r*@)T!Z9)e93|oMwg61ASA@C2q`mJE)Ou_vFVhV0vZV ztI3mzhB3q^@h@ljPbVaOBwH!XB~cniy!6JuI;$Lk_0sPC2%H`A7q6lWF{-4$$2N02 zFKAbu7-iIibg~C%I)%RJ9SiGiLUB6AHNe@63_f04IPla-j9ywCxYu!(SV`d1eIZ@Qhy>1TOe1tBv@ZhK(ne zS4s%}j7d&Jdw4UrwYXdQdk3^^bZSycPXDX^h5kQ%vC|*xO;$@cF0-e!fgM*OzZVc@ z9oG-Cqg@CC6a&o#+Xd*I+Fir7T+K)L;Z6FTvqiO*v-`;~+7Gk`OcsLXrPlcc`X4g- zuag#E9jg!wGj=`Zp84|Pi{Tq2d>PtiaZ~i)J-o)=yk@|cT=j_$tlGkyWAvf7qvv;2 z$Ue_j&e6-hGqW~p)1Hu>T|C+dxK}|i5`GbpHt|W@0C9)``O+MQ3w=YGx&4&l39 zvqTg%2kzTUZ8{RVp0yEqZT(Psirbg!keV_-|L%2OkJuwM`fik6EBV&>$m>Y@F?CLR zxcy6ec1^3fQ|oC!XH%f<^&xGZ_|*DEr~hAyr^SUlpv-zFGQjnE@cMF-Vm-uz<6&yN zeZ`mKw7NsP_iM+QF z=0!Z`o9K4(n(_d^x5S`3-PGqfla107jw}HH$xHx% z(lzDnpfUhJnxLjAukW||+oIbAp-Ng7rjdhoa^yz;Hgu1?83pGWfRYftJ_mXOJKa7$ zkmcHaB!W4v&B6AR$uF@kSVo3EJKT_W^CM4GPN!;AW0QAp$wRHHZKK;8x^uH0z|(hX zF+1ODoTiaSZHYU}`aH2O$r@f_g}IAN*H^*0oxSCW^bJ0j9x{F%B|{1CCIUE0WF z(wtj){|kEptKY5jjjv0|%KPRwwfzEg+B=s4x%;h$W}DZQaPHV5o^d$*#)>Y=%3_KA zq?psRcFEf!1A2JZb+t8KAHPHOS;%k%i}?>uCAXkQ(B|9PCBxGZWCxE%7sO&oYDC_^ z0BT};G}l&h+$Kie14em*9|=3T<3%@>^aIfW8v_y zsZ#2UyvmwmcR$jrHP5kuF9TkRR8dfqwu=nXqc*KW94_!BN{3@(T~>Rb9<7 zt6I>ec(T5MLDyLZG^>3+X>!SZPc$ndt(K$pxv z@2>0Yt}CttpCmF9OA@cY{DqzkyINm_(8X`gW(z{B&P2O8)55d6f%ZS)MVyWZFCz4J z$0q3x`E;`Sx@49wpRuD<-n+-F4Au7E>$?RJ?ms`>)&$fMZMt?~#-I&iR8%QrTA&)q zP~lH(&O{rCSf*d&JC)$cxG|*kxDXZVS^a0IL$+T%Ps2Yr+&@z?jwhO#$-4+TKSbxc zfFm}fGZfHiJET;Nwu2BtjVl5ng}^pwY0%LF`75j3jU5S$J>eR3IySvBW!t>=<$enR~Axd7nZHzZG^*-tpI$Fe=n%4_WkjwtM`FnWs3dKZviDm5izP4wUM*5*P$c?-j7Z-wsaXtJ^l6?a6Eew7$L7(rMJ!$*Lf9uMz><<$bCnowf;wU~W z8M%-_tptGTrmDH zFlddij6Y<;Q%?W3_4wP5Am%zK8mBiVn2ypAQa#Tg9S`!zkc?J>ST-fod2jCyBbh)7 z&1G4-Z7}|3bG~R3p1b4P?#G**q{j;M1Ly2LP)iz`5Vco2R4v6aQo}6DHb;8;wqQxu z(Rb9!7p0_B%y&op9^W(bUiZI}ZBs-c%>_nTCN_sse?xwEd%7*t&VRf|PNQIz!{K?i z{t-$Ym%IL2C^RXPr7!|56_a$+>Yvoi7>9D^f&{lCD{X1NPPyAIl%9^vQ?mJ5mlM*r zG+%9!73Qo_h-z_-r?|46izABW@c^#Ve+;Y?Okda4dxD+y_^?-BruMmBxwxwd%Y3Cb8mRzrKZ+Y^eO9U>F$Y?uyoqFX`vg!PWlg&kFXCK9I+bf2)v#$ z9V+3g3^?_GBvmylx5r=dLv||N8q)~`4ohV-;$%x*nq(tq)9uel>%()61T)DiH8F)1 zO_F%Nqq{?B%oc{TwLDF-iaeWh!M=|TpTn!>cN9RmpIgSL8zyul2{SWR=utf~Iy&Dz zBn5veR(2uB+=tX)YJ(QNUk>-;U30`1$%`p|b&wp{ntr4uMx3(F9&7o76rS4-F_E*6 z4k0x%u!hRP7<#4#YE&L_rKDMuXx0QZUc^~6{CtRN;9~ehG?T-^BtVdB)HAd_g+B1b z#)ol2LRs~3+|VeauBEzr3VwzW;t&+MZm&yLVW#0DjLC}5iY~%{Vr9Pd_IJ3oSYB%c z6(2&`=cv3_3`-BoC<)4-L~s0(ytpq@-rhuybCVnJ zH!VVZ-T%(c_b)HK)1kh;zNw?T_y3`wCeurQczb)h0N(IsX~$B}Zh=a@27^2wC# z`*8!8dB}2W4T0Qzx_k0WYmH{4uv}xdI-@Xc=#qKtgF;Yf2S2Axlj-C>a({n+YC%p; zuGX-URjsDB_BsX?V?}z^1dA$SB`=RM$`B7rn_VO5nq>M{Ui<6Vf zpLPd=5veZ?nBcS!1bx|@gZSpj)qjbDJCOX zI)B6^Lc+)g%?uh-mh`=XNz&a>!E40#P_VB^o)vR`e*XCQ_#6Pi!NHx~-Q67>@9o5^ zp)~2UD>~-8@g}yMxtNT*Eb~p9enJ1CcQ|WnYXv7RE-snYWo2c23qT55oacdQldFph zo#?mbX=OdlKo2)ACAKGy)a@^GOVz;hUiH zWG)yUR>{lLcgP*~#Jt+-RC$Hj+DM4)pkaeoL;OY%%APvv(R%;y(y6^?srGHgINLTE zw`Wk${o!00t6E}G(t;2lS}~F$Ct=L~!}j@bVVajw!3RAolob_9xuGg_bl@raJNjwU zH%y|dGlrVK`=e{|o-arm>u`2C0fWldksagX<9i+sDGkqW<>#-M7*1mB{_sQ)`OF^w z?x=9HJbQ8@?oH(HcEKwxZEZ$I#_8t*6I5^n2n0G1p*$jPc1B0B^(Y@t{Wn%tR;<72 zber-}khuVLb!GpPRKpovn=v2V>1bdQRkHU z-j|#Z3oz*Pt1Nq|JGez0HP{EIDx+LmFaC}nB|N(NePN!+pi{i^aY^Ub<>lqU!3gXA z!NI}hB{_8dZW&uGrC>sPS`+Vc`wASD{%AF28GHq!h)J_8hljnj%4*s0M`!Ig1Nz zVuqN}YMUbH=M0|=3BC*r&55dSn+3T2b8Vp`N=M9d|5RlHY(IX^o&$uSRI#>Y7*20&^uUi`nOJ7@i^XKtQ7wyPX1|?J zQYRY}Zv34ebKDGGVKKCPchvYXCYLn{43`- z(U%i9Hhxey1HIS?l)rOnY+%!)bZ}}jUUgcR{MtFH$_sWb>FkeioWFWe^WpW~`o(YB zQ9)|L&g>Vf&3B#alqVrZ2#U)qpszANfql1151EATpRcPP5SG86>}aK154Gej*dW6f z|2jo94|!o!RP4Zwq@{U*tJTN%+&k2#V?8JHO!TR;M}+&NNkGq?P4G5C&^ad$3G~Qg4j*n;%4r;e=U=h|(v!?RhULGKF*V zx_936yd*0n*>eP-#-Y~NVV0HTYe~1Lk!%p&gT6sg5-?RNSex$do@~zGh>prVo|3Vn z3Mycj`ScOibLLLx1QlD3IKw5I(UQ&?n{5+wd}omkO@{`dj&znmPAarQR?|=!(7|Zt zwU_2GQ+_+sNb{UD`#Tf}FJ_c4+#OwB;2Cs3bI&!+9bP;~%+;08C);gTsCO%mi)3zg zP1o>x)q$(}r2V0{WNw@Jm^hYU=Z!MdD*Tpz2xUnRbKaC)KMq<=!4mFaKhdxCEd7_Sv4gs|N zqa$v-{%1V+HD>8IyhtGnf^}D8*C{vt$lIe4#+D-$;_J-jhZ%?1itRa7!i#D%%|TB@ zkYFMwtSF{@_a)j^UcDHUrJ;Z3O1eEKM~sqL0H7bAY!yaBW_B`3%woV@AV}b@h%>W^ z@`k5j1#hZ!bRxD$H3dCcbO-&fgS9L<)P7H2P5K96rl* zyL1Z72o3Eeiem1IJ|QORG)*6!sU+zW5UFNulWw<3A%|uvUY4rald2Nf3OSLiis%Tg zCYw*!$4_JYaY}Cd-a8_%Em-N{_eB8DN_v%sww0A#=%@Ek+-wv0yl1N(qKZvvD(`C& z<=Vm|{lYYHVM>}$<9C7(q*hO@1KCwQp)>x+Bz@M?L8YLr%f*zzFk=hT#CGUwg0cV` zebx9r-`%nPq-Mhl>|Q??DY7&c@COGAn6hss-Rl&+bhd_~0Xa%`eRyMalEz!Vr*0tF zEO-1WtR+!?1HmET2m8ID#csevgoXZ`2Qn>_WF{D|6Gd4W7|4k)bSD!yX4jbsUW+NF zn^tKt{pnyFS3_e!4g!wzkIL}Tm2}^8JL=KbA(}h|hsC~@Py_XyQ5Q$P(ryhQ`#uPyD-3@Z@hPNR|3oERrO`LK+xQZouCEc0crcotI#8t{%CwvX8%yz^- z7j?*lHGc$o(DKgGngEwbBr=aRRwUgkp47MOU%@?&xb#;Sv#Jz6uN)*s1qr2GksW+@ z?z7>?dwDxi6N7f`QpDLu!09|(jQ2}iFB^^aTb=N_BHyy#SVkd!g5|3`(p&qOny&&0 zK3-yCJ6Vaya;ZUT3}5N)p|gl)S(;=nXDvbM&db)Bx17c6Wa_@GKRXoiLyY)61nC7z z@%>79&-os-BI_;gm#Hqo*t>{PLnlm&a1p8TpaNb3!4Z)rMK z()7=koY;%SyKM2QRX|9@{DgQ{EKv$9+Oic4Ejl}4Ek0$I@7Gz;1n&CbdIDo+x^k@N z_B~c~I~}@(lUx>QdY8vTwSc#0-rFI+xV>51f@A^Sc2D-i!6Czt~ANG#KQJ&)p`n z_iz??=wAt9`Hj?a?v0MdJR#S~bq@}9mdqH*H@XNhAGBQGd;fy|F1{!Rh%O&NC<6mS3hT!mDh}^EMxzZ{*y=)RLOkX`w35U+B|1udUl7*N+KyiO z-g_~yZ_$3EXP7tpSEAh3G1nl%m|qY*hIb-_BQ#+ZRxF-AN&gzlFeC7Y|K$Q@6+%S9 zSms&>nXss6i(xU}@Fjr}kSsCBQe2Un8Elob8)2}Q3Fe2(VH5>#afk_?sFdpBP)t!~ zy0(JTbVoS@5xvfCs?Tcg+6Zy8+MJ;Lvc&k@$pkzgB%z|_uldPUsE~odEau~wu52Jw zQ=wAjOBF6|>5zk0#AuVQb38D(2JS3*6p5mpU}LHW7JjY)biUd5*J`L84VgFGo->PI zDVGqy^r!l5VGqyyBW95%Dnam@4q587;d(%I%?|VAI4PJ$Nub_O`Y3=`D13?+;O}o$ zb9Mw&clRVWKj2+>xvY28>jKcbQgQn^mpI;p_kbN^{Rs`xyG7#NYy)u*(-*(z?b=iL ozexVyfc}3KKmGIeAM619ppuYNZQ`rvA|60ZNlURt!7}WB0CPy$u>b%7 literal 0 HcmV?d00001 diff --git a/tcod/fonts/prestige8x8_gs_tc.png b/tcod/fonts/prestige8x8_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..179450496694a5c66965dcae290c135a54c06e88 GIT binary patch literal 5516 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 ZmXSxB@u}&<%U_VnP}fAK{I2u!e*z(Ev0eZG literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal10x18_gs_ro.png b/tcod/fonts/terminal10x18_gs_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..24e1547663d372b0f7cbf0d6a3c91da0d69c6a03 GIT binary patch literal 6442 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 Eg3I(#8~^|S literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal12x12_gs_ro.png b/tcod/fonts/terminal12x12_gs_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..06fff6a2d9505bec5bfa491d0043e3928db3e7da GIT binary patch literal 5260 zcmV;76m#o|P)=^gb`h6C;nGfW&d2}GUy^|zKYmz-K0ZDy zCd-a>^k~3O7Q$a`xCE1%BzF!mT=vDXE z>mKcPcFkV+xmHO~TZ({23hu@^TMMM5Q5sVPg95VRXzM2`x}e2&0*Py{1_w5}c0#DF zT(s7^)6w2QdPfJF-I~@jqALcp!rJ7;ebZgfU2#~+j~cq|@MZypi4M!( zg$3%mRNp6{*8S833Mv-4*}|8%?GK}3+cs_E84UxWwr=gaW2W2FbqqWFgvKBe)N2mT zMKyiRE@B}}j+SH7-%G=331fv-iYMW|Qv&C|Mo9t0C zesyOM(Zk6!lF?`eFaJ94b;u9wPhu@s17F{oo;`L#gxdm6vfF6o@!uBGS9A2W1@zUb zb@F**2FOJc(i2bkHtiz2eLp&l`Ng2iL*{uF=8c6yKIce!f=XM_`fY26pZ(!2sV@22 z+QGoDLc;K!7&{C6H(f!HxCNMe^<)Vst6Dr}+Z!+>qIH6?#VX3s8zxggWcygP5hJhU zcP3DIp2f9hIZ+(el+DNjf(x=S$mktX)OKNjT0rf7M?kGCM%MHsv)$RAbXN-qa!6oS zKwTr<1mQR^u;6b?jPBo1fu$`ReHj6*^;nlKD^#n|{sCXt{SwP&;kim3&9THCaG#Hs}?uQ-YmQ!)&+d5k)w%F_WU^-ekNM%Sf^- zi*d8x?fMt$?*5iASl8Q5myuY*!>*lKf-DJE%Jw>5F7_1iNkd=||^;o==f&HQu3)YkckW9;lB4CRlN1HYBeF64sg&fFGK=$jYy`#lB zZ?$LvRHK?LtT4d>uhuJ`Zd4>GE5Q=v$Xa*$wq{${f(YQG=awx+ z)YQHqC?H#psl8*Dug-reYp&_##-P0x-d&yU7B4PSiuL9O&-a zYW-_HIg)*IWC8`9b!n=HzZF?AxWl;3-2!&Jhqoyi6@82rbbdzr7KwmJkHTWqL?;H{ zdfzt=GpflM6`q^YLfp5{BgseJT$20*F0*);xs2Ll_%Lu7cs~Zn(OR<7d$Be(B7$J- z85Cj`QQ0+5Op%xgCS4pm>kPg%c?B!lDF59Nvi@~qZSw=cazxT6F%!(A)MHz;1@y^m zGw;@nwAU<&qPo_dRR;VsjGG0d$Kli$7GZ!$mfJA`vNeMxfzlS%N}yI@njlV1y`bCv zsjI#@S+fLWQ>&{9!HZY9#d=Tj^6wu#0p7>g5^zO+*d_7G--FOJkZMQGh>$<66w}vg)P8Y(B zX{RP^9(zO+N6?owH7g+UVWe~t)*(4aM{3nOu4Y-QM=X@~xDj1Q+QX)A3r6w^VGEKA zw>Ga4ONj!i!`3_M{O)1kFmM<+3>*gDjDc_gbT8kqB~QOY!jG@dF1PU0r6HG)l77_{rVXJc4cIXaVOCw z8T|oeV{L*B0X1~{aN6wG3325sdm%jD*;Mr;_mXLJ_{VUfUwO0tjJN_2mo33)n);^8iK>wsx4^C)`K+bKE~FA ztlbo`);yCw*dy19vf?_xeH3NA@xG#>}$$jGO{x@^@-W&P0pK@7tNSoFhN^cfz%_j9?!@}wqNJY9N!w>I7o^y0Y zlD8NOs4LO_+zv2t#7y~mohHjgg_D)NB}PIk6DmcgY83|2 z+#?{%5*ddtj6f2q3C0TuS|Kn?4KZRTK}m_%8>)~STsw5W<^)WFA-$^!TbBRb2P ztagmet}q)sQT$UTP`xrniG|jAg>Fwg4IqQs@@QusJftA3C^Do*8Y8^bO;}4`_}W}y z;ac$9>RTa5QL_lS(^po^$Bt(}^s#?DiMZ3(WM~I|7&r_Z2HHd0o|5*^{JyLT?!G)J z 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 O%npp#LX<{$pVQl2v!drIxI;H0(9J zM~{TLKOWq+4bP|1zl9M;z;mVb;o9B|sl_(7@u2GfTI|Z~KU&v$u0M`-=*^<$!AKHpCMR>S${RFFo=-T$E_2 zAlpFX8dd$xcxB5K2s|HvWA8)YJ2suRuG4IaOmF|_gP%7z$yHF({EzVn!cUgl9$H&l z_p-O!GS97fD1M+2)-YeLff^11EA!UcTJ|F`mxi2Caee*8(%rdmuBP|hjZd0tm~aiL zI+m70jR1+d>*(>T+uK{`t$0=Dj{3_W16CfM@KvBY;rwWlo|c5jHeN}|is{|a@Fxae z`}&l!)axrNrR^<2V@#DlS1cCnGU$>wi`?jOc1q+5GCBHy2_bO0VmS=Wf-uMp{{KUz zC2v_-nF!U#+S;>W&)W(Na!%^0j$`;-ec-^@7`^SD&cZg{zU&j4#B2EcaM-t XYR5(S$E@JjFf=83b-4<-S@8b=ZM~Yp literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal8x12_gs_ro.png b/tcod/fonts/terminal8x12_gs_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..125ce45a62f759ceb27d693c291b3f405c86f21c GIT binary patch literal 4504 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 E2TPyYAOHXW literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal8x14_gs_ro.png b/tcod/fonts/terminal8x14_gs_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..8315362bfa9fdd580cbddd5544cf095378a0cc4f GIT binary patch literal 4564 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 Z{eKVIk9wwIZZH4<002ovPDHLkV1hh%F~9%- literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal8x8_aa_ro.png b/tcod/fonts/terminal8x8_aa_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..fc797431a75cecf543e8efa158bbe74f62e85cc3 GIT binary patch literal 4545 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal8x8_aa_tc.png b/tcod/fonts/terminal8x8_aa_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..25f83db8d7b8c5bbac5cae37ce798b65d3ba62ef GIT binary patch literal 2899 zcmb_e`8(8$_kWwl7ADkmBg_I zFyfMIHL~X>WX*`UWUPsi<)iNp-+$oq`Qe<`Ip>Gh>p9Q!dY*IQ@pd?=z4Chj0Fbh_ zGIsy~q1_TN6%*ObtL`uAcL7Smp2q?}d5XlQm+)>c9%AJZ1^^PWze1>IG-h*mC>m~k z-a>RhLiiv=FFkei(C$b++=3YHc-22V((9TZfcLr*9IkC=K|qkv+NZR2b#%U8`wIZ} zzP2{U5~42g-CUD{PD#G@ps18f#iSCU=Y03g#f_H1Zby;lZBw5U$e`VZZNrE|;Em+{ zEyrquG|sHW2)@*9zn1*Dwspp2BC!44%KG(W$K{}0(&%u}l>$y_k6}dFmTsNqkI|3B zk>|@-x#@hfF6ZSJ=;XHpnY!FBnnU`NOLtZVD1Lcq9vy$XY#!V4xd2jvhf5osp{0`_ zs;gn=lnx!8ixjyFu@YXl#mlu8u{SW{^ugTs8#I2*2x zCr=e|xv0gxGT@WWO+~)L(yi@?XlEJK4GUzVRxTkMyrw}t1~VEkrW7ny4xcS111^PK zac>$&r4kZ-JL9#=4ZGb`Nv}o(E}w4S#tS`zP`ociSlf!S8o?)A^+d99Nr;p0ftrbn zOnl999}$cxP3Y~vhyo5=;lMn9E2@6Mq=Ah!ji&=dd4vpW1q;aCf(Obh2aw|%Xb8_j z3W28ynsr0s$DUYTZ!V!j@B*)9TzUrQ??_$?eG&MS0-K}^t8>arQ zr+s~AC+?YQrD{539CgN#{JVHjl}FoB(U+=_#Qe~GTKPoPjEO~!s({eHt{ zN0d|06vkly1XWcpPp`~Ra?*UbT7509E+vHhKz&+XiAPDSmNi(6EtAW@ z7+?uV9dM!E|7S!Seio8M9P;ACkz17?iG9qGNgdSVn>uhN+_V|A6|lwV$Vs@<1j>Yq zsHI8oPqZAnU6aup3KRlX;kjTwSrdb17@0w>BNeez7?rfxFSG#mjPP z_ibKNNSSxYza?ATa?uqunecU^=ll&TN?#@RqsM?qV|Q9J!Au9&hQRR=mf9Sd#IQ;J{ z<2ESnGwUcmZ`EfX1rwm%A*iu3HFHbP!Ut{L{juCSgr$)Q;T!HudC|a{40kxk(>Q+ z-*3(8crPArqSHC@xSUA97HD{m2+{~k$`ea7tqX+6;3vICa04(%fjf=xwBc_U!pT9u zanL{?2xSio88lr4D-3t6M5W`~j3m^>$r>)S&UqE`Vg%~H_5Sg^tM$(3z6 z!R3up49LY3>a8ejx!^*d)X{6KIis9RL+h^YNh@Arb=_vv)^`7GvJd|y^&-9V4C54k-0wxG0r2e)XS31ycH-Mc&}7mmNVqHlE% zK0;5)uYYDGKR41J(`?1@6F|-@m7Ix?#8>9tB<8wpv{XUs{^^tlrsPola7j61G*cU! zQ}DrLjS)8h+S-0FabpNtY6>!LmcH-YUohwJuq!EwWZ*PS;s&op&h_>p^J{Yxs0Aan zwb$WT?{mg`WQ5qk=Uw7-IBYi^KVOnHi7fP9Dbt5zejtxTx9jS%dIS0WOTnTKF1>mO zzDX2)mWEckMTne|<@C5BC$*aVH~c$&agDWVi%hJhTsHM7#8mi@#HQFQ$R%N0%Q*U} z5d^zz_f`zW|6pz%s~Osvr6{BQ6C2}6(F*@NdL%sXT!Q%^Yr(vk4jz&02B4p z2!MN{s6|kn$tbA(q<`T202NDAEFcKGod*&S_G2#{6~_<6fDhY3xIPw^T6zseUv$QN z=qZ7vNQL zIlo(G+O|jO{QEmL%U(o(aaV9L!;KT0u3K(ildunj{)6k2iIB;kB@a@ qy9!Zeyq1oi&qWIUdo3kN>JC7s1-6L7vG%*)E?{k8XU;zBN&63quVvN% literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal8x8_gs_as.png b/tcod/fonts/terminal8x8_gs_as.png new file mode 100644 index 0000000000000000000000000000000000000000..36a19378d60a4337f53c7de40b02e9bbc09642ab GIT binary patch literal 3503 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 literal 0 HcmV?d00001 diff --git a/tcod/fonts/terminal8x8_gs_ro.png b/tcod/fonts/terminal8x8_gs_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..e496e2bc51e13930320d5938f18b67728f75f02e GIT binary patch literal 3696 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∋&%JpKQ!Bxhlm{_BY*axIW11B)n%;Q_`m;yb!UaYC=pC%&J6ev4ZRv-ffEPPr19%=#WFaY=U<}tRm94wykG|$5K{l$jnwfsE-@^E6kea ztr92*BZDh4l^Zk9sF^&^bQTYF!GbUQzI~~m{2g2>bt=L_pmSdw`RF%|gs;M#EzFzL z { + unsafe fn as_native(&self) -> &T; +} + +pub trait FromNative { + unsafe fn from_native(input: T) -> Self; +} + +impl<'a, T, U: AsNative + ?Sized> AsNative for &'a U { + unsafe fn as_native(&self) -> &T { + (**self).as_native() + } +} + +impl + ?Sized> AsNative for Box { + unsafe fn as_native(&self) -> &T { + (**self).as_native() + } +} + +pub fn keycode_from_u32(input: u32) -> Option { + match input { + x @ 0 ... 65 => Some(unsafe { transmute(x) }), + _ => None + } +} + +#[test] +fn test_keycodes() { + assert!(keycode_from_u32(0).unwrap() == KeyCode::NoKey); + assert!(keycode_from_u32(30).unwrap() == KeyCode::Number6); + assert!(keycode_from_u32(65).unwrap() == KeyCode::Char); +} diff --git a/tcod/src/bsp.rs b/tcod/src/bsp.rs new file mode 100644 index 00000000..d109da1f --- /dev/null +++ b/tcod/src/bsp.rs @@ -0,0 +1,487 @@ +//! Port of BSP toolkit. + +use bindings::ffi; +use bindings::AsNative; +use bindings::{c_void, c_bool}; +use random::Rng; +use std::ops::{Deref, DerefMut}; +use std::fmt; +use std::mem; + +#[derive(Copy, Clone, Debug)] +pub enum TraverseOrder { + PreOrder, + InOrder, + PostOrder, + LevelOrder, + InvertedLevelOrder, +} + +/// This struct encapsulates `TCOD_bsp_t`. It mirrors original's fields (`x`, `y`, etc.) +/// with the exception of `horizontal`. See example. +/// +/// # Examples +/// +/// ```no_run +/// # use tcod::bsp::*; +/// let mut bsp = Bsp::new_with_size(0, 0, 50, 60); +/// +/// assert_eq!(bsp.x, 0); +/// assert_eq!(bsp.y, 0); +/// assert_eq!(bsp.w, 50); +/// assert_eq!(bsp.h, 60); +/// assert_eq!(bsp.horizontal(), false); +/// +/// bsp.x = 10; +/// bsp.y = 20; +/// bsp.set_horizontal(true); +/// ``` +pub struct Bsp<'a> { + bsp: &'a mut ffi::TCOD_bsp_t, + root: bool +} + +impl<'a> Deref for Bsp<'a> { + type Target = ffi::TCOD_bsp_t; + + fn deref(&self) -> &Self::Target { + self.bsp + } +} + +impl<'a> DerefMut for Bsp<'a> { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.bsp + } +} + +impl<'a> fmt::Debug for Bsp<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!(f, "Bsp{{x: {}, y:{}, w: {}, h: {}, position: {}, level: {}, horizontal: {} }}", + self.x, self.y, self.w, self.h, self.position, self.level, self.horizontal) + } +} + + +extern "C" fn callback_wrapper(node: *mut ffi::TCOD_bsp_t, user_data: *mut c_void) -> c_bool + where T: FnMut(&mut Bsp) -> bool +{ + let callback_ptr = user_data as *mut T; + let cb: &mut T = unsafe { + &mut *callback_ptr + }; + if node.is_null() { panic!("Null node when traversing a BSP.") } + let mut bsp = Bsp { bsp: unsafe { &mut *node }, root: false }; + cb(&mut bsp) as c_bool +} + +impl<'a> Bsp<'a> { + pub fn new_with_size(x: i32, y: i32, w: i32, h: i32) -> Self { + let bsp = unsafe { + let pointer = ffi::TCOD_bsp_new_with_size(x, y, w, h); + if pointer.is_null() { + panic!("TCOD_bsp_new_with_size returned a NULL BSP."); + } + &mut *pointer + }; + Bsp { bsp: bsp, root: true } + } + + pub fn remove_sons(&mut self) { + unsafe { ffi::TCOD_bsp_remove_sons(self.bsp as *mut ffi::TCOD_bsp_t) } + } + + pub fn split_once(&mut self, horizontal: bool, position: i32) { + unsafe { ffi::TCOD_bsp_split_once(self.bsp as *mut ffi::TCOD_bsp_t, + horizontal as u8, + position) } + } + + pub fn split_recursive(&mut self, + randomizer: Option, + nb: i32, + min_h_size: i32, + min_v_size: i32, + max_h_ratio: f32, + max_v_ratio: f32) { + let rnd = randomizer.unwrap_or(Rng::get_instance()); + unsafe { + ffi::TCOD_bsp_split_recursive(self.bsp as *mut ffi::TCOD_bsp_t, + *rnd.as_native(), + nb, + min_h_size, + min_v_size, + max_h_ratio, + max_v_ratio) + } + } + + pub fn resize(&mut self, x: i32, y: i32, w: i32, h: i32) { + unsafe { ffi::TCOD_bsp_resize(self.bsp as *mut ffi::TCOD_bsp_t, x, y, w, h) } + } + + /// Returns `Some(Bsp)` with left subtree, or `None` if the BSP has not been split. + pub fn left(&self) -> Option { + unsafe { + let left = ffi::TCOD_bsp_left(self.bsp as *const ffi::TCOD_bsp_t); + if left.is_null() { + None + } else { + Some(Bsp { + bsp: &mut *left, + root: false + }) + } + } + } + + /// Returns `Some(Bsp)` with right subtree, or `None` if the BSP has not been split. + pub fn right(&self) -> Option { + unsafe { + let right = ffi::TCOD_bsp_right(self.bsp as *const ffi::TCOD_bsp_t) ; + if right.is_null() { + None + } else { + Some(Bsp { + bsp: &mut *right, + root:false + }) + } + } + } + + /// Returns `Some(Bsp)` with father, or `None` if the node is root. + pub fn father(&self) -> Option { + unsafe { + let father = ffi::TCOD_bsp_father(self.bsp as *const ffi::TCOD_bsp_t); + if father.is_null() { + None + } else { + Some(Bsp { + bsp: &mut *father, + root: false, + }) + } + } + } + + pub fn is_leaf(&self) -> bool { + unsafe { ffi::TCOD_bsp_is_leaf(self.bsp as *const ffi::TCOD_bsp_t) != 0 } + } + + pub fn contains(&self, cx: i32, cy: i32) -> bool { + unsafe { ffi::TCOD_bsp_contains(self.bsp as *const ffi::TCOD_bsp_t, cx, cy) != 0 } + } + + pub fn find_node(&self, cx: i32, cy: i32) -> Option { + unsafe { + let pointer = ffi::TCOD_bsp_find_node(self.bsp as *const ffi::TCOD_bsp_t, + cx, cy); + if pointer.is_null() { + None + } else { + Some(Bsp { + bsp: &mut *pointer, + root: false + }) + } + } + } + + pub fn horizontal(&self) -> bool { + self.horizontal != 0 + } + + pub fn set_horizontal(&mut self, h: bool) { + self.horizontal = h as u8; + } + + /// Instead of 5 `traverse*` functions as in original API, Rust binding + /// provides a single `traverse` function with an `order` parameter. + /// + /// # Examples + /// + /// ```no_run + /// # use tcod::bsp::*; + /// let bsp = Bsp::new_with_size(0, 0, 50, 50); + /// let mut counter = 0; + /// + /// bsp.traverse(TraverseOrder::PreOrder, |node| { + /// counter += 1; + /// true + /// }); + /// assert_eq!(counter, 1); + /// ``` + pub fn traverse(&self, order: TraverseOrder, mut callback: F) -> bool + where F: FnMut(&mut Bsp) -> bool + { + let mut cb: &mut FnMut(&mut Bsp) -> bool = &mut callback; + let retval = unsafe { + let bsp = mem::transmute(self.bsp as *const ffi::TCOD_bsp_t); + match order { + TraverseOrder::PreOrder => + ffi::TCOD_bsp_traverse_pre_order(bsp, + Some(callback_wrapper::), + cb as *mut _ as *mut c_void), + TraverseOrder::InOrder => + ffi::TCOD_bsp_traverse_in_order(bsp, + Some(callback_wrapper::), + cb as *mut _ as *mut c_void), + TraverseOrder::PostOrder => + ffi::TCOD_bsp_traverse_post_order(bsp, + Some(callback_wrapper::), + cb as *mut _ as *mut c_void), + TraverseOrder::LevelOrder => + ffi::TCOD_bsp_traverse_level_order(bsp, + Some(callback_wrapper::), + cb as *mut _ as *mut c_void), + TraverseOrder::InvertedLevelOrder => + ffi::TCOD_bsp_traverse_inverted_level_order(bsp, + Some(callback_wrapper::), + cb as *mut _ as *mut c_void), + } + }; + retval != 0 + } +} + +impl<'a> Drop for Bsp<'a> { + fn drop(&mut self) { + if self.root { + unsafe { ffi::TCOD_bsp_delete(self.bsp as *mut ffi::TCOD_bsp_t) } + } + } +} + +#[cfg(test)] +mod test { + use super::Bsp; + use super::TraverseOrder; + use bindings::ffi; + + #[test] + #[allow(unused_variables)] + fn created_destroyed_no_panic() { + let bsp = Bsp::new_with_size(0, 0, 50, 50); + let left = bsp.left(); // left has null .bsp + } + + #[test] + fn accessors() { + let mut bsp = Bsp::new_with_size(0, 0, 50, 60); + + assert_eq!(bsp.x, 0); + assert_eq!(bsp.y, 0); + assert_eq!(bsp.w, 50); + assert_eq!(bsp.h, 60); + assert_eq!(bsp.horizontal(), false); + bsp.x = 10; + bsp.y = 20; + bsp.set_horizontal(true); + assert_eq!(bsp.x, 10); + assert_eq!(bsp.y, 20); + assert_eq!(bsp.horizontal(), true); + } + + #[test] + fn split() { + let mut bsp = Bsp::new_with_size(0, 0, 50, 50); + + assert_eq!(bsp.position, 0); + assert_eq!(bsp.horizontal(), false); + + bsp.split_once(true, 20); + assert_eq!(bsp.position, 20); + assert_eq!(bsp.horizontal(), true); + } + + #[test] + fn split_recursive() { + let mut bsp = Bsp::new_with_size(0, 0, 100,100); + let mut counter = 0; + + bsp.split_recursive(None, 2, 5, 5, 1.5, 1.5); + bsp.traverse(TraverseOrder::PreOrder, |node| { + assert!(node.h >= 5); + assert!(node.w >= 5); + counter += 1; + true + }); + assert_eq!(counter, 7); + } + + #[test] + fn children() { + let mut bsp = Bsp::new_with_size(0, 0, 50, 50); + + assert!(bsp.left().is_none()); + assert_eq!(bsp.level, 0); + + bsp.split_once(false, 20); + assert!(bsp.left().is_some()); + assert!(bsp.right().is_some()); + assert_eq!(bsp.left().unwrap().level, 1); + assert_eq!(bsp.right().unwrap().level, 1); + } + + #[test] + fn father() { + let mut bsp = Bsp::new_with_size(0, 0, 50, 50); + assert!(bsp.father().is_none()); + + bsp.split_once(false, 30); + assert!(bsp.left().unwrap().father().is_some()); + assert!(bsp.right().unwrap().father().is_some()); + } + + #[test] + fn traverse() { + let mut bsp = Bsp::new_with_size(0, 0, 50, 50); + let mut counter = 0; + + bsp.traverse(TraverseOrder::PreOrder, |node| { + assert!(cmp(node, &bsp)); + counter += 1; + true + }); + assert_eq!(counter, 1); + + counter = 0; + bsp.split_once(true, 25); + bsp.traverse(TraverseOrder::PreOrder, |_node| { + counter += 1; + true + }); + assert_eq!(counter, 3); + } + + fn cmp(a: &ffi::TCOD_bsp_t, b: &ffi::TCOD_bsp_t) -> bool { + a.x == b.x + && a.y == b.y + && a.w == b.w + && a.h == b.h + && a.position == b.position + && a.level == b.level + && a.horizontal == b.horizontal + } + + #[test] + fn traverse_orders() { + let mut root = Bsp::new_with_size(0, 0, 100,100); + let mut counter = 0; + + root.split_recursive(None, 2, 5, 5, 1.5, 1.5); + + let middle_left = root.left().unwrap(); + let middle_right = root.right().unwrap(); + let leaf1 = middle_left.left().unwrap(); + let leaf2 = middle_left.right().unwrap(); + let leaf3 = middle_right.left().unwrap(); + let leaf4 = middle_right.right().unwrap(); + + root.traverse(TraverseOrder::PreOrder, |node| { + match counter { + 0 => assert!(cmp(node.bsp, root.bsp)), + 1 => assert!(cmp(node.bsp, middle_left.bsp)), + 2 => assert!(cmp(node.bsp, leaf1.bsp)), + 3 => assert!(cmp(node.bsp, leaf2.bsp)), + 4 => assert!(cmp(node.bsp, middle_right.bsp)), + 5 => assert!(cmp(node.bsp, leaf3.bsp)), + 6 => assert!(cmp(node.bsp, leaf4.bsp)), + _ => panic!("Wrong number of nodes in the tree"), + }; + counter += 1; + true + }); + + counter = 0; + root.traverse(TraverseOrder::InOrder, |node| { + match counter { + 0 => assert!(cmp(node.bsp, leaf1.bsp)), + 1 => assert!(cmp(node.bsp, middle_left.bsp)), + 2 => assert!(cmp(node.bsp, leaf2.bsp)), + 3 => assert!(cmp(node.bsp, root.bsp)), + 4 => assert!(cmp(node.bsp, leaf3.bsp)), + 5 => assert!(cmp(node.bsp, middle_right.bsp)), + 6 => assert!(cmp(node.bsp, leaf4.bsp)), + _ => panic!("Wrong number of nodes in the tree"), + }; + counter += 1; + true + }); + + counter = 0; + root.traverse(TraverseOrder::PostOrder, |node| { + match counter { + 0 => assert!(cmp(node.bsp, leaf1.bsp)), + 1 => assert!(cmp(node.bsp, leaf2.bsp)), + 2 => assert!(cmp(node.bsp, middle_left.bsp)), + 3 => assert!(cmp(node.bsp, leaf3.bsp)), + 4 => assert!(cmp(node.bsp, leaf4.bsp)), + 5 => assert!(cmp(node.bsp, middle_right.bsp)), + 6 => assert!(cmp(node.bsp, root.bsp)), + _ => panic!("Wrong number of nodes in the tree"), + }; + counter += 1; + true + }); + + counter = 0; + root.traverse(TraverseOrder::LevelOrder, |node| { + match counter { + 0 => assert!(cmp(node.bsp, root.bsp)), + 1 => assert!(cmp(node.bsp, middle_left.bsp)), + 2 => assert!(cmp(node.bsp, middle_right.bsp)), + 3 => assert!(cmp(node.bsp, leaf1.bsp)), + 4 => assert!(cmp(node.bsp, leaf2.bsp)), + 5 => assert!(cmp(node.bsp, leaf3.bsp)), + 6 => assert!(cmp(node.bsp, leaf4.bsp)), + _ => panic!("Wrong number of nodes in the tree"), + }; + counter += 1; + true + }); + + counter = 0; + root.traverse(TraverseOrder::InvertedLevelOrder, |node| { + match counter { + 0 => assert!(cmp(node.bsp, leaf4.bsp)), + 1 => assert!(cmp(node.bsp, leaf3.bsp)), + 2 => assert!(cmp(node.bsp, leaf2.bsp)), + 3 => assert!(cmp(node.bsp, leaf1.bsp)), + 4 => assert!(cmp(node.bsp, middle_right.bsp)), + 5 => assert!(cmp(node.bsp, middle_left.bsp)), + 6 => assert!(cmp(node.bsp, root.bsp)), + _ => panic!("Wrong number of nodes in the tree"), + }; + counter += 1; + true + }); + } + + #[test] + fn break_traverse() { + let mut bsp = Bsp::new_with_size(0, 0, 100,100); + let mut counter = 0; + + bsp.split_recursive(None, 2, 5, 5, 1.5, 1.5); + bsp.traverse(TraverseOrder::PreOrder, |_node| { + counter += 1; + false + }); + assert_eq!(counter, 1); + } + + #[test] + fn safe_tree_pointer() { + let mut bsp1 = Bsp::new_with_size(0, 0, 100,100); + bsp1.split_recursive(None, 2, 5, 5, 1.5, 1.5); + let mut bsp2 = Bsp::new_with_size(0, 0, 100,100); + bsp2.split_recursive(None, 2, 5, 5, 1.5, 1.5); + + unsafe { + assert!(bsp1.left().unwrap().tree().father != bsp2.left().unwrap().tree().father); + assert!(bsp1.left().unwrap().tree().father == bsp1.right().unwrap().tree().father); + } + } +} diff --git a/tcod/src/chars.rs b/tcod/src/chars.rs new file mode 100644 index 00000000..378faedf --- /dev/null +++ b/tcod/src/chars.rs @@ -0,0 +1,80 @@ +pub const HLINE: char = '\u{c4}'; +pub const VLINE: char = '\u{b3}'; +pub const NE: char = '\u{bf}'; +pub const NW: char = '\u{da}'; +pub const SE: char = '\u{d9}'; +pub const SW: char = '\u{c0}'; +pub const TEEW: char = '\u{b4}'; +pub const TEEE: char = '\u{c3}'; +pub const TEEN: char = '\u{c1}'; +pub const TEES: char = '\u{c2}'; +pub const CROSS: char = '\u{c5}'; +pub const DHLINE: char = '\u{cd}'; +pub const DVLINE: char = '\u{ba}'; +pub const DNE: char = '\u{bb}'; +pub const DNW: char = '\u{c9}'; +pub const DSE: char = '\u{bc}'; +pub const DSW: char = '\u{c8}'; +pub const DTEEW: char = '\u{b9}'; +pub const DTEEE: char = '\u{cc}'; +pub const DTEEN: char = '\u{ca}'; +pub const DTEES: char = '\u{cb}'; +pub const DCROSS: char = '\u{ce}'; +pub const BLOCK1: char = '\u{b0}'; +pub const BLOCK2: char = '\u{b1}'; +pub const BLOCK3: char = '\u{b2}'; +pub const ARROW_N: char = '\u{18}'; +pub const ARROW_S: char = '\u{19}'; +pub const ARROW_E: char = '\u{1a}'; +pub const ARROW_W: char = '\u{1b}'; +pub const ARROW2_N: char = '\u{1e}'; +pub const ARROW2_S: char = '\u{1f}'; +pub const ARROW2_E: char = '\u{10}'; +pub const ARROW2_W: char = '\u{11}'; +pub const DARROW_H: char = '\u{1d}'; +pub const DARROW_V: char = '\u{12}'; +pub const CHECKBOX_UNSET: char = '\u{e0}'; +pub const CHECKBOX_SET: char = '\u{e1}'; +pub const RADIO_UNSET: char = '\u{09}'; +pub const RADIO_SET: char = '\u{0a}'; +pub const SUBP_NW: char = '\u{e2}'; +pub const SUBP_NE: char = '\u{e3}'; +pub const SUBP_N: char = '\u{e4}'; +pub const SUBP_SE: char = '\u{e5}'; +pub const SUBP_DIAG: char = '\u{e6}'; +pub const SUBP_E: char = '\u{e7}'; +pub const SUBP_SW: char = '\u{e8}'; +pub const SMILIE: char = '\u{01}'; +pub const SMILIE_INV: char = '\u{02}'; +pub const HEART: char = '\u{03}'; +pub const DIAMOND: char = '\u{04}'; +pub const CLUB: char = '\u{05}'; +pub const SPADE: char = '\u{06}'; +pub const BULLET: char = '\u{07}'; +pub const BULLET_INV: char = '\u{08}'; +pub const MALE: char = '\u{0b}'; +pub const FEMALE: char = '\u{0c}'; +pub const NOTE: char = '\u{0d}'; +pub const NOTE_DOUBLE: char = '\u{0e}'; +pub const LIGHT: char = '\u{0f}'; +pub const EXCLAM_DOUBLE: char = '\u{13}'; +pub const PILCROW: char = '\u{14}'; +pub const SECTION: char = '\u{15}'; +pub const POUND: char = '\u{9c}'; +pub const MULTIPLICATION: char = '\u{9e}'; +pub const FUNCTION: char = '\u{9f}'; +pub const RESERVED: char = '\u{a9}'; +pub const HALF: char = '\u{ab}'; +pub const ONE_QUARTER: char = '\u{ac}'; +pub const COPYRIGHT: char = '\u{b8}'; +pub const CENT: char = '\u{bd}'; +pub const YEN: char = '\u{be}'; +pub const CURRENCY: char = '\u{cf}'; +pub const THREE_QUARTERS: char = '\u{f3}'; +pub const DIVISION: char = '\u{f6}'; +pub const GRADE: char = '\u{f8}'; +pub const UMLAUT: char = '\u{f9}'; +pub const POW1: char = '\u{fb}'; +pub const POW3: char = '\u{fc}'; +pub const POW2: char = '\u{fd}'; +pub const BULLET_SQUARE: char = '\u{fe}'; diff --git a/tcod/src/colors.rs b/tcod/src/colors.rs new file mode 100644 index 00000000..f930caf7 --- /dev/null +++ b/tcod/src/colors.rs @@ -0,0 +1,335 @@ +use std::ops::{Add, Sub, Div, Mul}; +use bindings::{AsNative, FromNative, ffi}; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, PartialEq)] +pub struct Color { + pub r: u8, + pub g: u8, + pub b: u8, +} + +impl AsNative for Color { + unsafe fn as_native(&self) -> &ffi::TCOD_color_t { + ::std::mem::transmute(self) + } +} + +impl FromNative for Color { + unsafe fn from_native(input: ffi::TCOD_color_t) -> Color { + ::std::mem::transmute(input) + } +} + +impl Color { + pub fn new(r: u8, g: u8, b: u8) -> Color { + Color { + r: r, + g: g, + b: b, + } + } + + pub fn new_from_hsv(h: f32, s: f32, v: f32) -> Color { + unsafe { + FromNative::from_native(ffi::TCOD_color_HSV(h, s, v)) + } + } + + pub fn hsv(self) -> (f32, f32, f32) { + let mut h: f32 = 0.0; + let mut s: f32 = 0.0; + let mut v: f32 = 0.0; + unsafe { + ffi::TCOD_color_get_HSV(*self.as_native(), &mut h, &mut s, &mut v) + } + (h, s, v) + } + + pub fn shift_hue(self, shift: f32) -> Color { + unsafe { + let mut c = *self.as_native(); + ffi::TCOD_color_shift_hue(&mut c, shift); + FromNative::from_native(c) + } + } + + pub fn scale_hsv(self, scale: f32, value: f32) -> Color { + unsafe { + let mut c = *self.as_native(); + ffi::TCOD_color_scale_HSV(&mut c, scale, value); + FromNative::from_native(c) + } + } +} + +pub fn lerp(from: Color, to: Color, coefficient: f32) -> Color { + unsafe { + FromNative::from_native(ffi::TCOD_color_lerp(*from.as_native(), + *to.as_native(), + coefficient)) + } +} + +impl Add for Color { + type Output = Color; + + #[inline] + fn add(self, rhs: Color) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_color_add(*self.as_native(), *rhs.as_native())) + } + } +} + +impl Sub for Color { + type Output = Color; + + #[inline] + fn sub(self, rhs: Color) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_color_subtract(*self.as_native(), *rhs.as_native())) + } + } +} + +impl Mul for Color { + type Output = Color; + + #[inline] + fn mul(self, rhs: Color) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_color_multiply(*self.as_native(), *rhs.as_native())) + } + } +} + +impl Mul for Color { + type Output = Color; + + #[inline] + fn mul(self, rhs: f32) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_color_multiply_scalar(*self.as_native(), rhs)) + } + } +} + +impl Mul for f32 { + type Output = Color; + + #[inline] + fn mul(self, rhs: Color) -> Color { + rhs * self + } +} + +impl Div for Color { + type Output = Color; + + #[inline] + fn div(self, rhs: f32) -> Color { + self * (1.0 / rhs) + } +} + +// NOTE; colour names and values copied from: +// tcod-sys/libtcod/include/libtcod_int.h +// +// We cannot return statics exported by the DLL here because they have a +// different type (TCOD_color_t) and we cannot call `transmute` to convert +// them to `Color`. +pub const BLACK: Color = Color{r: 0, g: 0, b: 0}; +pub const DARKEST_GREY: Color = Color{r: 31, g: 31, b: 31}; +pub const DARKER_GREY: Color = Color{r: 63, g: 63, b: 63}; +pub const DARK_GREY: Color = Color{r: 95, g: 95, b: 95}; +pub const GREY: Color = Color{r: 127, g: 127, b: 127}; +pub const LIGHT_GREY: Color = Color{r: 159, g: 159, b: 159}; +pub const LIGHTER_GREY: Color = Color{r: 191, g: 191, b: 191}; +pub const LIGHTEST_GREY: Color = Color{r: 223, g: 223, b: 223}; +pub const WHITE: Color = Color{r: 255, g: 255, b: 255}; +pub const DARKEST_SEPIA: Color = Color{r: 31, g: 24, b: 15}; +pub const DARKER_SEPIA: Color = Color{r: 63, g: 50, b: 31}; +pub const DARK_SEPIA: Color = Color{r: 94, g: 75, b: 47}; +pub const SEPIA: Color = Color{r: 127, g: 101, b: 63}; +pub const LIGHT_SEPIA: Color = Color{r: 158, g: 134, b: 100}; +pub const LIGHTER_SEPIA: Color = Color{r: 191, g: 171, b: 143}; +pub const LIGHTEST_SEPIA: Color = Color{r: 222, g: 211, b: 195}; +pub const DESATURATED_RED: Color = Color{r: 127, g: 63, b: 63}; +pub const DESATURATED_FLAME: Color = Color{r: 127, g: 79, b: 63}; +pub const DESATURATED_ORANGE: Color = Color{r: 127, g: 95, b: 63}; +pub const DESATURATED_AMBER: Color = Color{r: 127, g: 111, b: 63}; +pub const DESATURATED_YELLOW: Color = Color{r: 127, g: 127, b: 63}; +pub const DESATURATED_LIME: Color = Color{r: 111, g: 127, b: 63}; +pub const DESATURATED_CHARTREUSE: Color = Color{r: 95, g: 127, b: 63}; +pub const DESATURATED_GREEN: Color = Color{r: 63, g: 127, b: 63}; +pub const DESATURATED_SEA: Color = Color{r: 63, g: 127, b: 95}; +pub const DESATURATED_TURQUOISE: Color = Color{r: 63, g: 127, b: 111}; +pub const DESATURATED_CYAN: Color = Color{r: 63, g: 127, b: 127}; +pub const DESATURATED_SKY: Color = Color{r: 63, g: 111, b: 127}; +pub const DESATURATED_AZURE: Color = Color{r: 63, g: 95, b: 127}; +pub const DESATURATED_BLUE: Color = Color{r: 63, g: 63, b: 127}; +pub const DESATURATED_HAN: Color = Color{r: 79, g: 63, b: 127}; +pub const DESATURATED_VIOLET: Color = Color{r: 95, g: 63, b: 127}; +pub const DESATURATED_PURPLE: Color = Color{r: 111, g: 63, b: 127}; +pub const DESATURATED_FUCHSIA: Color = Color{r: 127, g: 63, b: 127}; +pub const DESATURATED_MAGENTA: Color = Color{r: 127, g: 63, b: 111}; +pub const DESATURATED_PINK: Color = Color{r: 127, g: 63, b: 95}; +pub const DESATURATED_CRIMSON: Color = Color{r: 127, g: 63, b: 79}; +pub const LIGHTEST_RED: Color = Color{r: 255, g: 191, b: 191}; +pub const LIGHTEST_FLAME: Color = Color{r: 255, g: 207, b: 191}; +pub const LIGHTEST_ORANGE: Color = Color{r: 255, g: 223, b: 191}; +pub const LIGHTEST_AMBER: Color = Color{r: 255, g: 239, b: 191}; +pub const LIGHTEST_YELLOW: Color = Color{r: 255, g: 255, b: 191}; +pub const LIGHTEST_LIME: Color = Color{r: 239, g: 255, b: 191}; +pub const LIGHTEST_CHARTREUSE: Color = Color{r: 223, g: 255, b: 191}; +pub const LIGHTEST_GREEN: Color = Color{r: 191, g: 255, b: 191}; +pub const LIGHTEST_SEA: Color = Color{r: 191, g: 255, b: 223}; +pub const LIGHTEST_TURQUOISE: Color = Color{r: 191, g: 255, b: 239}; +pub const LIGHTEST_CYAN: Color = Color{r: 191, g: 255, b: 255}; +pub const LIGHTEST_SKY: Color = Color{r: 191, g: 239, b: 255}; +pub const LIGHTEST_AZURE: Color = Color{r: 191, g: 223, b: 255}; +pub const LIGHTEST_BLUE: Color = Color{r: 191, g: 191, b: 255}; +pub const LIGHTEST_HAN: Color = Color{r: 207, g: 191, b: 255}; +pub const LIGHTEST_VIOLET: Color = Color{r: 223, g: 191, b: 255}; +pub const LIGHTEST_PURPLE: Color = Color{r: 239, g: 191, b: 255}; +pub const LIGHTEST_FUCHSIA: Color = Color{r: 255, g: 191, b: 255}; +pub const LIGHTEST_MAGENTA: Color = Color{r: 255, g: 191, b: 239}; +pub const LIGHTEST_PINK: Color = Color{r: 255, g: 191, b: 223}; +pub const LIGHTEST_CRIMSON: Color = Color{r: 255, g: 191, b: 207}; +pub const LIGHTER_RED: Color = Color{r: 255, g: 127, b: 127}; +pub const LIGHTER_FLAME: Color = Color{r: 255, g: 159, b: 127}; +pub const LIGHTER_ORANGE: Color = Color{r: 255, g: 191, b: 127}; +pub const LIGHTER_AMBER: Color = Color{r: 255, g: 223, b: 127}; +pub const LIGHTER_YELLOW: Color = Color{r: 255, g: 255, b: 127}; +pub const LIGHTER_LIME: Color = Color{r: 223, g: 255, b: 127}; +pub const LIGHTER_CHARTREUSE: Color = Color{r: 191, g: 255, b: 127}; +pub const LIGHTER_GREEN: Color = Color{r: 127, g: 255, b: 127}; +pub const LIGHTER_SEA: Color = Color{r: 127, g: 255, b: 191}; +pub const LIGHTER_TURQUOISE: Color = Color{r: 127, g: 255, b: 223}; +pub const LIGHTER_CYAN: Color = Color{r: 127, g: 255, b: 255}; +pub const LIGHTER_SKY: Color = Color{r: 127, g: 223, b: 255}; +pub const LIGHTER_AZURE: Color = Color{r: 127, g: 191, b: 255}; +pub const LIGHTER_BLUE: Color = Color{r: 127, g: 127, b: 255}; +pub const LIGHTER_HAN: Color = Color{r: 159, g: 127, b: 255}; +pub const LIGHTER_VIOLET: Color = Color{r: 191, g: 127, b: 255}; +pub const LIGHTER_PURPLE: Color = Color{r: 223, g: 127, b: 255}; +pub const LIGHTER_FUCHSIA: Color = Color{r: 255, g: 127, b: 255}; +pub const LIGHTER_MAGENTA: Color = Color{r: 255, g: 127, b: 223}; +pub const LIGHTER_PINK: Color = Color{r: 255, g: 127, b: 191}; +pub const LIGHTER_CRIMSON: Color = Color{r: 255, g: 127, b: 159}; +pub const LIGHT_RED: Color = Color{r: 255, g: 63, b: 63}; +pub const LIGHT_FLAME: Color = Color{r: 255, g: 111, b: 63}; +pub const LIGHT_ORANGE: Color = Color{r: 255, g: 159, b: 63}; +pub const LIGHT_AMBER: Color = Color{r: 255, g: 207, b: 63}; +pub const LIGHT_YELLOW: Color = Color{r: 255, g: 255, b: 63}; +pub const LIGHT_LIME: Color = Color{r: 207, g: 255, b: 63}; +pub const LIGHT_CHARTREUSE: Color = Color{r: 159, g: 255, b: 63}; +pub const LIGHT_GREEN: Color = Color{r: 63, g: 255, b: 63}; +pub const LIGHT_SEA: Color = Color{r: 63, g: 255, b: 159}; +pub const LIGHT_TURQUOISE: Color = Color{r: 63, g: 255, b: 207}; +pub const LIGHT_CYAN: Color = Color{r: 63, g: 255, b: 255}; +pub const LIGHT_SKY: Color = Color{r: 63, g: 207, b: 255}; +pub const LIGHT_AZURE: Color = Color{r: 63, g: 159, b: 255}; +pub const LIGHT_BLUE: Color = Color{r: 63, g: 63, b: 255}; +pub const LIGHT_HAN: Color = Color{r: 111, g: 63, b: 255}; +pub const LIGHT_VIOLET: Color = Color{r: 159, g: 63, b: 255}; +pub const LIGHT_PURPLE: Color = Color{r: 207, g: 63, b: 255}; +pub const LIGHT_FUCHSIA: Color = Color{r: 255, g: 63, b: 255}; +pub const LIGHT_MAGENTA: Color = Color{r: 255, g: 63, b: 207}; +pub const LIGHT_PINK: Color = Color{r: 255, g: 63, b: 159}; +pub const LIGHT_CRIMSON: Color = Color{r: 255, g: 63, b: 111}; +pub const RED: Color = Color{r: 255, g: 0, b: 0}; +pub const FLAME: Color = Color{r: 255, g: 63, b: 0}; +pub const ORANGE: Color = Color{r: 255, g: 127, b: 0}; +pub const AMBER: Color = Color{r: 255, g: 191, b: 0}; +pub const YELLOW: Color = Color{r: 255, g: 255, b: 0}; +pub const LIME: Color = Color{r: 191, g: 255, b: 0}; +pub const CHARTREUSE: Color = Color{r: 127, g: 255, b: 0}; +pub const GREEN: Color = Color{r: 0, g: 255, b: 0}; +pub const SEA: Color = Color{r: 0, g: 255, b: 127}; +pub const TURQUOISE: Color = Color{r: 0, g: 255, b: 191}; +pub const CYAN: Color = Color{r: 0, g: 255, b: 255}; +pub const SKY: Color = Color{r: 0, g: 191, b: 255}; +pub const AZURE: Color = Color{r: 0, g: 127, b: 255}; +pub const BLUE: Color = Color{r: 0, g: 0, b: 255}; +pub const HAN: Color = Color{r: 63, g: 0, b: 255}; +pub const VIOLET: Color = Color{r: 127, g: 0, b: 255}; +pub const PURPLE: Color = Color{r: 191, g: 0, b: 255}; +pub const FUCHSIA: Color = Color{r: 255, g: 0, b: 255}; +pub const MAGENTA: Color = Color{r: 255, g: 0, b: 191}; +pub const PINK: Color = Color{r: 255, g: 0, b: 127}; +pub const CRIMSON: Color = Color{r: 255, g: 0, b: 63}; +pub const DARK_RED: Color = Color{r: 191, g: 0, b: 0}; +pub const DARK_FLAME: Color = Color{r: 191, g: 47, b: 0}; +pub const DARK_ORANGE: Color = Color{r: 191, g: 95, b: 0}; +pub const DARK_AMBER: Color = Color{r: 191, g: 143, b: 0}; +pub const DARK_YELLOW: Color = Color{r: 191, g: 191, b: 0}; +pub const DARK_LIME: Color = Color{r: 143, g: 191, b: 0}; +pub const DARK_CHARTREUSE: Color = Color{r: 95, g: 191, b: 0}; +pub const DARK_GREEN: Color = Color{r: 0, g: 191, b: 0}; +pub const DARK_SEA: Color = Color{r: 0, g: 191, b: 95}; +pub const DARK_TURQUOISE: Color = Color{r: 0, g: 191, b: 143}; +pub const DARK_CYAN: Color = Color{r: 0, g: 191, b: 191}; +pub const DARK_SKY: Color = Color{r: 0, g: 143, b: 191}; +pub const DARK_AZURE: Color = Color{r: 0, g: 95, b: 191}; +pub const DARK_BLUE: Color = Color{r: 0, g: 0, b: 191}; +pub const DARK_HAN: Color = Color{r: 47, g: 0, b: 191}; +pub const DARK_VIOLET: Color = Color{r: 95, g: 0, b: 191}; +pub const DARK_PURPLE: Color = Color{r: 143, g: 0, b: 191}; +pub const DARK_FUCHSIA: Color = Color{r: 191, g: 0, b: 191}; +pub const DARK_MAGENTA: Color = Color{r: 191, g: 0, b: 143}; +pub const DARK_PINK: Color = Color{r: 191, g: 0, b: 95}; +pub const DARK_CRIMSON: Color = Color{r: 191, g: 0, b: 47}; +pub const DARKER_RED: Color = Color{r: 127, g: 0, b: 0}; +pub const DARKER_FLAME: Color = Color{r: 127, g: 31, b: 0}; +pub const DARKER_ORANGE: Color = Color{r: 127, g: 63, b: 0}; +pub const DARKER_AMBER: Color = Color{r: 127, g: 95, b: 0}; +pub const DARKER_YELLOW: Color = Color{r: 127, g: 127, b: 0}; +pub const DARKER_LIME: Color = Color{r: 95, g: 127, b: 0}; +pub const DARKER_CHARTREUSE: Color = Color{r: 63, g: 127, b: 0}; +pub const DARKER_GREEN: Color = Color{r: 0, g: 127, b: 0}; +pub const DARKER_SEA: Color = Color{r: 0, g: 127, b: 63}; +pub const DARKER_TURQUOISE: Color = Color{r: 0, g: 127, b: 95}; +pub const DARKER_CYAN: Color = Color{r: 0, g: 127, b: 127}; +pub const DARKER_SKY: Color = Color{r: 0, g: 95, b: 127}; +pub const DARKER_AZURE: Color = Color{r: 0, g: 63, b: 127}; +pub const DARKER_BLUE: Color = Color{r: 0, g: 0, b: 127}; +pub const DARKER_HAN: Color = Color{r: 31, g: 0, b: 127}; +pub const DARKER_VIOLET: Color = Color{r: 63, g: 0, b: 127}; +pub const DARKER_PURPLE: Color = Color{r: 95, g: 0, b: 127}; +pub const DARKER_FUCHSIA: Color = Color{r: 127, g: 0, b: 127}; +pub const DARKER_MAGENTA: Color = Color{r: 127, g: 0, b: 95}; +pub const DARKER_PINK: Color = Color{r: 127, g: 0, b: 63}; +pub const DARKER_CRIMSON: Color = Color{r: 127, g: 0, b: 31}; +pub const DARKEST_RED: Color = Color{r: 63, g: 0, b: 0}; +pub const DARKEST_FLAME: Color = Color{r: 63, g: 15, b: 0}; +pub const DARKEST_ORANGE: Color = Color{r: 63, g: 31, b: 0}; +pub const DARKEST_AMBER: Color = Color{r: 63, g: 47, b: 0}; +pub const DARKEST_YELLOW: Color = Color{r: 63, g: 63, b: 0}; +pub const DARKEST_LIME: Color = Color{r: 47, g: 63, b: 0}; +pub const DARKEST_CHARTREUSE: Color = Color{r: 31, g: 63, b: 0}; +pub const DARKEST_GREEN: Color = Color{r: 0, g: 63, b: 0}; +pub const DARKEST_SEA: Color = Color{r: 0, g: 63, b: 31}; +pub const DARKEST_TURQUOISE: Color = Color{r: 0, g: 63, b: 47}; +pub const DARKEST_CYAN: Color = Color{r: 0, g: 63, b: 63}; +pub const DARKEST_SKY: Color = Color{r: 0, g: 47, b: 63}; +pub const DARKEST_AZURE: Color = Color{r: 0, g: 31, b: 63}; +pub const DARKEST_BLUE: Color = Color{r: 0, g: 0, b: 63}; +pub const DARKEST_HAN: Color = Color{r: 15, g: 0, b: 63}; +pub const DARKEST_VIOLET: Color = Color{r: 31, g: 0, b: 63}; +pub const DARKEST_PURPLE: Color = Color{r: 47, g: 0, b: 63}; +pub const DARKEST_FUCHSIA: Color = Color{r: 63, g: 0, b: 63}; +pub const DARKEST_MAGENTA: Color = Color{r: 63, g: 0, b: 47}; +pub const DARKEST_PINK: Color = Color{r: 63, g: 0, b: 31}; +pub const DARKEST_CRIMSON: Color = Color{r: 63, g: 0, b: 15}; +pub const BRASS: Color = Color{r: 191, g: 151, b: 96}; +pub const COPPER: Color = Color{r: 197, g: 136, b: 124}; +pub const GOLD: Color = Color{r: 229, g: 191, b: 0}; +pub const SILVER: Color = Color{r: 203, g: 203, b: 203}; +pub const CELADON: Color = Color{r: 172, g: 255, b: 175}; +pub const PEACH: Color = Color{r: 255, g: 159, b: 127}; diff --git a/tcod/src/console.rs b/tcod/src/console.rs new file mode 100644 index 00000000..c4da9164 --- /dev/null +++ b/tcod/src/console.rs @@ -0,0 +1,1124 @@ +//! The console emulator handles the rendering of the game screen and the keyboard input +//! +//! It provides the necessary traits and types for working with the different console types, +//! including the [Console](./trait.Console.html) trait and the +//! [Root](./struct.Root.html) and [Offscreen](./struct.Offscreen.html) console types. +//! It's worth mentioning that only one `Root` console may exist at any given time, and it has to +//! be initialized at the start of the program. +//! +//! # Examples +//! +//! Initializing the `Root` console and creating an `Offscreen` console: +//! +//! ```no_run +//! use tcod::console::{Root, Offscreen}; +//! +//! let mut root = Root::initializer().init(); +//! let (width, height) = (80, 30); +//! let mut offscreen = Offscreen::new(width, height); +//! ``` +//! +//! A typical `tcod-rs` program's basic structure would look something like this: +//! +//! ```no_run +//! use tcod::console::Root; +//! +//! fn main() { +//! let mut root = Root::initializer().init(); // Replace with custom initialization code +//! +//! while !root.window_closed() { +//! // Handling user input +//! // Updating the gamestate +//! // Rendering the results +//! } +//! } +//! ``` +//! +//! For detailed examples on the user input handling and rendering see the +//! [Root](./struct.Root.html) struct's documentation. +//! +//! +//! ## Additional Information +//! +//! The `Root` and `Console` types are also reexported in the root module (`tcod`) under the names +//! `RootConsole` and `OffscreenConsole`, making the following code sample equivalent to the +//! previous one: +//! +//! ```no_run +//! use tcod::{RootConsole, OffscreenConsole}; +//! +//! let mut root = RootConsole::initializer().init(); +//! let (width, height) = (80, 30); +//! let mut offscreen = OffscreenConsole::new(width, height); +//! ``` +//! This applies to all the examples in the rest of the modules documentation. + +use std::ptr; +use std::str; + +use std::ascii::AsciiExt; +use std::marker::PhantomData; +use std::mem::transmute; +use std::path::Path; + +use bindings::ffi; +use bindings::{AsNative, FromNative, c_bool, c_char, CString}; + +use colors::Color; +use input::{Key, KeyPressFlags}; + +/// A type representing secondary consoles +/// +/// `Offscreen` consoles allow you draw on secondary consoles as you would on `Root` consoles, and then +/// `blit` their contents onto other consoles (including `Root`). There are some limitations +/// compared to `Root` consoles, however: +/// +/// * Functions manipulating the main window or handling user input are limited to the `Root` +/// console +/// * `Offscreen` consoles may not be `flushed` to the screen directly +/// +/// # Examples +/// +/// Creating an `Offscreen` console +/// +/// ```no_run +/// use tcod::console::Offscreen; +/// +/// let width = 80; +/// let height = 20; +/// let offscreen = Offscreen::new(width, height); +/// ``` +/// +/// Blitting an `Offscreen` console to the `Root` console: +/// +/// ```no_run +/// use tcod::console as console; +/// use tcod::console::{Root, Offscreen}; +/// +/// fn main() { +/// let mut root = Root::initializer().init(); +/// +/// let mut direct = Offscreen::new(20, 20); +/// console::blit(&direct, (0, 0), (20, 20), &mut root, (0, 0), 1.0, 1.0); +/// } +/// +/// ``` +/// +/// See the documentation for [blit](./fn.blit.html) for a detailed description of the function parameters +/// and a more in-depth example. +pub struct Offscreen { + con: ffi::TCOD_console_t, +} + +impl Drop for Offscreen { + fn drop(&mut self) { + unsafe { + ffi::TCOD_console_delete(self.con); + } + } +} + +impl Offscreen { + /// Creates a new `Offscreen` console instance + pub fn new(width: i32, height: i32) -> Offscreen { + assert!(width > 0 && height > 0); + unsafe { + Offscreen { con: ffi::TCOD_console_new(width, height) } + } + } + +} + +/// The console representing the main window of the application +/// +/// This is the only console type capable of handling user input and flushing its contents onto the screen. +/// There may only be one Root console at any given time, and it should be initialized at the start of the program. +/// +/// # Examples +/// +/// ## Handling user input +/// `tcod-rs` provides two ways of handling user input: blocking or non-blocking. The following +/// exaple will show the blocking method +/// +/// ```no_run +/// use tcod::console::Root; +/// use tcod::input::Key; +/// use tcod::input::KeyCode::{Up, Down, Left, Right}; +/// +/// fn main() { +/// let mut root = Root::initializer().init(); +/// +/// let keypress = root.wait_for_keypress(true); +/// match keypress.code { +/// Up => {}, // Handle arrow key up +/// Down => {}, // Arrow key down +/// Left => {}, +/// Right => {}, +/// _ => {} +/// } +/// } +/// ``` +/// +/// For a detailed description of possible values of `keypress.key` values see the +/// [Key](../input/enum.Key.html) and [KeyCode](../input/enum.KeyCode.html) enums. +/// +/// ## Rendering +/// `libtcod` provides a wide variety of functions for changing how the console output looks like, +/// including: changing the text and background colors, text alignment, etc. It also has +/// several functions that are used to output text on consoles. For a complete list of both, +/// see the [Console](./trait.Console.html) trait's documentation. The basic structure of the +/// rendering code: +/// +/// ```no_run +/// use tcod::console::{Console, Root}; +/// +/// fn main() { +/// let mut root = Root::initializer().init(); +/// +/// root.clear(); +/// // Output style manipulation +/// // Calling the output functions +/// root.flush(); +/// } +/// ``` + +struct RootId { + id: ffi::TCOD_console_t +} + +unsafe impl Sync for RootId {} + +static ROOT_ID: RootId = RootId { id: 0 as ffi::TCOD_console_t }; + +pub struct Root { + // This is here to prevent the explicit creation of Root consoles. + _blocker: PhantomData +} + +impl Root { + /// Returns an instance of a RootInitializer object, which can be used to + /// customize the initialization of the Root console. Note that only + /// `RootInitializer::init` will return the actual `Root` console instance. + /// For a full list of initialization options, see the + /// [RootInitializer](./struct.RootInitializer.html) documentation. + /// + /// # Examples + /// + /// ```no_run + /// use tcod::console::Root; + /// + /// let mut root = Root::initializer() + /// .size(80, 20) + /// .title("Example") + /// .fullscreen(true) + /// .init(); + /// ``` + /// + pub fn initializer<'a>() -> RootInitializer<'a> { + RootInitializer::new() + } + + /// Returns with true when the `Root` console is in fullscreen mode. + pub fn is_fullscreen(&self) -> bool { + unsafe { + ffi::TCOD_console_is_fullscreen() != 0 + } + } + + /// Toggles between windowed and fullscreen mode. + pub fn set_fullscreen(&mut self, fullscreen: bool) { + unsafe { + ffi::TCOD_console_set_fullscreen(fullscreen as u8); + } + } + + /// This function changes the keyboard repeat times. The initial delay determines the + /// number of milliseconds between the keypress and the time the keyboard repeat begins. + /// The interval sets the time between the keyboard repeat events. + /// With an initial delay of 0, the keyboard repeat feature is completely disabled. + pub fn set_keyboard_repeat(&mut self, initial_delay: i32, interval: i32) { + unsafe { + ffi::TCOD_console_set_keyboard_repeat(initial_delay, interval); + } + } + + /// Disables the keyboard repeat feature. Equivalent to `set_keyboard_repeat` with an + /// initial delay of 0. + pub fn disable_keyboard_repeat(&mut self) { + unsafe { + ffi::TCOD_console_disable_keyboard_repeat() + } + } + + /// Returns true if the `Root` console is currently active. + pub fn is_active(&self) -> bool { + unsafe { + ffi::TCOD_console_is_active() != 0 + } + } + + /// Returns true if the `Root` console has focus. + pub fn has_focus(&self) -> bool { + unsafe { + ffi::TCOD_console_has_mouse_focus() != 0 + } + } + + + /// Returns the current fade amount (previously set by `set_fade`). + pub fn get_fade(&self) -> u8 { + unsafe { + ffi::TCOD_console_get_fade() + } + } + + /// Returns the current fade color (previously set by `set_fade`). + pub fn get_fading_color(&self) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_console_get_fading_color()) + } + } + + /// This function defines the fading parameters, allowing to easily fade the game screen to/from a color. + /// Once they are defined, the fading parameters are valid for ever. + /// You don't have to call setFade for each rendered frame (unless you change the fading parameters). + pub fn set_fade(&mut self, fade: u8, fading_color: Color) { + unsafe { + ffi::TCOD_console_set_fade(fade, *fading_color.as_native()); + } + } + + /// This function will wait for a keypress event from the user, returning the [KeyState](../input/struct.KeyState.html) + /// that represents the event. If `flush` is true, all pending keypresses are flushed from the + /// keyboard buffer. If false, it returns the first element from it. + pub fn wait_for_keypress(&mut self, flush: bool) -> Key { + let tcod_key = unsafe { + ffi::TCOD_console_wait_for_keypress(flush as c_bool) + }; + tcod_key.into() + } + + /// This function checks if the user pressed a key. It returns the + /// [KeyState](../input/struct.KeyState.html) representing the + /// event if they have, or `None` if they have not. + pub fn check_for_keypress(&self, status: KeyPressFlags) -> Option { + let tcod_key = unsafe { + ffi::TCOD_console_check_for_keypress(status.bits() as i32) + }; + if tcod_key.vk == ffi::TCODK_NONE { + return None; + } + Some(tcod_key.into()) + } + + /// Returns with true if the `Root` console has been closed. + pub fn window_closed(&self) -> bool { + unsafe { + ffi::TCOD_console_is_window_closed() != 0 + } + } + + /// Flushes the contents of the `Root` console onto the screen. + pub fn flush(&mut self) { + unsafe { + ffi::TCOD_console_flush(); + } + } + + /// Sets the main window's title to the string specified in the argument. + pub fn set_window_title(&mut self, title: T) where T: AsRef { + unsafe { + let c_title = CString::new(title.as_ref().as_bytes()).unwrap(); + ffi::TCOD_console_set_window_title(c_title.as_ptr()); + } + } + + /// Embeds libtcod credits in a console. + /// Returns true when the credits screen is finished. + + pub fn render_credits(&self, x : i32, y: i32, alpha: bool) -> bool { + unsafe { + let result = ffi::TCOD_console_credits_render(x, y, alpha as c_bool); + result != 0 + } + + } + + fn set_custom_font(font_path: &Path, + font_layout: FontLayout, + font_type: FontType, + nb_char_horizontal: i32, + nb_char_vertical: i32) { + unsafe { + let filename = font_path.to_str().expect("Invalid font path"); + let path = CString::new(filename).ok().expect("Font path could not be converted \ + to a C string"); + ffi::TCOD_console_set_custom_font( + path.as_ptr(), (font_layout as i32) | (font_type as i32), + nb_char_horizontal, nb_char_vertical); + } + } + +} + +/// Helper struct for the `Root` console initialization +/// +/// This is the type that should be used to initialize the `Root` console (either directly or +/// indirectly, by calling `Root::initializer`). It uses method chaining to provide an easy-to-use +/// interface. It exposes the following configuration options for the `Root` console: +/// +/// * `size`: this determines the size of the console window in characters +/// * `title`: the main window's title +/// * `fullscreen`: determines if the main window will start in fullscreen mode +/// * `font`: selects a bitmap font and sets its layout. See [FontLayout](./enum.FontLayout.html) +/// for the possible layouts. The `path` argument can be a +/// [`str`](http://doc.rust-lang.org/std/primitive.str.html), +/// [`Path`](http://doc.rust-lang.org/std/path/struct.Path.html), +/// [`String`](http://doc.rust-lang.org/std/string/struct.String.html) or anything else that +/// implements [`AsRef`](http://doc.rust-lang.org/std/convert/trait.AsRef.html). +/// * `font_type`: only use this if you want to use a greyscale font. See +/// [FontType](./enum.FontType.html) for the possible values. +/// * `font_dimensions`: the dimensions for the given bitmap font. This is automatically +/// deduced from the font layout, only use this if you really need it (providing wrong values will +/// ruin the font display). +/// * `renderer`: sets the console renderer. See the [Renderer](./enum.Renderer.html) enum for the +/// valid options. +/// +/// The initializer provides sane defaults even there are no options explicitly specified, but it +/// is recommended to at least set the size and the window title. +/// +/// # Examples +/// +/// Initializing the `Root` console using `Root::initializer` instead of explicitly creating a +/// `RootInitializer` instance: +/// +/// ```no_run +/// use tcod::console::{Root, FontLayout, Renderer}; +/// +/// fn main() { +/// let mut root = Root::initializer() +/// .size(80, 20) +/// .title("Example") +/// .fullscreen(true) +/// .font("terminal.png", FontLayout::AsciiInCol) +/// .renderer(Renderer::GLSL) +/// .init(); +/// } +/// ``` +pub struct RootInitializer<'a> { + width: i32, + height: i32, + title: Box + 'a>, + is_fullscreen: bool, + font_path: Box + 'a>, + font_layout: FontLayout, + font_type: FontType, + font_dimensions: (i32, i32), + console_renderer: Renderer +} + +impl<'a> RootInitializer<'a> { + pub fn new() -> RootInitializer<'a> { + RootInitializer { + width: 80, + height: 25, + title: Box::new("Main Window"), + is_fullscreen: false, + font_path: Box::new("terminal.png"), + font_layout: FontLayout::AsciiInCol, + font_type: FontType::Default, + font_dimensions: (0, 0), + console_renderer: Renderer::SDL + } + } + + pub fn size(&mut self, width: i32, height: i32) -> &mut RootInitializer<'a> { + self.width = width; + self.height = height; + self + } + + pub fn title(&mut self, title: T) -> &mut RootInitializer<'a> where T: AsRef + 'a { + assert!(title.as_ref().is_ascii()); + self.title = Box::new(title); + self + } + + pub fn fullscreen(&mut self, is_fullscreen: bool) -> &mut RootInitializer<'a> { + self.is_fullscreen = is_fullscreen; + self + } + + pub fn font

(&mut self, path: P, font_layout: FontLayout) -> &mut RootInitializer<'a> where P: AsRef + 'a { + self.font_path = Box::new(path); + self.font_layout = font_layout; + self + } + + pub fn font_type(&mut self, font_type: FontType) -> &mut RootInitializer<'a> { + self.font_type = font_type; + self + } + + pub fn font_dimensions(&mut self, horizontal: i32, vertical: i32) -> &mut RootInitializer<'a> { + self.font_dimensions = (horizontal, vertical); + self + } + + pub fn renderer(&mut self, renderer: Renderer) -> &mut RootInitializer<'a> { + self.console_renderer = renderer; + self + } + + pub fn init(&self) -> Root { + assert!(self.width > 0 && self.height > 0); + + match self.font_dimensions { + (horizontal, vertical) => { + Root::set_custom_font((*self.font_path).as_ref(), + self.font_layout, self.font_type, + horizontal, vertical) + } + } + + unsafe { + let c_title = CString::new((*self.title).as_ref().as_bytes()).unwrap(); + ffi::TCOD_console_init_root(self.width, self.height, + c_title.as_ptr(), + self.is_fullscreen as c_bool, + self.console_renderer as u32); + } + Root { _blocker: PhantomData } + } +} + +pub trait TcodString { + fn as_ascii(&self) -> Option<&[u8]>; +} + +impl TcodString for str { + fn as_ascii(&self) -> Option<&[u8]> { + match self.is_ascii() { + true => Some(self.as_ref()), + false => None, + } + } +} + +impl<'a> TcodString for &'a str { + fn as_ascii(&self) -> Option<&[u8]> { + (*self).as_ascii() + } +} + +impl TcodString for String { + fn as_ascii(&self) -> Option<&[u8]> { + AsRef::::as_ref(self).as_ascii() + } +} + +impl<'a> TcodString for &'a String { + fn as_ascii(&self) -> Option<&[u8]> { + AsRef::::as_ref(self).as_ascii() + } +} + +pub trait AsciiLiteral {} +impl AsciiLiteral for [u8] {} + +// AsciiLiteral is implemented for fixed-size arrays up to length 32, same as the current +// Rust standard library trait implementation for fixed-size arrays (13 June 2015) +impl AsciiLiteral for [u8; 0] {} +impl AsciiLiteral for [u8; 1] {} +impl AsciiLiteral for [u8; 2] {} +impl AsciiLiteral for [u8; 3] {} +impl AsciiLiteral for [u8; 4] {} +impl AsciiLiteral for [u8; 5] {} +impl AsciiLiteral for [u8; 6] {} +impl AsciiLiteral for [u8; 7] {} +impl AsciiLiteral for [u8; 8] {} +impl AsciiLiteral for [u8; 9] {} +impl AsciiLiteral for [u8; 10] {} +impl AsciiLiteral for [u8; 11] {} +impl AsciiLiteral for [u8; 12] {} +impl AsciiLiteral for [u8; 13] {} +impl AsciiLiteral for [u8; 14] {} +impl AsciiLiteral for [u8; 15] {} +impl AsciiLiteral for [u8; 16] {} +impl AsciiLiteral for [u8; 17] {} +impl AsciiLiteral for [u8; 18] {} +impl AsciiLiteral for [u8; 19] {} +impl AsciiLiteral for [u8; 20] {} +impl AsciiLiteral for [u8; 21] {} +impl AsciiLiteral for [u8; 22] {} +impl AsciiLiteral for [u8; 23] {} +impl AsciiLiteral for [u8; 24] {} +impl AsciiLiteral for [u8; 25] {} +impl AsciiLiteral for [u8; 26] {} +impl AsciiLiteral for [u8; 27] {} +impl AsciiLiteral for [u8; 28] {} +impl AsciiLiteral for [u8; 29] {} +impl AsciiLiteral for [u8; 30] {} +impl AsciiLiteral for [u8; 31] {} +impl AsciiLiteral for [u8; 32] {} + +impl<'a, T> AsciiLiteral for &'a T where T: AsciiLiteral {} + +impl TcodString for T where T: AsRef<[u8]> + AsciiLiteral { + fn as_ascii(&self) -> Option<&[u8]> { + Some(self.as_ref()) + } +} + +#[inline] +fn to_wstring(text: &[u8]) -> Vec { + let mut ret = str::from_utf8(text).unwrap().chars().collect::>(); + ret.push('\0'); + ret +} + +/// Defines the common functionality between `Root` and `Offscreen` consoles +/// +/// # Examples +/// Printing text with explicit alignment: +/// +/// ```no_run +/// use tcod::console::{Console, Root, BackgroundFlag, TextAlignment}; +/// +/// let mut root = Root::initializer().size(80, 50).init(); +/// +/// root.print_ex(1, 1, BackgroundFlag::None, TextAlignment::Left, +/// "Text aligned to left."); +/// +/// root.print_ex(78, 1, BackgroundFlag::None, TextAlignment::Right, +/// "Text aligned to right."); +/// +/// root.print_ex(40, 15, BackgroundFlag::None, TextAlignment::Center, +/// "And this bit of text is centered."); +/// +/// root.print_ex(40, 19, BackgroundFlag::None, TextAlignment::Center, +/// "Press any key to quit."); +/// ``` +pub trait Console : AsNative { + /// Returns the default text alignment for the `Console` instance. For all the possible + /// text alignment options, see the documentation for + /// [TextAlignment](./enum.TextAlignment.html). + fn get_alignment(&self) -> TextAlignment { + let alignment = unsafe { + ffi::TCOD_console_get_alignment(*self.as_native()) + }; + unsafe { transmute(alignment) } + } + + /// Sets the default text alignment for the console. For all the possible + /// text alignment options, see the documentation for + /// [TextAlignment](./enum.TextAlignment.html). + fn set_alignment(&mut self, alignment: TextAlignment) { + unsafe { + ffi::TCOD_console_set_alignment(*self.as_native(), alignment as u32); + } + } + + /// Sets a key color that will be ignored when [blitting](./fn.blit.html) the contents + /// of this console onto an other (essentially a transparent background color). + fn set_key_color(&mut self, color: Color) { + unsafe { + ffi::TCOD_console_set_key_color(*self.as_native(), *color.as_native()); + } + } + + /// Returns the width of the console in characters. + fn width(&self) -> i32 { + unsafe { + ffi::TCOD_console_get_width(*self.as_native()) + } + } + + /// Returns the height of the console in characters. + fn height(&self) -> i32 { + unsafe { + ffi::TCOD_console_get_height(*self.as_native()) + } + } + + /// Sets the console's default background color. This is used in several other methods, + /// like: `clear`, `put_char`, etc. + fn set_default_background(&mut self, color: Color) { + unsafe { + ffi::TCOD_console_set_default_background(*self.as_native(), *color.as_native()); + } + } + + /// Sets the console's default foreground color. This is used in several printing functions. + fn set_default_foreground(&mut self, color: Color) { + unsafe { + ffi::TCOD_console_set_default_foreground(*self.as_native(), *color.as_native()); + } + } + + /// Returns the background color of the cell at the specified coordinates. + fn get_char_background(&self, x: i32, y: i32) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_console_get_char_background(*self.as_native(), x, y)) + } + } + + /// Returns the foreground color of the cell at the specified coordinates. + fn get_char_foreground(&self, x: i32, y: i32) -> Color { + unsafe { + FromNative::from_native( + ffi::TCOD_console_get_char_foreground(*self.as_native(), x, y)) + } + } + + /// Returns the console's current background flag. For a detailed explanation + /// of the possible values, see [BackgroundFlag](./enum.BackgroundFlag.html). + fn get_background_flag(&self) -> BackgroundFlag { + let flag = unsafe { + ffi::TCOD_console_get_background_flag(*self.as_native()) + }; + unsafe { transmute(flag) } + } + + /// Sets the console's current background flag. For a detailed explanation + /// of the possible values, see [BackgroundFlag](./enum.BackgroundFlag.html). + fn set_background_flag(&mut self, background_flag: BackgroundFlag) { + unsafe { + ffi::TCOD_console_set_background_flag(*self.as_native(), + background_flag as u32); + } + } + + /// Returns the ASCII value of the cell located at `x, y` + fn get_char(&self, x: i32, y: i32) -> char { + let ffi_char = unsafe { + ffi::TCOD_console_get_char(*self.as_native(), x, y) + }; + assert!(ffi_char >= 0 && ffi_char < 256); + ffi_char as u8 as char + } + + /// Modifies the ASCII value of the cell located at `x, y`. + fn set_char(&mut self, x: i32, y: i32, c: char) { + assert!(x >= 0 && y >= 0); + unsafe { + ffi::TCOD_console_set_char(*self.as_native(), x, y, c as i32) + } + } + + /// Changes the background color of the specified cell + fn set_char_background(&mut self, x: i32, y: i32, + color: Color, + background_flag: BackgroundFlag) { + assert!(x >= 0 && y >= 0); + unsafe { + ffi::TCOD_console_set_char_background(*self.as_native(), + x, y, + *color.as_native(), + background_flag as u32) + } + } + + /// Changes the foreground color of the specified cell + fn set_char_foreground(&mut self, x: i32, y: i32, color: Color) { + assert!(x >= 0 && y >= 0); + unsafe { + ffi::TCOD_console_set_char_foreground(*self.as_native(), + x, y, + *color.as_native()); + } + } + + /// This function modifies every property of the given cell: + /// + /// 1. Updates its background color according to the console's default and `background_flag`, + /// see [BackgroundFlag](./enum.BackgroundFlag.html). + /// 2. Updates its foreground color based on the default color set in the console + /// 3. Sets its ASCII value to `glyph` + fn put_char(&mut self, + x: i32, y: i32, glyph: char, + background_flag: BackgroundFlag) { + assert!(x >= 0 && y >= 0); + unsafe { + ffi::TCOD_console_put_char(*self.as_native(), + x, y, glyph as i32, + background_flag as u32); + } + } + + /// Updates every propert of the given cell using explicit colors for the + /// background and foreground. + fn put_char_ex(&mut self, + x: i32, y: i32, glyph: char, + foreground: Color, background: Color) { + assert!(x >= 0 && y >= 0); + unsafe { + ffi::TCOD_console_put_char_ex(*self.as_native(), + x, y, glyph as i32, + *foreground.as_native(), + *background.as_native()); + } + } + + /// Clears the console with its default background color + fn clear(&mut self) { + unsafe { + ffi::TCOD_console_clear(*self.as_native()); + } + } + + /// Prints the text at the specified location. The position of the `x` and `y` + /// coordinates depend on the [TextAlignment](./enum.TextAlignment.html) set in the console: + /// + /// * `TextAlignment::Left`: leftmost character of the string + /// * `TextAlignment::Center`: center character of the sting + /// * `TextAlignment::Right`: rightmost character of the string + fn print(&mut self, x: i32, y: i32, text: T) where Self: Sized, T: AsRef<[u8]> + TcodString { + assert!(x >= 0 && y >= 0); + if let Some(text) = text.as_ascii() { + let c_text = CString::new(text).unwrap(); + unsafe { + ffi::TCOD_console_print(*self.as_native(), x, y, c_text.as_ptr()); + } + } else { + let c_text = to_wstring(text.as_ref()); + unsafe { + ffi::TCOD_console_print_utf(*self.as_native(), x, y, c_text.as_ptr() as *const i32); + } + } + } + + /// Prints the text at the specified location in a rectangular area with + /// the dimensions: (width; height). If the text is longer than the width the + /// newlines will be inserted. + fn print_rect(&mut self, + x: i32, y: i32, + width: i32, height: i32, + text: T) where Self: Sized, T: AsRef<[u8]> + TcodString { + assert!(x >= 0 && y >= 0); + if let Some(text) = text.as_ascii() { + let c_text = CString::new(text).unwrap(); + unsafe { + ffi::TCOD_console_print_rect(*self.as_native(), x, y, width, height, c_text.as_ptr()); + } + } else { + let c_text = to_wstring(text.as_ref()); + unsafe { + ffi::TCOD_console_print_rect_utf(*self.as_native(), x, y, width, height, c_text.as_ptr() as *const i32); + } + } + } + + /// Prints the text at the specified location with an explicit + /// [BackgroundFlag](./enum.BackgroundFlag.html) and + /// [TextAlignment](./enum.TextAlignment.html). + fn print_ex(&mut self, + x: i32, y: i32, + background_flag: BackgroundFlag, + alignment: TextAlignment, + text: T) where Self: Sized, T: AsRef<[u8]> + TcodString { + assert!(x >= 0 && y >= 0); + if let Some(text) = text.as_ascii() { + let c_text = CString::new(text).unwrap(); + unsafe { + ffi::TCOD_console_print_ex(*self.as_native(), x, y, + background_flag as u32, + alignment as u32, + c_text.as_ptr()); + } + } else { + let c_text = to_wstring(text.as_ref()); + unsafe { + ffi::TCOD_console_print_ex_utf(*self.as_native(), x, y, + background_flag as u32, + alignment as u32, + c_text.as_ptr() as *const i32); + } + } + } + + /// Combines the functions of `print_ex` and `print_rect` + fn print_rect_ex(&mut self, + x: i32, y: i32, + width: i32, height: i32, + background_flag: BackgroundFlag, + alignment: TextAlignment, + text: T) where Self: Sized, T: AsRef<[u8]> + TcodString { + assert!(x >= 0 && y >= 0); + if let Some(text) = text.as_ascii() { + let c_text = CString::new(text).unwrap(); + unsafe { + ffi::TCOD_console_print_rect_ex(*self.as_native(), x, y, width, height, + background_flag as u32, alignment as u32, + c_text.as_ptr()); + } + } else { + let c_text = to_wstring(text.as_ref()); + unsafe { + ffi::TCOD_console_print_rect_ex_utf(*self.as_native(), x, y, width, height, + background_flag as u32, alignment as u32, + c_text.as_ptr() as *const i32); + } + } + } + + /// Compute the height of a wrapped text printed using `print_rect` or `print_rect_ex`. + fn get_height_rect(&self, + x: i32, y: i32, + width: i32, height: i32, + text: T) -> i32 where Self: Sized, T: AsRef<[u8]> + TcodString { + assert!(x >= 0 && y >= 0); + if let Some(text) = text.as_ascii() { + let c_text = CString::new(text).unwrap(); + unsafe { + ffi::TCOD_console_get_height_rect(*self.as_native(), x, y, width, height, + c_text.as_ptr()) + } + } else { + let c_text = to_wstring(text.as_ref()); + unsafe { + ffi::TCOD_console_get_height_rect_utf(*self.as_native(), x, y, width, height, + c_text.as_ptr() as *const i32) + } + } + } + + + /// Fill a rectangle with the default background colour. + /// + /// If `clear` is true, set each cell's character to space (ASCII 32). + fn rect(&mut self, + x: i32, y: i32, + width: i32, height: i32, + clear: bool, + background_flag: BackgroundFlag) { + assert!(x >= 0 && y >= 0 && width >= 0 && height >= 0); + assert!(x + width < self.width() && y + height < self.height()); + unsafe { + ffi::TCOD_console_rect(*self.as_native(), x, y, width, height, clear as c_bool, background_flag as u32); + } + } + + /// Draw a horizontal line. + /// + /// Uses `tcod::chars::HLINE` (ASCII 196) as the line character and + /// console's default background and foreground colours. + fn horizontal_line(&mut self, x: i32, y: i32, length: i32, background_flag: BackgroundFlag) { + assert!(x >= 0 && y >= 0 && y < self.height()); + assert!(length >= 1 && length + x < self.width()); + unsafe { + ffi::TCOD_console_hline(*self.as_native(), x, y, length, background_flag as u32); + } + } + + /// Draw a vertical line. + /// + /// Uses `tcod::chars::VLINE` (ASCII 179) as the line character and + /// console's default background and foreground colours. + fn vertical_line(&mut self, x: i32, y: i32, length: i32, background_flag: BackgroundFlag) { + assert!(x >= 0, y >= 0 && x < self.width()); + assert!(length >= 1 && length + y < self.height()); + unsafe { + ffi::TCOD_console_vline(*self.as_native(), x, y, length, background_flag as u32); + } + } + + /// Draw a window frame with an optional title. + /// + /// Draws a rectangle (using the rect method) using the suplied background + /// flag, then draws a rectangle with the console's default foreground + /// colour. + /// + /// If the `title` is specified, it will be printed on top of the rectangle + /// using inverted colours. + fn print_frame(&mut self, x: i32, y: i32, width: i32, height: i32, + clear: bool, background_flag: BackgroundFlag, title: Option) where Self: Sized, T: AsRef { + assert!(x >= 0 && y >= 0 && width >= 0 && height >= 0); + assert!(x + width <= self.width() && y + height <= self.height()); + let c_title: *const c_char = match title { + Some(s) => { + assert!(s.as_ref().is_ascii()); + CString::new(s.as_ref()).unwrap().as_ptr() + }, + None => ptr::null(), + }; + unsafe { + ffi::TCOD_console_print_frame(*self.as_native(), x, y, width, height, + clear as c_bool, background_flag as u32, c_title); + } + } +} + +/// Blits the contents of one console onto an other +/// +/// It takes a region from a given console (with an arbitrary location, width and height) and superimposes +/// it on the destination console (at the given location). +/// Note that when blitting, the source console's key color (set by `set_key_color`) will +/// be ignored, making it possible to blit non-rectangular regions. +/// +/// # Arguments +/// +/// * `source_console`: the type implementing the [Console](./trait.Console.html) trait we want to +/// take the blitted region from +/// * `source_x`, `source_y`: the coordinates of the blitted region's top left corner on the source +/// console +/// * `source_width`, `source_height`: the width and height of the blitted region. With a value of +/// 0, the width and height of the source console will be used. +/// * `destination_console`: the type implementing the [Console](./trait.Console.html) trait we want +/// to blit to +/// * `destination_x`, `destination_y`: the coordinated of the blitted region's top left corner on +/// the destination console +/// * `foreground_alpha`, `background_alpha`: the foreground and background opacity +/// +/// # Examples +/// +/// Using `blit` with concrete types and `Console` trait objects: +/// +/// ```no_run +/// use tcod::console as console; +/// use tcod::console::{Console, Root, Offscreen}; +/// +/// fn main() { +/// let mut root = Root::initializer().init(); +/// +/// let mut direct = Offscreen::new(20, 20); +/// let mut boxed_direct = Box::new(Offscreen::new(20, 20)); +/// let mut trait_object: &Console = &Offscreen::new(20, 20); +/// let mut boxed_trait: Box = Box::new(Offscreen::new(20, 20)); +/// +/// console::blit(&direct, (0, 0), (20, 20), &mut root, (0, 0), 1.0, 1.0); +/// console::blit(&boxed_direct, (0, 0), (20, 20), &mut root, (20, 0), 1.0, 1.0); +/// console::blit(&trait_object, (0, 0), (20, 20), &mut root, (0, 20), 1.0, 1.0); +/// console::blit(&boxed_trait, (0, 0), (20, 20), &mut root, (20, 20), 1.0, 1.0); +/// } +/// +/// ``` +pub fn blit(source_console: &T, + (source_x, source_y): (i32, i32), + (source_width, source_height): (i32, i32), + destination_console: &mut U, + (destination_x, destination_y): (i32, i32), + foreground_alpha: f32, background_alpha: f32) + where T: Console, + U: Console { + assert!(source_x >= 0 && source_y >= 0 && + source_width >= 0 && source_height >= 0); // If width or height is 0, the source width/height is used. + + unsafe { + ffi::TCOD_console_blit(*source_console.as_native(), + source_x, source_y, source_width, source_height, + *destination_console.as_native(), + destination_x, destination_y, + foreground_alpha, background_alpha); + } +} + +impl<'a, T: Console + ?Sized> Console for &'a T {} + +impl Console for Box {} + +impl AsNative for Root { + unsafe fn as_native(&self) -> &ffi::TCOD_console_t { + &ROOT_ID.id + } +} + +impl AsNative for Offscreen { + unsafe fn as_native(&self) -> &ffi::TCOD_console_t { + &self.con + } +} + +impl Console for Root {} +impl Console for Offscreen {} + +/// Represents the text alignment in console instances. +#[repr(C)] +#[derive(Copy, Clone)] +pub enum TextAlignment { + Left = ffi::TCOD_LEFT as isize, + Right = ffi::TCOD_RIGHT as isize, + Center = ffi::TCOD_CENTER as isize, +} + +/// This flag determines how a cell's existing background color will be modified by a new one +/// +/// See [libtcod's documentation](http://doryen.eptalys.net/data/libtcod/doc/1.5.2/html2/console_bkgnd_flag_t.html) +/// for a detailed description of the different values. +#[repr(C)] +#[derive(Copy, Clone, Debug)] +pub enum BackgroundFlag { + None = ffi::TCOD_BKGND_NONE as isize, + Set = ffi::TCOD_BKGND_SET as isize, + Multiply = ffi::TCOD_BKGND_MULTIPLY as isize, + Lighten = ffi::TCOD_BKGND_LIGHTEN as isize, + Darken = ffi::TCOD_BKGND_DARKEN as isize, + Screen = ffi::TCOD_BKGND_SCREEN as isize, + ColorDodge = ffi::TCOD_BKGND_COLOR_DODGE as isize, + ColorBurn = ffi::TCOD_BKGND_COLOR_BURN as isize, + Add = ffi::TCOD_BKGND_ADD as isize, + AddA = ffi::TCOD_BKGND_ADDA as isize, + Burn = ffi::TCOD_BKGND_BURN as isize, + Overlay = ffi::TCOD_BKGND_OVERLAY as isize, + Alph = ffi::TCOD_BKGND_ALPH as isize, + Default = ffi::TCOD_BKGND_DEFAULT as isize +} + +/// All the possible renderers used by the `Root` console +#[repr(C)] +#[derive(Copy, Clone)] +pub enum Renderer { + GLSL = ffi::TCOD_RENDERER_GLSL as isize, + OpenGL = ffi::TCOD_RENDERER_OPENGL as isize, + SDL = ffi::TCOD_RENDERER_SDL as isize, +} + +/// All the possible font layouts that can be used for custom bitmap fonts +#[repr(C)] +#[derive(Copy, Clone)] +pub enum FontLayout { + AsciiInCol = ffi::TCOD_FONT_LAYOUT_ASCII_INCOL as isize, + AsciiInRow = ffi::TCOD_FONT_LAYOUT_ASCII_INROW as isize, + Tcod = ffi::TCOD_FONT_LAYOUT_TCOD as isize, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub enum FontType { + Default = 0, + Greyscale = ffi::TCOD_FONT_TYPE_GREYSCALE as isize, +} + + + +#[cfg(test)] +mod test { + use std::path::Path; + use super::Root; + use super::FontLayout::AsciiInCol; + + #[test] + fn test_custom_font_as_static_str() { + Root::initializer().font("terminal.png", AsciiInCol); + } + + #[test] + fn test_custom_font_as_path() { + Root::initializer().font(Path::new("terminal.png"), AsciiInCol); + + } + + #[test] + fn test_custom_font_as_string() { + Root::initializer().font("terminal.png".to_owned(), AsciiInCol); + } + + #[test] + fn test_custom_font_as_str() { + let string = "terminal.png".to_owned(); + let s: &str = &string; + Root::initializer().font(s, AsciiInCol); + } +} diff --git a/tcod/src/console_macros.rs b/tcod/src/console_macros.rs new file mode 100644 index 00000000..5bcdd63b --- /dev/null +++ b/tcod/src/console_macros.rs @@ -0,0 +1,106 @@ +#[macro_export] +macro_rules! tcod_print { + // ABW + ($con: expr, At($x: expr, $y: expr), Align($alignment: expr), + Bg($bg: expr), Wrap($width: expr, $height: expr), $($arg: tt)*) => ( + $con.print_rect_ex($x, $y, $width, $height, $bg, $alignment, format!($($arg)*)); + ); + + // AWB + ($con: expr, At($x: expr, $y: expr), Align($alignment: expr), + Wrap($width: expr, $height: expr), Bg($bg: expr), $($arg: tt)*) => ( + $con.print_rect_ex($x, $y, $width, $height, $bg, $alignment, format!($($arg)*)); + ); + + // BAW + ($con: expr, At($x: expr, $y: expr), Bg($bg: expr), + Align($alignment: expr), Wrap($width: expr, $height: expr), $($arg: tt)*) => ( + $con.print_rect_ex($x, $y, $width, $height, $bg, $alignment, format!($($arg)*)); + ); + + // BWA + ($con: expr, At($x: expr, $y: expr), Bg($bg: expr), + Wrap($width: expr, $height: expr), Align($alignment: expr), $($arg: tt)*) => ( + $con.print_rect_ex($x, $y, $width, $height, $bg, $alignment, format!($($arg)*)); + ); + + // WAB + ($con: expr, At($x: expr, $y: expr), Wrap($width: expr, $height: expr), + Align($alignment: expr), Bg($bg: expr), $($arg: tt)*) => ( + $con.print_rect_ex($x, $y, $width, $height, $bg, $alignment, format!($($arg)*)); + ); + + // WBA + ($con: expr, At($x: expr, $y: expr), Wrap($width: expr, $height: expr), + Bg($bg: expr), Align($alignment: expr), $($arg: tt)*) => ( + $con.print_rect_ex($x, $y, $width, $height, $bg, $alignment, format!($($arg)*)); + ); + + // AB + ($con: expr, At($x: expr, $y: expr), Align($bg: expr), Bg($alignment: expr), $($arg: tt)*) => ( + $con.print_ex($x, $y, $bg, $alignment, format!($($arg)*)); + ); + + // AW + ($con: expr, At($x: expr, $y: expr), Align($alignment: expr), Wrap($width: expr, $height: expr), $($arg: tt)*) => ( + { + let bg = $con.get_background_flag(); + $con.print_rect_ex($x, $y, $width, $height, bg, $alignment, format!($($arg)*)); + } + ); + + // BA + ($con: expr, At($x: expr, $y: expr), Bg($bg: expr), Align($alignment: expr), $($arg: tt)*) => ( + $con.print_ex($x, $y, $bg, $alignment, format!($($arg)*)); + ); + + // BW + ($con: expr, At($x: expr, $y: expr), Bg($bg: expr), Wrap($width: expr, $height: expr), $($arg: tt)*) => ( + { + let alignment = $con.get_alignment(); + $con.print_rect_ex($x, $y, $width, $height, $bg, alignment, format!($($arg)*)); + } + ); + + // WA + ($con: expr, At($x: expr, $y: expr), Wrap($width: expr, $height: expr), Align($alignment: expr), $($arg: tt)*) => ( + { + let bg = $con.get_background_flag(); + $con.print_rect_ex($x, $y, $width, $height, bg, $alignment, format!($($arg)*)); + } + ); + + // WB + ($con: expr, At($x: expr, $y: expr), Wrap($width: expr, $height: expr), Bg($bg: expr), $($arg: tt)*) => ( + { + let alignment = $con.get_alignment(); + $con.print_rect_ex($x, $y, $width, $height, $bg, alignment, format!($($arg)*)); + } + ); + + // A + ($con: expr, At($x: expr, $y: expr), Align($alignment: expr), $($arg: tt)*) => ( + { + let bg = $con.get_background_flag(); + $con.print_ex($x, $y, bg, $alignment, format!($($arg)*)); + } + ); + + // B + ($con: expr, At($x: expr, $y: expr), Bg($bg: expr), $($arg: tt)*) => ( + { + let alignment = $con.get_alignment(); + $con.print_ex($x, $y, $bg, alignment, format!($($arg)*)); + } + ); + + // W + ($con: expr, At($x: expr, $y: expr), Wrap($width: expr, $height: expr), $($arg: tt)*) => ( + $con.print_rect($x, $y, $width, $height, format!($($arg)*)); + ); + + // None + ($con: expr, At($x: expr, $y: expr), $($arg: tt)*) => ( + $con.print($x, $y, format!($($arg)*)); + ); +} diff --git a/tcod/src/image.rs b/tcod/src/image.rs new file mode 100644 index 00000000..c9dd0175 --- /dev/null +++ b/tcod/src/image.rs @@ -0,0 +1,218 @@ +use std::io::{Error, ErrorKind}; +use std::path::Path; + +use bindings::ffi; +use bindings::{AsNative, FromNative, CString}; +use colors::Color; +use console::{BackgroundFlag, Console}; + +pub struct Image { + tcod_image: ffi::TCOD_image_t, + width: i32, + height: i32, +} + +impl AsNative for Image { + unsafe fn as_native(&self) -> &ffi::TCOD_image_t { + &self.tcod_image + } +} + +impl FromNative for Image { + unsafe fn from_native(image: ffi::TCOD_image_t) -> Image { + let (width, height) = get_image_size(image); + assert!(width != 0); + Image { tcod_image: image, width: width, height: height } + } +} + +#[inline] +unsafe fn get_image_size(tcod_image: ffi::TCOD_image_t) -> (i32, i32) { + let (mut width, mut height) = (0, 0); + ffi::TCOD_image_get_size(tcod_image, &mut width, &mut height); + (width, height) +} + +impl Image { + pub fn new(width: i32, height: i32) -> Image { + unsafe { + Image { + tcod_image: ffi::TCOD_image_new(width, height), + width: width, + height: height, + } + } + } + + pub fn from_file(path: T) -> Result where T: AsRef { + let path_string = CString::new(path.as_ref().to_str().unwrap()).unwrap(); + unsafe { + let tcod_image = ffi::TCOD_image_load(path_string.as_ptr()); + let (width, height) = get_image_size(tcod_image); + + if width == 0 { + Err(Error::new(ErrorKind::InvalidInput, "The provided image format is not supported by libtcod")) + } else { + Ok(Image { tcod_image: tcod_image, width: width, height: height }) + } + } + } + + pub fn from_console(console: &T) -> Image where T: Console { + unsafe { + let tcod_image = ffi::TCOD_image_from_console(*console.as_native()); + let (width, height) = get_image_size(tcod_image); + Image { + tcod_image: tcod_image, + width: width, + height: height + } + } + } + + pub fn refresh_console(&mut self, console: &T) where T: Console { + assert!( + { + let img = Image::from_console(console); + self.width == img.width && self.height == img.height + }, + + "libtcod only supports console refreshing with consoles of equivalent sizes" + ); + + unsafe { + ffi::TCOD_image_refresh_console(self.tcod_image, *console.as_native()); + } + } + + pub fn save(&self, path: T) where T: AsRef { + let path_string = CString::new(path.as_ref().to_str().unwrap()).unwrap(); + unsafe { + ffi::TCOD_image_save(self.tcod_image, path_string.as_ptr()); + } + } + + pub fn width(&self) -> i32 { + self.width + } + + pub fn height(&self) -> i32 { + self.height + } + + pub fn get_size(&self) -> (i32, i32) { + (self.width, self.height) + } + + pub fn get_pixel(&self, x: i32, y: i32) -> Color { + assert!(x >= 0 && y >= 0 && x < self.width && y < self.height); + unsafe { + FromNative::from_native(ffi::TCOD_image_get_pixel(self.tcod_image, x, y)) + } + } + + pub fn get_alpha(&self, x: i32, y: i32) -> i32 { + assert!(x >= 0 && y >= 0 && x < self.width && y < self.height); + unsafe { + ffi::TCOD_image_get_alpha(self.tcod_image, x, y) + } + } + + pub fn is_pixel_transparent(&self, x: i32, y: i32) -> bool { + assert!(x >= 0 && y >= 0 && x < self.width && y < self.height); + unsafe { + ffi::TCOD_image_is_pixel_transparent(self.tcod_image, x, y) != 0 + } + } + + pub fn get_mipmap_pixel(&self, (x0, y0): (f32, f32), (x1, y1): (f32, f32)) -> Color { + assert!(x0 >= 0.0 && y0 >= 0.0 && + x0 < x1 && y0 < y1 && + x1 < self.width as f32 && y1 < self.height as f32); + unsafe { + FromNative::from_native(ffi::TCOD_image_get_mipmap_pixel(self.tcod_image, x0, y0, x1, y1)) + } + } + + pub fn set_key_color(&mut self, color: Color) { + unsafe { + ffi::TCOD_image_set_key_color(self.tcod_image, *color.as_native()); + } + } + + pub fn clear(&mut self, color: Color) { + unsafe { + ffi::TCOD_image_clear(self.tcod_image, *color.as_native()); + } + } + + pub fn put_pixel(&mut self, x: i32, y: i32, color: Color) { + assert!(x >= 0 && y >= 0 && x < self.width && y < self.height); + unsafe { + ffi::TCOD_image_put_pixel(self.tcod_image, x, y, *color.as_native()); + } + } + + pub fn scale(&mut self, width: i32, height: i32) { + unsafe { + ffi::TCOD_image_scale(self.tcod_image, width, height); + } + self.width = width; + self.height = height; + } + + pub fn hflip(&mut self) { + unsafe { + ffi::TCOD_image_hflip(self.tcod_image); + } + } + + pub fn vflip(&mut self) { + unsafe { + ffi::TCOD_image_vflip(self.tcod_image); + } + } + + pub fn rotate90(&mut self, num_rotations: i32) { + let (width, height) = unsafe { + ffi::TCOD_image_rotate90(self.tcod_image, num_rotations); + get_image_size(self.tcod_image) + }; + self.width = width; + self.height = height; + } + + pub fn invert(&mut self) { + unsafe { + ffi::TCOD_image_invert(self.tcod_image); + } + } +} + +pub fn blit_rect(src: &Image, (width, height): (i32, i32), + dst: &mut T, (x, y): (i32, i32), flag: BackgroundFlag) where T: Console { + assert!(width >= -1 && height >= -1 && width <= src.width && height <= src.height); + assert!(x >= 0 && y >= 0 && x < dst.width() && y < dst.height()); + unsafe { + ffi::TCOD_image_blit_rect(src.tcod_image, *dst.as_native(), x, y, width, height, flag as u32); + } +} + +pub fn blit(src: &Image, (scale_x, scale_y): (f32, f32), angle: f32, + dst: &mut T, (x, y): (f32, f32), flag: BackgroundFlag) where T: Console { + assert!(scale_x > 0.0 && scale_y > 0.0); + assert!(x >= 0.0 && y >= 0.0 && x < dst.width() as f32 && y < dst.height() as f32); + unsafe { + ffi::TCOD_image_blit(src.tcod_image, *dst.as_native(), x, y, flag as u32, scale_x, scale_y, angle); + } +} + +pub fn blit_2x(src: &Image, (src_x, src_y): (i32, i32), (width, height): (i32, i32), + dst: &mut T, (dst_x, dst_y): (i32, i32)) where T: Console { + assert!(width >= -1 && height >= -1 && width <= src.width && height <= src.height); + assert!(src_x >= 0 && src_y >= 0 && src_x < src.width && src_y < src.height); + assert!(dst_x >= 0 && dst_y >= 0 && dst_x < dst.width() && dst_y < dst.height()); + unsafe { + ffi::TCOD_image_blit_2x(src.tcod_image, *dst.as_native(), dst_x, dst_y, src_x, src_y, width, height); + } +} diff --git a/tcod/src/input.rs b/tcod/src/input.rs new file mode 100644 index 00000000..3e3b6e18 --- /dev/null +++ b/tcod/src/input.rs @@ -0,0 +1,255 @@ +use std::mem; + +use bindings::ffi; +use bindings::{c_bool, c_uint, keycode_from_u32}; + + +/// Deprecated. Use `tcod::input::Mouse` instead. +pub type MouseState = Mouse; + +#[repr(C)] +#[derive(Copy, Clone, PartialEq, Debug)] +pub enum KeyCode { + NoKey = ffi::TCODK_NONE as isize, + Escape = ffi::TCODK_ESCAPE as isize, + Backspace = ffi::TCODK_BACKSPACE as isize, + Tab = ffi::TCODK_TAB as isize, + Enter = ffi::TCODK_ENTER as isize, + Shift = ffi::TCODK_SHIFT as isize, + Control = ffi::TCODK_CONTROL as isize, + Alt = ffi::TCODK_ALT as isize, + Pause = ffi::TCODK_PAUSE as isize, + CapsLock = ffi::TCODK_CAPSLOCK as isize, + PageUp = ffi::TCODK_PAGEUP as isize, + PageDown = ffi::TCODK_PAGEDOWN as isize, + End = ffi::TCODK_END as isize, + Home = ffi::TCODK_HOME as isize, + Up = ffi::TCODK_UP as isize, + Left = ffi::TCODK_LEFT as isize, + Right = ffi::TCODK_RIGHT as isize, + Down = ffi::TCODK_DOWN as isize, + PrintScreen = ffi::TCODK_PRINTSCREEN as isize, + Insert = ffi::TCODK_INSERT as isize, + Delete = ffi::TCODK_DELETE as isize, + LeftWin = ffi::TCODK_LWIN as isize, + RightWin = ffi::TCODK_RWIN as isize, + Apps = ffi::TCODK_APPS as isize, + // The numbers on the alphanum section of the keyboard + Number0 = ffi::TCODK_0 as isize, + Number1 = ffi::TCODK_1 as isize, + Number2 = ffi::TCODK_2 as isize, + Number3 = ffi::TCODK_3 as isize, + Number4 = ffi::TCODK_4 as isize, + Number5 = ffi::TCODK_5 as isize, + Number6 = ffi::TCODK_6 as isize, + Number7 = ffi::TCODK_7 as isize, + Number8 = ffi::TCODK_8 as isize, + Number9 = ffi::TCODK_9 as isize, + // The numbers on the numeric keypad + NumPad0 = ffi::TCODK_KP0 as isize, + NumPad1 = ffi::TCODK_KP1 as isize, + NumPad2 = ffi::TCODK_KP2 as isize, + NumPad3 = ffi::TCODK_KP3 as isize, + NumPad4 = ffi::TCODK_KP4 as isize, + NumPad5 = ffi::TCODK_KP5 as isize, + NumPad6 = ffi::TCODK_KP6 as isize, + NumPad7 = ffi::TCODK_KP7 as isize, + NumPad8 = ffi::TCODK_KP8 as isize, + NumPad9 = ffi::TCODK_KP9 as isize, + NumPadAdd = ffi::TCODK_KPADD as isize, + NumPadSubtract = ffi::TCODK_KPSUB as isize, + NumPadDivide = ffi::TCODK_KPDIV as isize, + NumPadMultiply = ffi::TCODK_KPMUL as isize, + NumPadDecimal = ffi::TCODK_KPDEC as isize, + NumPadEnter = ffi::TCODK_KPENTER as isize, + F1 = ffi::TCODK_F1 as isize, + F2 = ffi::TCODK_F2 as isize, + F3 = ffi::TCODK_F3 as isize, + F4 = ffi::TCODK_F4 as isize, + F5 = ffi::TCODK_F5 as isize, + F6 = ffi::TCODK_F6 as isize, + F7 = ffi::TCODK_F7 as isize, + F8 = ffi::TCODK_F8 as isize, + F9 = ffi::TCODK_F9 as isize, + F10 = ffi::TCODK_F10 as isize, + F11 = ffi::TCODK_F11 as isize, + F12 = ffi::TCODK_F12 as isize, + NumLock = ffi::TCODK_NUMLOCK as isize, + ScrollLock = ffi::TCODK_SCROLLLOCK as isize, + Spacebar = ffi::TCODK_SPACE as isize, + Char = ffi::TCODK_CHAR as isize, +} + +impl Default for KeyCode { + fn default() -> Self { + KeyCode::NoKey + } +} + +#[derive(Copy, Clone, PartialEq, Debug, Default)] +pub struct Key { + pub code: KeyCode, + pub printable: char, + pub pressed: bool, + pub left_alt: bool, + pub left_ctrl: bool, + pub right_alt: bool, + pub right_ctrl: bool, + pub shift: bool, + pub alt: bool, + pub ctrl: bool, +} + +impl From for Key { + fn from(tcod_key: ffi::TCOD_key_t) -> Key { + Key { + code: keycode_from_u32(tcod_key.vk).unwrap(), + printable: tcod_key.c as u8 as char, + pressed: tcod_key.pressed != 0, + left_alt: tcod_key.lalt != 0, + left_ctrl: tcod_key.lctrl != 0, + right_alt: tcod_key.ralt != 0, + right_ctrl: tcod_key.rctrl != 0, + shift: tcod_key.shift != 0, + alt: tcod_key.lalt != 0 || tcod_key.ralt != 0, + ctrl: tcod_key.lctrl != 0 || tcod_key.rctrl != 0, + } + } +} + +#[derive(Copy, Clone, PartialEq, Debug, Default)] +pub struct Mouse { + pub x: isize, + pub y: isize, + pub dx: isize, + pub dy: isize, + pub cx: isize, + pub cy: isize, + pub dcx: isize, + pub dcy: isize, + pub lbutton: bool, + pub rbutton: bool, + pub mbutton: bool, + pub lbutton_pressed: bool, + pub rbutton_pressed: bool, + pub mbutton_pressed: bool, + pub wheel_up: bool, + pub wheel_down: bool, +} + + +pub fn show_cursor(visible: bool) { + unsafe { + ffi::TCOD_mouse_show_cursor(visible as c_bool); + } +} + +pub fn is_cursor_visible() -> bool { + unsafe { + ffi::TCOD_mouse_is_cursor_visible() != 0 + } +} + +pub fn move_cursor(x: i32, y: i32) { + unsafe { + ffi::TCOD_mouse_move(x, y); + } +} + +bitflags! { + flags KeyPressFlags: c_uint { + const KEY_PRESSED = ffi::TCOD_KEY_PRESSED, + const KEY_RELEASED = ffi::TCOD_KEY_RELEASED, + } +} + +bitflags! { + flags EventFlags: c_uint { + const KEY_PRESS = ffi::TCOD_EVENT_KEY_PRESS, + const KEY_RELEASE = ffi::TCOD_EVENT_KEY_RELEASE, + const KEY = ffi::TCOD_EVENT_KEY, + const MOUSE_MOVE = ffi::TCOD_EVENT_MOUSE_MOVE, + const MOUSE_PRESS = ffi::TCOD_EVENT_MOUSE_PRESS, + const MOUSE_RELEASE = ffi::TCOD_EVENT_MOUSE_RELEASE, + const MOUSE = ffi::TCOD_EVENT_MOUSE, + const ANY = ffi::TCOD_EVENT_ANY, + } +} + +pub fn check_for_event(event_mask: EventFlags) -> Option<(EventFlags, Event)> { + let mut c_key_state: ffi::TCOD_key_t = unsafe { mem::uninitialized() }; + let mut c_mouse_state: ffi::TCOD_mouse_t = unsafe { mem::uninitialized() }; + + let event = unsafe { + ffi::TCOD_sys_check_for_event(event_mask.bits() as i32, + &mut c_key_state, &mut c_mouse_state) + }; + + let ret_flag = match event { + ffi::TCOD_EVENT_KEY_PRESS => KEY_PRESS, + ffi::TCOD_EVENT_KEY_RELEASE => KEY_RELEASE, + ffi::TCOD_EVENT_KEY => KEY, + ffi::TCOD_EVENT_MOUSE => MOUSE, + ffi::TCOD_EVENT_MOUSE_MOVE => MOUSE_MOVE, + ffi::TCOD_EVENT_MOUSE_PRESS => MOUSE_PRESS, + ffi::TCOD_EVENT_MOUSE_RELEASE => MOUSE_RELEASE, + _ => ANY + }; + + if ret_flag == ANY { + return None + } + + let ret_event = if ret_flag.intersects(KEY_PRESS|KEY_RELEASE|KEY) { + Some(Event::Key(c_key_state.into())) + } else if ret_flag.intersects(MOUSE_MOVE|MOUSE_PRESS|MOUSE_RELEASE|MOUSE) { + Some(Event::Mouse(Mouse { + x: c_mouse_state.x as isize, + y: c_mouse_state.y as isize, + dx: c_mouse_state.dx as isize, + dy: c_mouse_state.dy as isize, + cx: c_mouse_state.cx as isize, + cy: c_mouse_state.cy as isize, + dcx: c_mouse_state.dcx as isize, + dcy: c_mouse_state.dcy as isize, + lbutton: c_mouse_state.lbutton != 0, + rbutton: c_mouse_state.rbutton != 0, + mbutton: c_mouse_state.mbutton != 0, + lbutton_pressed: c_mouse_state.lbutton_pressed != 0, + rbutton_pressed: c_mouse_state.rbutton_pressed != 0, + mbutton_pressed: c_mouse_state.mbutton_pressed != 0, + wheel_up: c_mouse_state.wheel_up != 0, + wheel_down: c_mouse_state.wheel_down != 0 + })) + } else { + None + }; + + ret_event.map(|event| (ret_flag, event)) +} + +pub fn events() -> EventIterator { + EventIterator::new() +} + +#[derive(Copy, Clone, Debug)] +pub enum Event { + Key(Key), + Mouse(Mouse) +} + +pub struct EventIterator; + +impl EventIterator { + pub fn new() -> Self { + EventIterator + } +} + +impl Iterator for EventIterator { + type Item = (EventFlags, Event); + + fn next(&mut self) -> Option<(EventFlags, Event)> { + check_for_event(KEY | MOUSE) + } +} diff --git a/tcod/src/lib.rs b/tcod/src/lib.rs new file mode 100644 index 00000000..6d5d99cb --- /dev/null +++ b/tcod/src/lib.rs @@ -0,0 +1,74 @@ +//! libtcod bindings for Rust +//! +//! ## Description +//! [libtcod a.k.a. "The Doryen Library"](http://roguecentral.org/doryen/libtcod/) is a +//! free, fast, portable and uncomplicated API for roguelike developpers providing lots of +//! useful functions, such as: +//! +//! * Text-based graphics API +//! * Colors +//! * Keyboard and mouse input +//! * Path finding +//! * Field of View +//! * Portability (works on Windows, Linux and OS X) +//! +//! For the full set of features see the [libtcod features page](http://roguecentral.org/doryen/libtcod/features/). +//! +//! All raw bindings are available via the `tcod-sys` crate, however the `tcod-rs` library aims to +//! provide safe, Rust-style wrappers for most of `libtcod`. These wrappers are not yet complete, +//! however. +//! +//! ### Features already implemented: +//! +//! * Colors +//! * Console +//! * Most of the System layer +//! * Field of View +//! * Map +//! * Pathfinding +//! * Line toolkit +//! * Noise +//! * BSP Toolkit +//! +//! ### Features that are not planned to be implemented: +//! This are features that Rust already provides a good (and in most casese more idiomatic) +//! solution for: +//! +//! * Filesystem utilities +//! * Containers +//! * Pseudorandom generators +//! * Compression utilities +//! + +#[macro_use] extern crate bitflags; +#[macro_use] extern crate lazy_static; +#[cfg(feature = "rustc-serialize")] extern crate rustc_serialize; +#[cfg(feature = "serde")] extern crate serde; +#[cfg(test)] extern crate serde_json; + +pub use bindings::{AsNative, FromNative}; +pub use colors::Color; +pub use console::{Console, RootInitializer, BackgroundFlag, Renderer, FontLayout, FontType, TextAlignment}; +pub use map::Map; + +pub mod bsp; +pub mod chars; +pub mod colors; +pub mod console; +pub mod image; +pub mod input; +pub mod line; +pub mod map; +pub mod namegen; +pub mod noise; +pub mod pathfinding; +pub mod random; +pub mod system; + +mod bindings; +mod console_macros; +mod serde_impls; +mod rustc_serialize_impls; + +pub type RootConsole = console::Root; +pub type OffscreenConsole = console::Offscreen; diff --git a/tcod/src/line.rs b/tcod/src/line.rs new file mode 100644 index 00000000..78e25348 --- /dev/null +++ b/tcod/src/line.rs @@ -0,0 +1,162 @@ +//! Port of line drawing toolkit. + +extern crate libc; + +use bindings::ffi; +use bindings::c_int; + +/// tcod-rs uses libtcod's multithreaded line API, therefore more then one line +/// can be created and drawn. The `Line` struct represents a line. +#[derive(Default)] +pub struct Line { + tcod_line: ffi::TCOD_bresenham_data_t, +} + +impl Line { + /// Creates a line from `start` to `end` (inclusive). + pub fn new(start: (i32, i32), end: (i32, i32)) -> Self { + let mut line: Line = Default::default(); + unsafe { + ffi::TCOD_line_init_mt(start.0, start.1, end.0, end.1, &mut line.tcod_line) + }; + line + } + + /// Creates a new line and steps over it using provided closure as a callback. + /// The stepping is aborted when the closure returns false. The function returs + /// a part of the line that has not been stepped over. + /// + /// # Examples + /// + /// ```no_run + /// # use tcod::line::Line; + /// let mut line = Line::new_with_callback((1, 1), (5, 5), |x, _y| { + /// x < 4 + /// }); + /// assert_eq!(Some((5, 5)), line.next()); + /// ``` + pub fn new_with_callback(start: (i32, i32), end: (i32, i32), callback: F) -> Self + where F: FnMut(i32, i32) -> bool + { + let mut line: Line = Line::new(start, end); + line.step_with_callback(callback); + line + } + + /// You can step through each point of the line. Return `None` when end of line + /// has been reached. + pub fn step(&mut self) -> Option<(i32, i32)> { + let mut x: c_int = 0; + let mut y: c_int = 0; + let end = unsafe { + ffi::TCOD_line_step_mt(&mut x, &mut y, &mut self.tcod_line) + }; + + if end == 0 { + Some((x, y)) + } else { + None + } + } + + fn step_with_callback(&mut self, mut callback: F) -> bool + where F: FnMut(i32, i32) -> bool + { + let mut x: c_int = self.tcod_line.origx; + let mut y: c_int = self.tcod_line.origy; + loop { + if !callback(x, y) { + return false + } + let step = unsafe { + ffi::TCOD_line_step_mt(&mut x, &mut y, &mut self.tcod_line) + }; + if step != 0 { + break + } + } + true + } +} + +impl Iterator for Line { + type Item = (i32, i32); + + fn next(&mut self) -> Option { + self.step() + } +} + +#[cfg(test)] +mod test { + use super::Line; + + #[test] + fn line_created() { + let line = Line::new((1, 1), (5, 5)); + + assert_eq!(line.tcod_line.origx, 1); + assert_eq!(line.tcod_line.origy, 1); + assert_eq!(line.tcod_line.destx, 5); + assert_eq!(line.tcod_line.desty, 5); + } + + #[test] + fn start_end_same() { + let line = Line::new((1, 1), (1, 1)); + + assert_eq!(line.tcod_line.origx, 1); + assert_eq!(line.tcod_line.origy, 1); + assert_eq!(line.tcod_line.destx, 1); + assert_eq!(line.tcod_line.desty, 1); + } + + #[test] + fn step_line() { + let mut line = Line::new((1, 1), (5, 5)); + + assert_eq!(Some((2, 2)), line.step()); + assert_eq!(Some((3, 3)), line.step()); + assert_eq!(Some((4, 4)), line.step()); + assert_eq!(Some((5, 5)), line.step()); + assert_eq!(None, line.step()); + } + + #[test] + fn step_two_lines() { + let mut line1 = Line::new((1, 1), (5, 5)); + let mut line2 = Line::new((10, 10), (14, 14)); + + assert_eq!(Some((2, 2)), line1.step()); + assert_eq!(Some((11, 11)), line2.step()); + assert_eq!(Some((3, 3)), line1.step()); + assert_eq!(Some((12, 12)), line2.step()); + assert_eq!(Some((4, 4)), line1.step()); + assert_eq!(Some((13, 13)), line2.step()); + assert_eq!(Some((5, 5)), line1.step()); + assert_eq!(Some((14, 14)), line2.step()); + assert_eq!(None, line1.step()); + assert_eq!(None, line2.step()); + } + + #[test] + fn iterate_over_line() { + let mut line = Line::new((1, 1), (5, 5)); + + assert_eq!(Some((2, 2)), line.next()); + assert_eq!(Some((3, 3)), line.next()); + assert_eq!(Some((4, 4)), line.next()); + assert_eq!(Some((5, 5)), line.next()); + assert_eq!(None, line.next()); + } + + #[test] + fn line_with_callback() { + let mut line = Line::new_with_callback((1, 1), (5, 5), |x, _y| { + assert!(x <= 4); + x < 4 + }); + assert_eq!(Some((5, 5)), line.next()); + assert_eq!(None, line.next()); + } +} diff --git a/tcod/src/map.rs b/tcod/src/map.rs new file mode 100644 index 00000000..8c419576 --- /dev/null +++ b/tcod/src/map.rs @@ -0,0 +1,93 @@ +use bindings::ffi; +use bindings::{AsNative, c_bool}; + +pub struct Map { + tcod_map: ffi::TCOD_map_t, +} + +impl AsNative for Map { + unsafe fn as_native(&self) -> &ffi::TCOD_map_t { + &self.tcod_map + } +} + +impl Map { + pub fn new(width: i32, height: i32) -> Map { + assert!(width > 0 && height > 0); + unsafe { + Map{tcod_map: ffi::TCOD_map_new(width, height)} + } + } + + pub fn size(&self) -> (i32, i32) { + unsafe { + (ffi::TCOD_map_get_width(self.tcod_map), + ffi::TCOD_map_get_height(self.tcod_map)) + } + } + + pub fn set(&mut self, x: i32, y: i32, transparent: bool, walkable: bool) { + assert!(x >= 0 && y >= 0); + let (width, height) = self.size(); + assert!(x < width && y < height); + unsafe { + ffi::TCOD_map_set_properties(self.tcod_map, x, y, + transparent as c_bool, + walkable as c_bool); + } + } + + pub fn compute_fov(&mut self, origin_x: i32, origin_y: i32, max_radius: i32, + light_walls: bool, algo: FovAlgorithm) { + assert!(origin_x >= 0 && origin_y >= 0); + unsafe { + ffi::TCOD_map_compute_fov(self.tcod_map, origin_x, origin_y, max_radius, + light_walls as c_bool, + algo as u32); + } + } + + pub fn is_in_fov(&self, x: i32, y: i32) -> bool { + assert!(x >= 0 && y >= 0); + let (width, height) = self.size(); + assert!(x < width && y < height); + unsafe { + ffi::TCOD_map_is_in_fov(self.tcod_map, x, y) != 0 + } + } + + pub fn is_walkable(&self, x: i32, y: i32) -> bool { + assert!(x >= 0 && y >= 0); + let (width, height) = self.size(); + assert!(x < width && y < height); + unsafe { + ffi::TCOD_map_is_walkable(self.tcod_map, x, y) != 0 + } + } +} + +impl Drop for Map { + fn drop(&mut self) { + unsafe { + ffi::TCOD_map_delete(self.tcod_map) + } + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug)] +pub enum FovAlgorithm { + Basic = ffi::FOV_BASIC as isize, + Diamond = ffi::FOV_DIAMOND as isize, + Shadow = ffi::FOV_SHADOW as isize, + Permissive0 = ffi::FOV_PERMISSIVE_0 as isize, + Permissive1 = ffi::FOV_PERMISSIVE_1 as isize, + Permissive2 = ffi::FOV_PERMISSIVE_2 as isize, + Permissive3 = ffi::FOV_PERMISSIVE_3 as isize, + Permissive4 = ffi::FOV_PERMISSIVE_4 as isize, + Permissive5 = ffi::FOV_PERMISSIVE_5 as isize, + Permissive6 = ffi::FOV_PERMISSIVE_6 as isize, + Permissive7 = ffi::FOV_PERMISSIVE_7 as isize, + Permissive8 = ffi::FOV_PERMISSIVE_8 as isize, + Restrictive = ffi::FOV_RESTRICTIVE as isize, +} diff --git a/tcod/src/namegen.rs b/tcod/src/namegen.rs new file mode 100644 index 00000000..8c8cad85 --- /dev/null +++ b/tcod/src/namegen.rs @@ -0,0 +1,107 @@ +use std::ptr; +use std::str; +use std::ffi::{CStr, CString}; +use std::path::Path; +use std::sync::Mutex; + +use bindings::ffi; +use bindings::{AsNative, c_char}; +use random::Rng; + +static mut NAMEGEN_FREE: bool = true; +lazy_static! { + static ref NAMEGEN_MUTEX: Mutex<()> = Mutex::new(()); +} + +pub struct Namegen { + rng: Vec, +} + +impl Drop for Namegen { + fn drop(&mut self) { + unsafe { + let _lock = NAMEGEN_MUTEX.lock() + .ok() + .expect("Namegen mutex could not be locked"); + if self.rng.is_empty() { + ffi::TCOD_namegen_destroy(); + } + NAMEGEN_FREE = true; + } + } +} + +impl Namegen { + pub fn new() -> Option { + unsafe { + match NAMEGEN_FREE { + true => { + let _lock = NAMEGEN_MUTEX.lock() + .ok() + .expect("Namegen mutex could not be locked"); + NAMEGEN_FREE = false; + Some(Namegen { rng: Vec::new() }) + }, + false => None + } + } + } + + pub fn parse(&mut self, path: T) where T: AsRef { + self.parse_with_rng(path, &Rng::get_instance()) + } + + pub fn parse_with_rng(&mut self, path: T, rng: &Rng) where T: AsRef { + self.rng.push(rng.save()); + + let path_string = CString::new(path.as_ref().to_str().unwrap()).unwrap(); + unsafe { + ffi::TCOD_namegen_parse(path_string.as_ptr(), *self.rng.last().unwrap().as_native()); + } + } + + pub fn generate(&self, name: T) -> Option where T: AsRef { + unsafe { + let name_string = CString::new(name.as_ref()).unwrap(); + let borrowed = ffi::TCOD_namegen_generate(name_string.as_ptr() as *mut _, 0); + cstr_to_owned(borrowed) + } + } + + pub fn generate_custom(&self, name: T, rule: U) -> Option where T: AsRef, U: AsRef { + unsafe { + let name_string = CString::new(name.as_ref()).unwrap(); + let rule_string = CString::new(rule.as_ref()).unwrap(); + + let borrowed = ffi::TCOD_namegen_generate_custom(name_string.as_ptr() as *mut _, + rule_string.as_ptr() as *mut _, 0); + cstr_to_owned(borrowed) + } + } + + pub fn get_sets(&self) -> Vec { + unsafe { + let list = ffi::TCOD_namegen_get_sets(); + let size = ffi::TCOD_list_size(list); + let mut ret = Vec::with_capacity(size as usize); + for i in 0..size { + ret.push(cstr_to_owned(ffi::TCOD_list_get(list, i) as *mut c_char).unwrap()); + } + ret + } + } +} + +#[inline] +fn cstr_to_owned(string: *mut c_char) -> Option { + if string == ptr::null::() as *mut _ { + return None; + } + + unsafe { + let string = CStr::from_ptr(string); + str::from_utf8(string.to_bytes()) + .map(|x| x.to_owned()) + .ok() + } +} diff --git a/tcod/src/noise.rs b/tcod/src/noise.rs new file mode 100644 index 00000000..ffb33b94 --- /dev/null +++ b/tcod/src/noise.rs @@ -0,0 +1,463 @@ +//! Noise toolkit. +//! +//! Rust bindings follow the original API pretty closely. + +use bindings::ffi; +use bindings::AsNative; + +use random::Rng; + +/// Available noise types. +#[repr(C)] +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum NoiseType { + Default = ffi::TCOD_NOISE_DEFAULT as isize, + Perlin = ffi::TCOD_NOISE_PERLIN as isize, + Simplex = ffi::TCOD_NOISE_SIMPLEX as isize, + Wavelet = ffi::TCOD_NOISE_WAVELET as isize, +} + +/// Noise object encapsulates a noise generator. +#[derive(Debug)] +pub struct Noise { + noise: ffi::TCOD_noise_t, + dimensions: u32 +} + +/// Default hurst value. +pub const DEFAULT_HURST: f32 = 0.5; + +/// Default lacunarity value. +pub const DEFAULT_LACUNARITY: f32 = 2.0; + +/// Maximum number of octaves for turbulence and fbm noise functions. +pub const MAX_OCTAVES: u32 = 128; + +impl Noise { + /// Return an instance of [NoiseInitializer](./struct.NoiseInitializer.html) + /// which is used to customize the creation of Noise object. + pub fn init_with_dimensions(dimensions: u32) -> NoiseInitializer { + NoiseInitializer::new_init_with_dimensions(dimensions) + } + + pub fn set_type(&self, noise_type: NoiseType) { + unsafe { + ffi::TCOD_noise_set_type(self.noise, noise_type as u32) + } + } + + pub fn get>(&self, mut coords: T) -> f32 { + assert!(self.dimensions as usize == coords.as_mut().len()); + unsafe { + ffi::TCOD_noise_get(self.noise, coords.as_mut().as_mut_ptr()) + } + } + + pub fn get_ex>(&self, mut coords: T, noise_type: NoiseType) -> f32 { + assert!(self.dimensions as usize == coords.as_mut().len()); + unsafe { + ffi::TCOD_noise_get_ex(self.noise, + coords.as_mut().as_mut_ptr(), + noise_type as u32) + } + } + + pub fn get_fbm>(&self, mut coords: T, octaves: u32) -> f32 { + assert!(self.dimensions as usize == coords.as_mut().len()); + assert!(octaves > 0); + assert!(octaves < MAX_OCTAVES); + unsafe { + ffi::TCOD_noise_get_fbm(self.noise, coords.as_mut().as_mut_ptr(), octaves as f32) + } + } + + pub fn get_fbm_ex>(&self, mut coords: T, octaves: u32, noise_type: NoiseType) -> f32 { + assert!(self.dimensions as usize == coords.as_mut().len()); + assert!(octaves > 0); + assert!(octaves < MAX_OCTAVES); + unsafe { + ffi::TCOD_noise_get_fbm_ex(self.noise, + coords.as_mut().as_mut_ptr(), + octaves as f32, + noise_type as u32) + } + } + + pub fn get_turbulence>(&self, mut coords: T, octaves: u32) -> f32 { + assert!(self.dimensions as usize == coords.as_mut().len()); + assert!(octaves > 0); + assert!(octaves < MAX_OCTAVES); + unsafe { + ffi::TCOD_noise_get_turbulence(self.noise, + coords.as_mut().as_mut_ptr(), + octaves as f32) + } + } + + pub fn get_turbulence_ex>(&self, mut coords: T, octaves: u32, noise_type: NoiseType) -> f32 { + assert!(self.dimensions as usize == coords.as_mut().len()); + assert!(octaves > 0); + assert!(octaves < MAX_OCTAVES); + unsafe { + ffi::TCOD_noise_get_turbulence_ex(self.noise, + coords.as_mut().as_mut_ptr(), + octaves as f32, + noise_type as u32) + } + } +} + +impl Drop for Noise { + fn drop(&mut self) { + unsafe { ffi::TCOD_noise_delete(self.noise) } + } +} + +/// An initializer is used to customize creation of a `Noise` object. +pub struct NoiseInitializer { + dimensions: u32, + hurst: f32, + lacunarity: f32, + noise_type: NoiseType, + random: Rng +} + +impl NoiseInitializer { + fn new_init_with_dimensions(dimensions: u32) -> Self { + assert!(dimensions > 0 && dimensions <= 4); + NoiseInitializer { + dimensions: dimensions, + hurst: DEFAULT_HURST, + lacunarity: DEFAULT_LACUNARITY, + noise_type: NoiseType::Default, + random: Rng::get_instance() + } + } + + /// Sets the hurst value of the noise generator. + pub fn hurst(&mut self, hurst: f32) -> &mut Self { + self.hurst = hurst; + self + } + + /// Sets the lacunarity value of the noise generator. + pub fn lacunarity(&mut self, lacunarity: f32) -> &mut Self { + self.lacunarity = lacunarity; + self + } + + /// Sets the noise type the generator produces. + pub fn noise_type(&mut self, noise_type: NoiseType) -> &mut Self { + self.noise_type = noise_type; + self + } + + /// Sets a custom random number generator. Use + /// [tcod::random::Rng](../random/struct.Rng.html) instance. + pub fn random(&mut self, random: Rng) -> &mut Self { + self.random = random; + self + } + + /// Finalizes creation and returns a new `Noise` object. + pub fn init(&self) -> Noise { + unsafe { + let noise = Noise { + noise: ffi::TCOD_noise_new(self.dimensions as i32, self.hurst, + self.lacunarity, *self.random.as_native()), + dimensions: self.dimensions, + }; + ffi::TCOD_noise_set_type(noise.noise, self.noise_type as u32); + noise + } + } +} + +#[cfg(test)] +mod test { + use super::Noise; + use super::NoiseType; + + #[test] + fn get() { + let noise1d = Noise::init_with_dimensions(1).init(); + let noise2d = Noise::init_with_dimensions(2).init(); + let noise3d = Noise::init_with_dimensions(3).init(); + + let val1 = noise1d.get([1.0]); + let val1a = noise1d.get([1.0]); + assert!(val1 >= -1.0 && val1 <= 1.0); + assert_eq!(val1, val1a); + + let val2 = noise2d.get([1.0, 2.0]); + let val2a = noise2d.get([1.0, 2.0]); + assert!(val2 >= -1.0 && val2 <= 1.0); + assert_eq!(val2, val2a); + + let val3 = noise3d.get([1.0, 2.0, 3.0]); + let val3a = noise3d.get([1.0, 2.0, 3.0]); + assert!(val3 >= -1.0 && val3 <= 1.0); + assert_eq!(val3, val3a); + } + + #[test] + #[should_panic] + fn init_with_wrong_dimensions() { + Noise::init_with_dimensions(5).init(); + } + + #[test] + #[should_panic] + fn init_with_zero_dimensions() { + Noise::init_with_dimensions(0).init(); + } + + #[test] + #[should_panic] + fn get_not_enough_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get([1.0]); + } + + #[test] + #[should_panic] + fn get_too_many_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get([1.0, 2.0, 3.0]); + } + + #[test] + fn get_ex() { + let noise2d = Noise::init_with_dimensions(2).init(); + + let val1 = noise2d.get_ex([1.0, 2.0], NoiseType::Perlin); + let val1a = noise2d.get_ex([1.0, 2.0], NoiseType::Perlin); + assert!(val1 >= -1.0 && val1 <= 1.0); + assert_eq!(val1, val1a); + + let val2 = noise2d.get_ex([1.0, 2.0], NoiseType::Wavelet); + let val2a = noise2d.get_ex([1.0, 2.0], NoiseType::Wavelet); + assert!(val2 >= -1.0 && val2 <= 1.0); + assert_eq!(val2, val2a); + } + + #[test] + #[should_panic] + fn get_ex_not_enough_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_ex([1.0], NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_ex_too_many_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_ex([1.0, 2.0, 3.0], NoiseType::Perlin); + } + + #[test] + fn get_fbm() { + let noise1d = Noise::init_with_dimensions(1).init(); + let noise2d = Noise::init_with_dimensions(2).init(); + let noise3d = Noise::init_with_dimensions(3).init(); + + let val1 = noise1d.get_fbm([1.0], 32); + let val1a = noise1d.get_fbm([1.0], 32); + assert!(val1.is_nan() || val1 >= -1.0 && val1 <= 1.0); + if !val1.is_nan() { + assert_eq!(val1, val1a); + } + + let val2 = noise2d.get_fbm([1.0, 2.0], 32); + let val2a = noise2d.get_fbm([1.0, 2.0], 32); + assert!(val2.is_nan() || val2 >= -1.0 && val2 <= 1.0); + if !val2.is_nan() { + assert_eq!(val2, val2a); + } + + let val3 = noise3d.get_fbm([1.0, 2.0, 3.0], 32); + let val3a = noise3d.get_fbm([1.0, 2.0, 3.0], 32); + assert!(val3.is_nan() || val3 >= -1.0 && val3 <= 1.0); + if !val3.is_nan() { + assert_eq!(val3, val3a); + } + } + + #[test] + #[should_panic] + fn get_fbm_not_enough_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm([1.0], 32); + } + + #[test] + #[should_panic] + fn get_fbm_too_many_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm([1.0, 2.0, 3.0], 32); + } + + #[test] + #[should_panic] + fn get_fbm_octaves_zero() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm([1.0, 2.0, 3.0], 0); + } + + #[test] + #[should_panic] + fn get_fbm_octaves_too_big() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm([1.0, 2.0, 3.0], 128); + } + + #[test] + fn get_fbm_ex() { + let noise2d = Noise::init_with_dimensions(2).init(); + + let val1 = noise2d.get_fbm_ex([1.0, 2.0], 32, NoiseType::Perlin); + let val1a = noise2d.get_fbm_ex([1.0, 2.0], 32, NoiseType::Perlin); + assert!(val1.is_nan() || val1 >= -1.0 && val1 <= 1.0); + if !val1.is_nan() { + assert_eq!(val1, val1a); + } + + let val2 = noise2d.get_fbm_ex([1.0, 2.0], 64, NoiseType::Wavelet); + let val2a = noise2d.get_fbm_ex([1.0, 2.0], 64, NoiseType::Wavelet); + assert!(val2.is_nan() || val2 >= -1.0 && val2 <= 1.0); + if !val2.is_nan() { + assert_eq!(val2, val2a); + } + } + + #[test] + #[should_panic] + fn get_fbm_ex_not_enough_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm_ex([1.0], 32, NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_fbm_ex_too_many_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm_ex([1.0, 2.0, 3.0], 32, NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_fbm_ex_octaves_zero() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm_ex([1.0, 2.0, 3.0], 0, NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_fbm_ex_octaves_too_big() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_fbm_ex([1.0, 2.0, 3.0], 128, NoiseType::Perlin); + } + + #[test] + fn get_turbulence() { + let noise1d = Noise::init_with_dimensions(1).init(); + let noise2d = Noise::init_with_dimensions(2).init(); + let noise3d = Noise::init_with_dimensions(3).init(); + + let val1 = noise1d.get_turbulence([1.0], 32); + let val1a = noise1d.get_turbulence([1.0], 32); + assert!(val1.is_nan() || val1 >= -1.0 && val1 <= 1.0); + if !val1.is_nan() { + assert_eq!(val1, val1a); + } + + let val2 = noise2d.get_turbulence([1.0, 2.0], 32); + let val2a = noise2d.get_turbulence([1.0, 2.0], 32); + assert!(val2.is_nan() || val2 >= -1.0 && val2 <= 1.0); + if !val2.is_nan() { + assert_eq!(val2, val2a); + } + + let val3 = noise3d.get_turbulence([1.0, 2.0, 3.0], 32); + let val3a = noise3d.get_turbulence([1.0, 2.0, 3.0], 32); + assert!(val3.is_nan() || val3 >= -1.0 && val3 <= 1.0); + if !val3.is_nan() { + assert_eq!(val3, val3a); + } + } + + #[test] + #[should_panic] + fn get_turbulence_not_enough_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence([1.0], 32); + } + + #[test] + #[should_panic] + fn get_turbulence_too_many_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence([1.0, 2.0, 3.0], 32); + } + + #[test] + #[should_panic] + fn get_turbulence_octaves_zero() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence([1.0, 2.0, 3.0], 0); + } + + #[test] + #[should_panic] + fn get_turbulence_octaves_too_big() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence([1.0, 2.0, 3.0], 128); + } + + #[test] + fn get_turbulence_ex() { + let noise2d = Noise::init_with_dimensions(2).init(); + + let val1 = noise2d.get_turbulence_ex([1.0, 2.0], 32, NoiseType::Perlin); + let val1a = noise2d.get_turbulence_ex([1.0, 2.0], 32, NoiseType::Perlin); + assert!(val1.is_nan() || val1 >= -1.0 && val1 <= 1.0); + if !val1.is_nan() { + assert_eq!(val1, val1a); + } + + let val2 = noise2d.get_turbulence_ex([1.0, 2.0], 64, NoiseType::Wavelet); + let val2a = noise2d.get_turbulence_ex([1.0, 2.0], 64, NoiseType::Wavelet); + assert!(val2.is_nan() || val2 >= -1.0 && val2 <= 1.0); + if !val2.is_nan() { + assert_eq!(val2, val2a); + } + } + + #[test] + #[should_panic] + fn get_turbulence_ex_not_enough_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence_ex([1.0], 32, NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_turbulence_ex_too_many_args() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence_ex([1.0, 2.0, 3.0], 32, NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_turbulence_ex_octaves_zero() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence_ex([1.0, 2.0, 3.0], 0, NoiseType::Perlin); + } + + #[test] + #[should_panic] + fn get_turbulence_ex_octaves_too_big() { + let noise2d = Noise::init_with_dimensions(2).init(); + noise2d.get_turbulence_ex([1.0, 2.0, 3.0], 128, NoiseType::Perlin); + } +} diff --git a/tcod/src/pathfinding.rs b/tcod/src/pathfinding.rs new file mode 100644 index 00000000..6cd8a9bf --- /dev/null +++ b/tcod/src/pathfinding.rs @@ -0,0 +1,387 @@ +use bindings::ffi; +use bindings::{AsNative, c_bool, c_float, c_int, c_void}; +use map::Map; + +enum PathInnerData<'a> { + Map(Map), + Callback(Box f32+'a>), +} + +pub struct AStar<'a>{ + tcod_path: ffi::TCOD_path_t, + #[allow(dead_code)] + inner: PathInnerData<'a>, + width: i32, + height: i32, +} + +impl<'a> AsNative for AStar<'a> { + unsafe fn as_native(&self) -> &ffi::TCOD_path_t { + &self.tcod_path + } +} + +impl<'a> Drop for AStar<'a> { + fn drop(&mut self) { + unsafe { + ffi::TCOD_path_delete(self.tcod_path); + } + } +} + +extern "C" fn c_path_callback f32>(xf: c_int, yf: c_int, + xt: c_int, yt: c_int, + user_data: *mut c_void) -> c_float { + let callback_ptr = user_data as *mut T; + let cb: &mut T = unsafe { + &mut *callback_ptr + }; + cb((xf, yf), (xt, yt)) +} + +impl<'a> AStar<'a> { + pub fn new_from_callback f32>( + width: i32, height: i32, path_callback: T, + diagonal_cost: f32) -> AStar<'a> { + let callback = Box::new(path_callback); + let user_data = &*callback as *const T as *mut c_void; + unsafe { + let tcod_path = ffi::TCOD_path_new_using_function(width, height, + Some(c_path_callback::), + user_data, + diagonal_cost); + AStar { + tcod_path: tcod_path, + // We need to keep user_closure around, otherwise it + // would get deallocated at the end of this function. + inner: PathInnerData::Callback(callback), + width: width, + height: height, + } + } + } + + pub fn new_from_map(map: Map, diagonal_cost: f32) -> AStar<'static> { + let tcod_path = unsafe { + ffi::TCOD_path_new_using_map(*map.as_native(), diagonal_cost) + }; + let (w, h) = map.size(); + AStar { + tcod_path: tcod_path, + inner: PathInnerData::Map(map), + width: w, + height: h, + } + } + + pub fn find(&mut self, + from: (i32, i32), + to: (i32, i32)) -> bool { + let (from_x, from_y) = from; + let (to_x, to_y) = to; + assert!(from_x >= 0 && from_y >= 0 && to_x >= 0 && to_y >= 0); + assert!(from_x < self.width && from_y < self.height && to_x < self.width && to_y < self.height); + unsafe { + ffi::TCOD_path_compute(self.tcod_path, + from_x, from_y, + to_x, to_y) != 0 + } + } + + pub fn iter(&'a self) -> AStarPathIter<'a> { + AStarPathIter { current: -1, path: self } + } + + pub fn walk(&mut self) -> AStarIterator { + AStarIterator{tcod_path: self.tcod_path, recalculate: false} + } + + pub fn walk_recalculate(&mut self) -> AStarIterator { + AStarIterator{tcod_path: self.tcod_path, recalculate: true} + } + + pub fn walk_one_step(&mut self, recalculate_when_needed: bool) -> Option<(i32, i32)> { + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + match ffi::TCOD_path_walk(self.tcod_path, &mut x, &mut y, + recalculate_when_needed as c_bool) != 0 { + true => Some((x, y)), + false => None, + } + } + } + + pub fn reverse(&mut self) { + unsafe { + ffi::TCOD_path_reverse(self.tcod_path) + } + } + + pub fn origin(&self) -> (isize, isize) { + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + ffi::TCOD_path_get_origin(self.tcod_path, &mut x, &mut y); + (x as isize, y as isize) + } + } + + pub fn destination(&self) -> (isize, isize) { + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + ffi::TCOD_path_get_destination(self.tcod_path, &mut x, &mut y); + (x as isize, y as isize) + } + } + + pub fn get(&self, index: i32) -> Option<(i32, i32)> { + if index < 0 || index >= self.len() { + return None; + } + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + ffi::TCOD_path_get(self.tcod_path, index, &mut x, &mut y); + (Some((x, y))) + } + } + + pub fn is_empty(&self) -> bool { + unsafe { + ffi::TCOD_path_is_empty(self.tcod_path) != 0 + } + } + + pub fn len(&self) -> i32 { + unsafe { + ffi::TCOD_path_size(self.tcod_path) + } + } +} + +pub struct Dijkstra<'a> { + tcod_path: ffi::TCOD_dijkstra_t, + #[allow(dead_code)] + inner: PathInnerData<'a>, + width: i32, + height: i32, +} + +impl<'a> AsNative for Dijkstra<'a> { + unsafe fn as_native(&self) -> &ffi::TCOD_dijkstra_t { + &self.tcod_path + } +} + +impl<'a> Drop for Dijkstra<'a> { + fn drop(&mut self) { + unsafe { + ffi::TCOD_dijkstra_delete(self.tcod_path); + } + } +} + +impl<'a> Dijkstra<'a> { + pub fn new_from_callback f32>( + width: i32, height: i32, + path_callback: T, + diagonal_cost: f32) -> Dijkstra<'a> { + let callback = Box::new(path_callback); + let user_data = &*callback as *const T as *mut c_void; + unsafe { + let tcod_path = ffi::TCOD_dijkstra_new_using_function(width, + height, + Some(c_path_callback::), + user_data, + diagonal_cost); + Dijkstra { + tcod_path: tcod_path, + inner: PathInnerData::Callback(callback), + width: width, + height: height, + } + } + } + + pub fn new_from_map(map: Map, diagonal_cost: f32) -> Dijkstra<'static> { + let tcod_path = unsafe { + ffi::TCOD_dijkstra_new(*map.as_native(), diagonal_cost) + }; + let (w, h) = map.size(); + Dijkstra { + tcod_path: tcod_path, + inner: PathInnerData::Map(map), + width: w, + height: h, + } + } + + pub fn compute_grid(&mut self, root: (i32, i32)) { + let (x, y) = root; + assert!(x >= 0 && y >= 0 && x < self.width && y < self.height); + unsafe { + ffi::TCOD_dijkstra_compute(self.tcod_path, x, y); + } + } + + pub fn find(&mut self, destination: (i32, i32)) -> bool { + let (x, y) = destination; + if x >= 0 && y >= 0 && x < self.width && y < self.height { + unsafe { + ffi::TCOD_dijkstra_path_set(self.tcod_path, x, y) != 0 + } + } else { + false + } + } + + pub fn iter(&'a self) -> DijkstraPathIter<'a> { + DijkstraPathIter { current: -1, path: self } + } + + pub fn walk(&mut self) -> DijkstraIterator { + DijkstraIterator{tcod_path: self.tcod_path} + } + + pub fn walk_one_step(&mut self) -> Option<(i32, i32)> { + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + match ffi::TCOD_dijkstra_path_walk(self.tcod_path, &mut x, &mut y) != 0 { + true => Some((x, y)), + false => None, + } + } + } + + + pub fn distance_from_root(&self, point: (i32, i32)) -> Option { + let (x, y) = point; + let result = unsafe { + ffi::TCOD_dijkstra_get_distance(self.tcod_path, x, y) + }; + if result == -1.0 { + None + } else { + Some(result) + } + } + + pub fn reverse(&mut self) { + unsafe { + ffi::TCOD_dijkstra_reverse(self.tcod_path); + } + } + + pub fn get(&self, index: i32) -> Option<(i32, i32)> { + if index < 0 || index >= self.len() { + return None; + } + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + ffi::TCOD_dijkstra_get(self.tcod_path, index, &mut x, &mut y); + Some((x, y)) + } + } + + pub fn is_empty(&self) -> bool { + unsafe { + ffi::TCOD_dijkstra_is_empty(self.tcod_path) != 0 + } + } + + pub fn len(&self) -> i32 { + unsafe { + ffi::TCOD_dijkstra_size(self.tcod_path) + } + } +} + +pub struct AStarIterator { + tcod_path: ffi::TCOD_path_t, + recalculate: bool, +} + +impl Iterator for AStarIterator { + type Item = (i32, i32); + + fn next(&mut self) -> Option<(i32, i32)> { + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + match ffi::TCOD_path_walk(self.tcod_path, &mut x, &mut y, + self.recalculate as c_bool) != 0 { + true => Some((x, y)), + false => None, + } + } + } +} + +pub struct DijkstraIterator { + tcod_path: ffi::TCOD_path_t, +} + +impl Iterator for DijkstraIterator { + type Item = (i32, i32); + + fn next(&mut self) -> Option<(i32, i32)> { + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + match ffi::TCOD_dijkstra_path_walk(self.tcod_path, &mut x, &mut y) != 0 { + true => Some((x, y)), + false => None, + } + } + } +} + +pub struct AStarPathIter<'a> { + current: i32, + path: &'a AStar<'a>, +} + +impl<'a> Iterator for AStarPathIter<'a> { + type Item = (i32, i32); + + fn next(&mut self) -> Option { + if self.current == self.path.len() - 1 { + None + } else { + self.current += 1; + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + ffi::TCOD_path_get(*self.path.as_native(), self.current, &mut x, &mut y); + Some((x, y)) + } + } + } +} + +pub struct DijkstraPathIter<'a> { + current: i32, + path: &'a Dijkstra<'a>, +} + +impl<'a> Iterator for DijkstraPathIter<'a> { + type Item = (i32, i32); + + fn next(&mut self) -> Option { + if self.current == self.path.len() - 1 { + None + } else { + self.current += 1; + unsafe { + let mut x: c_int = 0; + let mut y: c_int = 0; + ffi::TCOD_dijkstra_get(*self.path.as_native(), self.current, &mut x, &mut y); + Some((x, y)) + } + } + } +} diff --git a/tcod/src/random.rs b/tcod/src/random.rs new file mode 100644 index 00000000..3212756e --- /dev/null +++ b/tcod/src/random.rs @@ -0,0 +1,117 @@ +use bindings::ffi; +use bindings::AsNative; + +#[repr(C)] +#[derive(Copy, Clone)] +pub enum Distribution { + Linear = ffi::TCOD_DISTRIBUTION_LINEAR as isize, + Gaussian = ffi::TCOD_DISTRIBUTION_GAUSSIAN as isize, + GaussianRange = ffi::TCOD_DISTRIBUTION_GAUSSIAN_RANGE as isize, + GaussianInverse = ffi::TCOD_DISTRIBUTION_GAUSSIAN_INVERSE as isize, + GaussianRangeInverse = ffi::TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE as isize, + +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub enum Algo { + MT = ffi::TCOD_RNG_MT as isize, + CMWC = ffi::TCOD_RNG_CMWC as isize +} + +pub struct Rng { + tcod_random: ffi::TCOD_random_t, + default: bool +} + +impl Rng { + pub fn get_instance() -> Rng { + unsafe { + Rng { tcod_random: ffi::TCOD_random_get_instance(), default: true } + } + } + + pub fn new(algo: Algo) -> Rng { + unsafe { + Rng { tcod_random: ffi::TCOD_random_new(algo as u32), default: false } + } + } + + pub fn new_with_seed(algo: Algo, seed: u32) -> Rng { + unsafe { + Rng { tcod_random: ffi::TCOD_random_new_from_seed(algo as u32, seed), default: false } + } + } + + pub fn save(&self) -> Rng { + unsafe { + Rng { tcod_random: ffi::TCOD_random_save(self.tcod_random), default: false } + } + } + + pub fn restore(&mut self, backup: &Rng) { + unsafe { + ffi::TCOD_random_restore(self.tcod_random, backup.tcod_random); + } + } + + pub fn set_distribution(&self, distribution: Distribution) { + unsafe { + ffi::TCOD_random_set_distribution(self.tcod_random, distribution as u32); + } + } + + pub fn get_int(&self, min: i32, max: i32) -> i32 { + unsafe { + ffi::TCOD_random_get_int(self.tcod_random, min, max) + } + } + + pub fn get_int_mean(&self, min: i32, max: i32, mean: i32) -> i32 { + unsafe { + ffi::TCOD_random_get_int_mean(self.tcod_random, min, max, mean) + } + } + + pub fn get_float(&self, min: f32, max: f32) -> f32 { + unsafe { + ffi::TCOD_random_get_float(self.tcod_random, min, max) + } + } + + pub fn get_float_mean(&self, min: f32, max: f32, mean: f32) -> f32 { + unsafe { + ffi::TCOD_random_get_float_mean(self.tcod_random, min, max, mean) + } + } + + pub fn get_double(&self, min: f64, max: f64) -> f64 { + unsafe { + ffi::TCOD_random_get_double(self.tcod_random, min, max) + } + } + + pub fn get_double_mean(&self, min: f64, max: f64, mean: f64) -> f64 { + unsafe { + ffi::TCOD_random_get_double_mean(self.tcod_random, min, max, mean) + } + } +} + +impl AsNative for Rng { + unsafe fn as_native(&self) -> &ffi::TCOD_random_t { + &self.tcod_random + } +} + +impl Drop for Rng { + fn drop(&mut self) { + if !self.default { + unsafe { + ffi::TCOD_random_delete(self.tcod_random); + } + } + } +} + + diff --git a/tcod/src/rustc_serialize_impls.rs b/tcod/src/rustc_serialize_impls.rs new file mode 100644 index 00000000..814a9ff5 --- /dev/null +++ b/tcod/src/rustc_serialize_impls.rs @@ -0,0 +1,47 @@ +#![cfg(feature = "rustc-serialize")] + +use super::Color; +use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; + +impl Encodable for Color { + fn encode(&self, s: &mut S) -> Result<(), S::Error> { + s.emit_struct("Color", 3, |s| { + try!{ s.emit_struct_field("r", 0, |s| self.r.encode(s)) }; + try!{ s.emit_struct_field("g", 1, |s| self.g.encode(s)) }; + try!{ s.emit_struct_field("b", 2, |s| self.b.encode(s)) }; + Ok(()) + }) + } +} + +#[cfg(feature = "rustc-serialize")] +impl Decodable for Color { + fn decode(d: &mut D) -> Result { + d.read_struct("Color", 3, |d| { + let r = try!(d.read_struct_field("r", 0, |d| d.read_u8())); + let g = try!(d.read_struct_field("g", 1, |d| d.read_u8())); + let b = try!(d.read_struct_field("b", 2, |d| d.read_u8())); + Ok(Color{r: r, g: g, b: b}) + }) + } +} + + + +#[cfg(test)] +mod test { + use ::Color; + use ::rustc_serialize::json; + + #[test] + fn color_encode() { + let encoded = json::encode(&Color{r: 1, g: 2, b: 3}).unwrap(); + assert_eq!("{\"r\":1,\"g\":2,\"b\":3}", encoded); + } + + #[test] + fn color_decode() { + let decoded: Color = json::decode("{\"r\":1,\"g\":2,\"b\":3}").unwrap(); + assert_eq!(Color{r: 1, g: 2, b: 3}, decoded); + } +} diff --git a/tcod/src/serde_impls.rs b/tcod/src/serde_impls.rs new file mode 100644 index 00000000..28ed9160 --- /dev/null +++ b/tcod/src/serde_impls.rs @@ -0,0 +1,138 @@ +#![cfg(feature = "serde")] + +use super::Color; + +use serde::ser::{self, Serialize, Serializer}; +use serde::de::{self, Deserialize, Deserializer}; + +impl Serialize for Color { + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer { + serializer.visit_struct("Color", ColorMapVisitor { + value: self, + state: 0, + }) + } +} + +struct ColorMapVisitor<'a> { + value: &'a Color, + state: u8, +} + +impl<'a> ser::MapVisitor for ColorMapVisitor<'a> { + fn visit(&mut self, serializer: &mut S) -> Result, S::Error> + where S: Serializer + { + match self.state { + 0 => { + self.state += 1; + Ok(Some(try!(serializer.visit_struct_elt("r", &self.value.r)))) + } + 1 => { + self.state += 1; + Ok(Some(try!(serializer.visit_struct_elt("g", &self.value.g)))) + } + 2 => { + self.state += 1; + Ok(Some(try!(serializer.visit_struct_elt("b", &self.value.b)))) + } + _ => { + Ok(None) + } + } + } +} + +impl Deserialize for Color { + fn deserialize(deserializer: &mut D) -> Result where D: Deserializer { + static FIELDS: &'static [&'static str] = &["r", "g", "b"]; + deserializer.visit_struct("Color", FIELDS, ColorVisitor) + } +} + +struct ColorVisitor; + +impl de::Visitor for ColorVisitor { + type Value = Color; + + fn visit_map(&mut self, mut visitor: V) -> Result + where V: de::MapVisitor + { + let mut r = None; + let mut g = None; + let mut b = None; + + loop { + match try!(visitor.visit_key()) { + Some(ColorField::R) => { r = Some(try!(visitor.visit_value())); } + Some(ColorField::G) => { g = Some(try!(visitor.visit_value())); } + Some(ColorField::B) => { b = Some(try!(visitor.visit_value())); } + None => { break; } + } + } + + let r = match r { + Some(r) => r, + None => try!(visitor.missing_field("r")), + }; + + let g = match g { + Some(g) => g, + None => try!(visitor.missing_field("g")), + }; + + let b = match b { + Some(b) => b, + None => try!(visitor.missing_field("b")), + }; + + try!(visitor.end()); + + Ok(Color{r: r, g: g, b: b}) + } +} + +enum ColorField {R, G, B} + +impl Deserialize for ColorField { + fn deserialize(deserializer: &mut D) -> Result + where D: Deserializer + { + struct ColorFieldVisitor; + + impl de::Visitor for ColorFieldVisitor { + type Value = ColorField; + + fn visit_str(&mut self, value: &str) -> Result + where E: de::Error + { + match value { + "r" => Ok(ColorField::R), + "g" => Ok(ColorField::G), + "b" => Ok(ColorField::B), + _ => Err(de::Error::syntax("expected r, g or b")), + } + } + } + + deserializer.visit(ColorFieldVisitor) + } +} + +#[cfg(test)] +mod test { + use ::Color; + use serde_json; + + #[test] + fn color_encode() { + let encoded = serde_json::to_string(&Color{r: 1, g: 2, b: 3}).unwrap(); + assert_eq!("{\"r\":1,\"g\":2,\"b\":3}", encoded); + } + + #[test] + fn color_decode() { + let decoded: Color = serde_json::from_str("{\"r\":1,\"g\":2,\"b\":3}").unwrap(); + assert_eq!(Color{r: 1, g: 2, b: 3}, decoded); + } +} diff --git a/tcod/src/system.rs b/tcod/src/system.rs new file mode 100644 index 00000000..ab9e2e5d --- /dev/null +++ b/tcod/src/system.rs @@ -0,0 +1,105 @@ +use std::str; +use std::ptr; +use std::time::Duration; + +use std::ffi::{CStr, CString}; +use std::path::Path; +use bindings::ffi; + +pub fn set_fps(fps: i32) { + assert!(fps >= 0); + unsafe { + ffi::TCOD_sys_set_fps(fps) + } +} + +pub fn get_fps() -> i32 { + let result = unsafe { + ffi::TCOD_sys_get_fps() + }; + assert!(result >= 0); + result +} + +pub fn get_last_frame_length() -> f32 { + unsafe { + ffi::TCOD_sys_get_last_frame_length() + } +} + +pub fn sleep(time: Duration) { + let duration_ms = (time.as_secs() * 1000) as u32 + (time.subsec_nanos() / 1_000_000); + unsafe { + ffi::TCOD_sys_sleep_milli(duration_ms); + } +} + +pub fn get_elapsed_time() -> Duration { + let ms: u32 = unsafe { + ffi::TCOD_sys_elapsed_milli() + }; + Duration::from_millis(ms as u64) +} + +pub fn save_screenshot

(path: P) where P: AsRef { + let filename = path.as_ref().to_str().expect("Invalid screenshot path"); + let c_path = CString::new(filename).unwrap(); + unsafe { + ffi::TCOD_sys_save_screenshot(c_path.as_ptr()); + } +} + +pub fn save_screenshot_auto() { + unsafe { + ffi::TCOD_sys_save_screenshot(ptr::null()); + } +} + +pub fn force_fullscreen_resolution(width: i32, height: i32) { + assert!(width > 0 && height > 0); + unsafe { + ffi::TCOD_sys_force_fullscreen_resolution(width, height); + } +} + +pub fn get_current_resolution() -> (i32, i32) { + let mut width: i32 = 0; + let mut height: i32 = 0; + unsafe { + ffi::TCOD_sys_get_current_resolution(&mut width, &mut height); + } + (width, height) +} + +pub fn get_fullscreen_offset() -> (i32, i32) { + let mut x: i32 = 0; + let mut y: i32 = 0; + unsafe { + ffi::TCOD_sys_get_fullscreen_offsets(&mut x, &mut y); + } + (x, y) +} + +pub fn get_char_size() -> (i32, i32) { + let mut width: i32 = 0; + let mut height: i32 = 0; + unsafe { + ffi::TCOD_sys_get_char_size(&mut width, &mut height); + } + (width, height) +} + +pub fn set_clipboard(value: T) where T: AsRef { + let c_str = CString::new(value.as_ref().as_bytes()).unwrap(); + unsafe { + ffi::TCOD_sys_clipboard_set(c_str.as_ptr()); + } +} + +pub fn get_clipboard() -> String { + unsafe { + let c_ptr = ffi::TCOD_sys_clipboard_get(); + let c_str = CStr::from_ptr(c_ptr).to_bytes(); + str::from_utf8(c_str).unwrap().to_owned() + } +} diff --git a/tcod/tcod_sys/Cargo.toml b/tcod/tcod_sys/Cargo.toml new file mode 100644 index 00000000..21a44ed7 --- /dev/null +++ b/tcod/tcod_sys/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "tcod-sys" +description = "Raw FFI bindings & build script to link against libtcod." +version = "4.0.0" +license = "WTFPL" +homepage = "https://github.com/tomassedovic/tcod-rs" +repository = "https://github.com/tomassedovic/tcod-rs/tree/master/tcod-sys" +authors = ["tomas@sedovic.cz"] +links = "tcod" +build = "build.rs" +exclude = [ + "libtcod/lib/libz.a" +] + +[lib] +name = "tcod_sys" +path = "lib.rs" + +[dependencies] +libc = "0.2" + +[build-dependencies] +gcc = "0.3" +pkg-config = "0.3" diff --git a/tcod/tcod_sys/build.rs b/tcod/tcod_sys/build.rs new file mode 100644 index 00000000..ce25a340 --- /dev/null +++ b/tcod/tcod_sys/build.rs @@ -0,0 +1,255 @@ +extern crate gcc; +extern crate pkg_config; + +use std::env; +use std::fs; +use std::path::Path; + + +fn build_libtcod_objects(mut config: gcc::Config, sources: &[&str]) { + config.include("libtcod/include"); + config.include("libtcod/src/zlib"); + for c_file in sources { + config.file(c_file); + } + config.cargo_metadata(false); + config.compile("libtcod.a"); +} + + +fn compile_config(config: gcc::Config) { + let mut cmd = config.get_compiler().to_command(); + println!("Compiling: {:?}", cmd); + match cmd.output() { + Ok(output) => { + println!("STDOUT: {}", String::from_utf8_lossy(&output.stdout)); + println!("STDERR: {}", String::from_utf8_lossy(&output.stderr)); + if !output.status.success() { + panic!("Compilation failed."); + } + } + Err(e) => { + panic!("Failed to run the compilation command {}.", e); + } + } +} + + +fn main() { + let is_crater = option_env!("CRATER_TASK_TYPE"); + + if is_crater.is_some() { + return; + } + + let src_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let dst_dir = env::var("OUT_DIR").unwrap(); + let target = env::var("TARGET").unwrap(); + + let src = Path::new(&src_dir); + let dst = Path::new(&dst_dir); + let sdl_lib_dir = src.join("libtcod/dependencies/SDL-1.2.15/lib").join(&target); + let sdl_include_dir = src.join("libtcod/dependencies/SDL-1.2.15/include").join(&target); + + let libz_sources = &[ + "libtcod/src/zlib/adler32.c", + "libtcod/src/zlib/crc32.c", + "libtcod/src/zlib/deflate.c", + "libtcod/src/zlib/infback.c", + "libtcod/src/zlib/inffast.c", + "libtcod/src/zlib/inflate.c", + "libtcod/src/zlib/inftrees.c", + "libtcod/src/zlib/trees.c", + "libtcod/src/zlib/zutil.c", + "libtcod/src/zlib/compress.c", + "libtcod/src/zlib/uncompr.c", + "libtcod/src/zlib/gzclose.c", + "libtcod/src/zlib/gzlib.c", + "libtcod/src/zlib/gzread.c", + "libtcod/src/zlib/gzwrite.c", + ]; + gcc::compile_library("libz.a", libz_sources); + + let libtcod_sources = &[ + "libtcod/src/bresenham_c.c", + "libtcod/src/bsp_c.c", + "libtcod/src/color_c.c", + "libtcod/src/console_c.c", + "libtcod/src/fov_c.c", + "libtcod/src/fov_circular_raycasting.c", + "libtcod/src/fov_diamond_raycasting.c", + "libtcod/src/fov_recursive_shadowcasting.c", + "libtcod/src/fov_permissive2.c", + "libtcod/src/fov_restrictive.c", + "libtcod/src/heightmap_c.c", + "libtcod/src/image_c.c", + "libtcod/src/lex_c.c", + "libtcod/src/list_c.c", + "libtcod/src/mersenne_c.c", + "libtcod/src/noise_c.c", + "libtcod/src/parser_c.c", + "libtcod/src/path_c.c", + "libtcod/src/sys_c.c", + "libtcod/src/sys_opengl_c.c", + "libtcod/src/sys_sdl_c.c", + "libtcod/src/sys_sdl_img_bmp.c", + "libtcod/src/sys_sdl_img_png.c", + "libtcod/src/tree_c.c", + "libtcod/src/txtfield_c.c", + "libtcod/src/wrappers.c", + "libtcod/src/zip_c.c", + "libtcod/src/namegen_c.c", + "libtcod/src/png/lodepng.c", + ]; + + if target.contains("linux") { + // Build the *.o files: + { + let mut config = gcc::Config::new(); + config.flag("-fno-strict-aliasing"); + config.flag("-ansi"); + build_libtcod_objects(config, libtcod_sources); + } + + // Build the DLL + let mut config = gcc::Config::new(); + config.flag("-shared"); + config.flag("-Wl,-soname,libtcod.so"); + config.flag("-o"); + config.flag(dst.join("libtcod.so").to_str().unwrap()); + for c_file in libtcod_sources { + config.flag(dst.join(c_file).with_extension("o").to_str().unwrap()); + } + config.flag(dst.join("libz.a").to_str().unwrap()); + config.flag("-lSDL"); + config.flag("-lGL"); + config.flag("-lX11"); + config.flag("-lm"); + config.flag("-ldl"); + config.flag("-lpthread"); + + compile_config(config); + assert!(dst.join("libtcod.so").is_file()); + + pkg_config::find_library("sdl").unwrap(); + pkg_config::find_library("gl").unwrap(); + pkg_config::find_library("x11").unwrap(); + + } else if target.contains("darwin") { + // Build the *.o files + { + let mut config = gcc::Config::new(); + config.flag("-fno-strict-aliasing"); + config.flag("-ansi"); + build_libtcod_objects(config, libtcod_sources); + } + + // Build the DLL + let mut config = gcc::Config::new(); + config.flag("-shared"); + config.flag("-o"); + config.flag(dst.join("libtcod.dylib").to_str().unwrap()); + for c_file in libtcod_sources { + config.flag(dst.join(c_file).with_extension("o").to_str().unwrap()); + } + config.flag(dst.join("libz.a").to_str().unwrap()); + config.flag(src.join("libtcod/osx/macsupport.m").to_str().unwrap()); + config.flag("-lSDL"); + config.flag("-lSDLmain"); + config.flag("-framework"); + config.flag("OpenGL"); + config.flag("-framework"); + config.flag("Cocoa"); + config.flag("-lm"); + config.flag("-ldl"); + config.flag("-lpthread"); + + compile_config(config); + assert!(dst.join("libtcod.dylib").is_file()); + + pkg_config::find_library("sdl").unwrap(); + println!("cargo:rustc-link-lib=framework=OpenGL"); + println!("cargo:rustc-link-lib=framework=Cocoa"); + + } else if target.contains("windows-gnu") { + assert!(sdl_lib_dir.is_dir()); + assert!(sdl_include_dir.is_dir()); + fs::copy(&sdl_lib_dir.join("SDL.dll"), &dst.join("SDL.dll")).unwrap(); + + // Build the *.o files: + { + let mut config = gcc::Config::new(); + config.include(sdl_include_dir.to_str().unwrap()); + config.flag("-fno-strict-aliasing"); + config.flag("-ansi"); + config.define("LIBTCOD_EXPORTS", None); + build_libtcod_objects(config, libtcod_sources); + } + + // Build the DLL + let mut config = gcc::Config::new(); + config.flag("-o"); + config.flag(dst.join("libtcod.dll").to_str().unwrap()); + config.flag("-shared"); + fs::create_dir(dst.join("lib")).unwrap(); + config.flag(&format!("-Wl,--out-implib,{}", dst.join("lib/libtcod.a").display())); + for c_file in libtcod_sources { + config.flag(dst.join(c_file).with_extension("o").to_str().unwrap()); + } + config.flag(dst.join("libz.a").to_str().unwrap()); + config.flag("-mwindows"); + config.flag("-L"); + config.flag(sdl_lib_dir.to_str().unwrap()); + config.flag("-lSDL.dll"); + config.flag("-lopengl32"); + config.flag("-static-libgcc"); + config.flag("-static-libstdc++"); + + compile_config(config); + assert!(dst.join("libtcod.dll").is_file()); + + println!("cargo:rustc-link-lib=dylib={}", "SDL.dll"); + println!("cargo:rustc-link-lib=dylib={}", "opengl32"); + println!("cargo:rustc-link-search=native={}", sdl_lib_dir.display()); + println!("cargo:rustc-link-search=native={}", dst.display()); + + } else if target.contains("windows-msvc") { + assert!(sdl_lib_dir.is_dir()); + assert!(sdl_include_dir.is_dir()); + fs::copy(&sdl_lib_dir.join("SDL.dll"), &dst.join("SDL.dll")).unwrap(); + fs::copy(&sdl_lib_dir.join("SDL.lib"), &dst.join("SDL.dll.lib")).unwrap(); + + // Build the *.o files + { + let mut config = gcc::Config::new(); + config.include(sdl_include_dir.to_str().unwrap()); + config.define("LIBTCOD_EXPORTS", None); + config.define("NO_OPENGL", None); + build_libtcod_objects(config, libtcod_sources); + } + + // Build the DLL + let mut config = gcc::Config::new(); + for c_file in libtcod_sources { + config.flag(dst.join(c_file).with_extension("o").to_str().unwrap()); + } + config.flag(dst.join("libz.a").to_str().unwrap()); + config.flag("User32.lib"); + config.flag("SDL.dll.lib"); + config.flag("/LD"); + config.flag("/link"); + config.flag(&format!("/LIBPATH:{}", dst.to_str().unwrap())); + config.flag("/DLL"); + config.flag(&format!("/OUT:{}", dst.join("libtcod.dll").display())); + + compile_config(config); + assert!(dst.join("libtcod.dll").is_file()); + + println!("cargo:rustc-link-search={}", dst.display()); + println!("cargo:rustc-link-lib=dylib=SDL.dll"); + println!("cargo:rustc-link-lib=User32"); + } + + println!("cargo:rustc-link-search={}", dst.display()); + println!("cargo:rustc-link-lib=dylib=tcod"); +} diff --git a/tcod/tcod_sys/lib.rs b/tcod/tcod_sys/lib.rs new file mode 100644 index 00000000..29d740cd --- /dev/null +++ b/tcod/tcod_sys/lib.rs @@ -0,0 +1,1897 @@ +#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals, + missing_copy_implementations)] +// This is not added by rust-bindgen even though it's used heavily in the +// generated code: +extern crate libc; + + +/* automatically generated by rust-bindgen */ + +pub type __int128_t = ::libc::c_void; +pub type __uint128_t = ::libc::c_void; +pub type __builtin_va_list = [__va_list_tag; 1usize]; +pub enum Struct__IO_FILE { } +pub type FILE = Struct__IO_FILE; +pub type __FILE = Struct__IO_FILE; +pub type __gnuc_va_list = __builtin_va_list; +pub type size_t = ::libc::c_ulong; +pub type wchar_t = ::libc::c_int; +pub type wint_t = ::libc::c_uint; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed1 { + pub __count: ::libc::c_int, + pub __value: Union_Unnamed2, +} +impl ::std::default::Default for Struct_Unnamed1 { + fn default() -> Struct_Unnamed1 { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Union_Unnamed2 { + pub _bindgen_data_: [u32; 1usize], +} +impl Union_Unnamed2 { + pub unsafe fn __wch(&mut self) -> *mut ::libc::c_uint { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn __wchb(&mut self) -> *mut [::libc::c_char; 4usize] { + ::std::mem::transmute(&self._bindgen_data_) + } +} +impl ::std::default::Default for Union_Unnamed2 { + fn default() -> Union_Unnamed2 { unsafe { ::std::mem::zeroed() } } +} +pub type __mbstate_t = Struct_Unnamed1; +pub type mbstate_t = __mbstate_t; +pub enum Struct_tm { } +pub enum Struct___locale_data { } +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct___locale_struct { + pub __locales: [*mut Struct___locale_data; 13usize], + pub __ctype_b: *const ::libc::c_ushort, + pub __ctype_tolower: *const ::libc::c_int, + pub __ctype_toupper: *const ::libc::c_int, + pub __names: [*const ::libc::c_char; 13usize], +} +impl ::std::default::Default for Struct___locale_struct { + fn default() -> Struct___locale_struct { unsafe { ::std::mem::zeroed() } } +} +pub type __locale_t = *mut Struct___locale_struct; +pub type locale_t = __locale_t; +pub type uint8 = ::libc::c_uchar; +pub type int8 = ::libc::c_char; +pub type uint16 = ::libc::c_ushort; +pub type int16 = ::libc::c_short; +pub type uint32 = ::libc::c_uint; +pub type int32 = ::libc::c_int; +pub type intptr = ::libc::c_long; +pub type uintptr = ::libc::c_ulong; +pub type _bool = uint8; +pub type TCOD_list_t = *mut ::libc::c_void; +#[repr(C)] +#[derive(Copy, Clone, Debug)] +pub struct Struct_Unnamed3 { + pub r: uint8, + pub g: uint8, + pub b: uint8, +} +impl ::std::default::Default for Struct_Unnamed3 { + fn default() -> Struct_Unnamed3 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_color_t = Struct_Unnamed3; +pub type Enum_Unnamed4 = ::libc::c_uint; +pub const TCOD_COLOR_RED: ::libc::c_uint = 0; +pub const TCOD_COLOR_FLAME: ::libc::c_uint = 1; +pub const TCOD_COLOR_ORANGE: ::libc::c_uint = 2; +pub const TCOD_COLOR_AMBER: ::libc::c_uint = 3; +pub const TCOD_COLOR_YELLOW: ::libc::c_uint = 4; +pub const TCOD_COLOR_LIME: ::libc::c_uint = 5; +pub const TCOD_COLOR_CHARTREUSE: ::libc::c_uint = 6; +pub const TCOD_COLOR_GREEN: ::libc::c_uint = 7; +pub const TCOD_COLOR_SEA: ::libc::c_uint = 8; +pub const TCOD_COLOR_TURQUOISE: ::libc::c_uint = 9; +pub const TCOD_COLOR_CYAN: ::libc::c_uint = 10; +pub const TCOD_COLOR_SKY: ::libc::c_uint = 11; +pub const TCOD_COLOR_AZURE: ::libc::c_uint = 12; +pub const TCOD_COLOR_BLUE: ::libc::c_uint = 13; +pub const TCOD_COLOR_HAN: ::libc::c_uint = 14; +pub const TCOD_COLOR_VIOLET: ::libc::c_uint = 15; +pub const TCOD_COLOR_PURPLE: ::libc::c_uint = 16; +pub const TCOD_COLOR_FUCHSIA: ::libc::c_uint = 17; +pub const TCOD_COLOR_MAGENTA: ::libc::c_uint = 18; +pub const TCOD_COLOR_PINK: ::libc::c_uint = 19; +pub const TCOD_COLOR_CRIMSON: ::libc::c_uint = 20; +pub const TCOD_COLOR_NB: ::libc::c_uint = 21; +pub type Enum_Unnamed5 = ::libc::c_uint; +pub const TCOD_COLOR_DESATURATED: ::libc::c_uint = 0; +pub const TCOD_COLOR_LIGHTEST: ::libc::c_uint = 1; +pub const TCOD_COLOR_LIGHTER: ::libc::c_uint = 2; +pub const TCOD_COLOR_LIGHT: ::libc::c_uint = 3; +pub const TCOD_COLOR_NORMAL: ::libc::c_uint = 4; +pub const TCOD_COLOR_DARK: ::libc::c_uint = 5; +pub const TCOD_COLOR_DARKER: ::libc::c_uint = 6; +pub const TCOD_COLOR_DARKEST: ::libc::c_uint = 7; +pub const TCOD_COLOR_LEVELS: ::libc::c_uint = 8; +pub type Enum_Unnamed6 = ::libc::c_uint; +pub const TCODK_NONE: ::libc::c_uint = 0; +pub const TCODK_ESCAPE: ::libc::c_uint = 1; +pub const TCODK_BACKSPACE: ::libc::c_uint = 2; +pub const TCODK_TAB: ::libc::c_uint = 3; +pub const TCODK_ENTER: ::libc::c_uint = 4; +pub const TCODK_SHIFT: ::libc::c_uint = 5; +pub const TCODK_CONTROL: ::libc::c_uint = 6; +pub const TCODK_ALT: ::libc::c_uint = 7; +pub const TCODK_PAUSE: ::libc::c_uint = 8; +pub const TCODK_CAPSLOCK: ::libc::c_uint = 9; +pub const TCODK_PAGEUP: ::libc::c_uint = 10; +pub const TCODK_PAGEDOWN: ::libc::c_uint = 11; +pub const TCODK_END: ::libc::c_uint = 12; +pub const TCODK_HOME: ::libc::c_uint = 13; +pub const TCODK_UP: ::libc::c_uint = 14; +pub const TCODK_LEFT: ::libc::c_uint = 15; +pub const TCODK_RIGHT: ::libc::c_uint = 16; +pub const TCODK_DOWN: ::libc::c_uint = 17; +pub const TCODK_PRINTSCREEN: ::libc::c_uint = 18; +pub const TCODK_INSERT: ::libc::c_uint = 19; +pub const TCODK_DELETE: ::libc::c_uint = 20; +pub const TCODK_LWIN: ::libc::c_uint = 21; +pub const TCODK_RWIN: ::libc::c_uint = 22; +pub const TCODK_APPS: ::libc::c_uint = 23; +pub const TCODK_0: ::libc::c_uint = 24; +pub const TCODK_1: ::libc::c_uint = 25; +pub const TCODK_2: ::libc::c_uint = 26; +pub const TCODK_3: ::libc::c_uint = 27; +pub const TCODK_4: ::libc::c_uint = 28; +pub const TCODK_5: ::libc::c_uint = 29; +pub const TCODK_6: ::libc::c_uint = 30; +pub const TCODK_7: ::libc::c_uint = 31; +pub const TCODK_8: ::libc::c_uint = 32; +pub const TCODK_9: ::libc::c_uint = 33; +pub const TCODK_KP0: ::libc::c_uint = 34; +pub const TCODK_KP1: ::libc::c_uint = 35; +pub const TCODK_KP2: ::libc::c_uint = 36; +pub const TCODK_KP3: ::libc::c_uint = 37; +pub const TCODK_KP4: ::libc::c_uint = 38; +pub const TCODK_KP5: ::libc::c_uint = 39; +pub const TCODK_KP6: ::libc::c_uint = 40; +pub const TCODK_KP7: ::libc::c_uint = 41; +pub const TCODK_KP8: ::libc::c_uint = 42; +pub const TCODK_KP9: ::libc::c_uint = 43; +pub const TCODK_KPADD: ::libc::c_uint = 44; +pub const TCODK_KPSUB: ::libc::c_uint = 45; +pub const TCODK_KPDIV: ::libc::c_uint = 46; +pub const TCODK_KPMUL: ::libc::c_uint = 47; +pub const TCODK_KPDEC: ::libc::c_uint = 48; +pub const TCODK_KPENTER: ::libc::c_uint = 49; +pub const TCODK_F1: ::libc::c_uint = 50; +pub const TCODK_F2: ::libc::c_uint = 51; +pub const TCODK_F3: ::libc::c_uint = 52; +pub const TCODK_F4: ::libc::c_uint = 53; +pub const TCODK_F5: ::libc::c_uint = 54; +pub const TCODK_F6: ::libc::c_uint = 55; +pub const TCODK_F7: ::libc::c_uint = 56; +pub const TCODK_F8: ::libc::c_uint = 57; +pub const TCODK_F9: ::libc::c_uint = 58; +pub const TCODK_F10: ::libc::c_uint = 59; +pub const TCODK_F11: ::libc::c_uint = 60; +pub const TCODK_F12: ::libc::c_uint = 61; +pub const TCODK_NUMLOCK: ::libc::c_uint = 62; +pub const TCODK_SCROLLLOCK: ::libc::c_uint = 63; +pub const TCODK_SPACE: ::libc::c_uint = 64; +pub const TCODK_CHAR: ::libc::c_uint = 65; +pub type TCOD_keycode_t = Enum_Unnamed6; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed7 { + pub vk: TCOD_keycode_t, + pub c: ::libc::c_char, + pub pressed: _bool, + pub lalt: _bool, + pub lctrl: _bool, + pub ralt: _bool, + pub rctrl: _bool, + pub shift: _bool, +} +impl ::std::default::Default for Struct_Unnamed7 { + fn default() -> Struct_Unnamed7 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_key_t = Struct_Unnamed7; +pub type Enum_Unnamed8 = ::libc::c_uint; +pub const TCOD_CHAR_HLINE: ::libc::c_uint = 196; +pub const TCOD_CHAR_VLINE: ::libc::c_uint = 179; +pub const TCOD_CHAR_NE: ::libc::c_uint = 191; +pub const TCOD_CHAR_NW: ::libc::c_uint = 218; +pub const TCOD_CHAR_SE: ::libc::c_uint = 217; +pub const TCOD_CHAR_SW: ::libc::c_uint = 192; +pub const TCOD_CHAR_TEEW: ::libc::c_uint = 180; +pub const TCOD_CHAR_TEEE: ::libc::c_uint = 195; +pub const TCOD_CHAR_TEEN: ::libc::c_uint = 193; +pub const TCOD_CHAR_TEES: ::libc::c_uint = 194; +pub const TCOD_CHAR_CROSS: ::libc::c_uint = 197; +pub const TCOD_CHAR_DHLINE: ::libc::c_uint = 205; +pub const TCOD_CHAR_DVLINE: ::libc::c_uint = 186; +pub const TCOD_CHAR_DNE: ::libc::c_uint = 187; +pub const TCOD_CHAR_DNW: ::libc::c_uint = 201; +pub const TCOD_CHAR_DSE: ::libc::c_uint = 188; +pub const TCOD_CHAR_DSW: ::libc::c_uint = 200; +pub const TCOD_CHAR_DTEEW: ::libc::c_uint = 185; +pub const TCOD_CHAR_DTEEE: ::libc::c_uint = 204; +pub const TCOD_CHAR_DTEEN: ::libc::c_uint = 202; +pub const TCOD_CHAR_DTEES: ::libc::c_uint = 203; +pub const TCOD_CHAR_DCROSS: ::libc::c_uint = 206; +pub const TCOD_CHAR_BLOCK1: ::libc::c_uint = 176; +pub const TCOD_CHAR_BLOCK2: ::libc::c_uint = 177; +pub const TCOD_CHAR_BLOCK3: ::libc::c_uint = 178; +pub const TCOD_CHAR_ARROW_N: ::libc::c_uint = 24; +pub const TCOD_CHAR_ARROW_S: ::libc::c_uint = 25; +pub const TCOD_CHAR_ARROW_E: ::libc::c_uint = 26; +pub const TCOD_CHAR_ARROW_W: ::libc::c_uint = 27; +pub const TCOD_CHAR_ARROW2_N: ::libc::c_uint = 30; +pub const TCOD_CHAR_ARROW2_S: ::libc::c_uint = 31; +pub const TCOD_CHAR_ARROW2_E: ::libc::c_uint = 16; +pub const TCOD_CHAR_ARROW2_W: ::libc::c_uint = 17; +pub const TCOD_CHAR_DARROW_H: ::libc::c_uint = 29; +pub const TCOD_CHAR_DARROW_V: ::libc::c_uint = 18; +pub const TCOD_CHAR_CHECKBOX_UNSET: ::libc::c_uint = 224; +pub const TCOD_CHAR_CHECKBOX_SET: ::libc::c_uint = 225; +pub const TCOD_CHAR_RADIO_UNSET: ::libc::c_uint = 9; +pub const TCOD_CHAR_RADIO_SET: ::libc::c_uint = 10; +pub const TCOD_CHAR_SUBP_NW: ::libc::c_uint = 226; +pub const TCOD_CHAR_SUBP_NE: ::libc::c_uint = 227; +pub const TCOD_CHAR_SUBP_N: ::libc::c_uint = 228; +pub const TCOD_CHAR_SUBP_SE: ::libc::c_uint = 229; +pub const TCOD_CHAR_SUBP_DIAG: ::libc::c_uint = 230; +pub const TCOD_CHAR_SUBP_E: ::libc::c_uint = 231; +pub const TCOD_CHAR_SUBP_SW: ::libc::c_uint = 232; +pub const TCOD_CHAR_SMILIE: ::libc::c_uint = 1; +pub const TCOD_CHAR_SMILIE_INV: ::libc::c_uint = 2; +pub const TCOD_CHAR_HEART: ::libc::c_uint = 3; +pub const TCOD_CHAR_DIAMOND: ::libc::c_uint = 4; +pub const TCOD_CHAR_CLUB: ::libc::c_uint = 5; +pub const TCOD_CHAR_SPADE: ::libc::c_uint = 6; +pub const TCOD_CHAR_BULLET: ::libc::c_uint = 7; +pub const TCOD_CHAR_BULLET_INV: ::libc::c_uint = 8; +pub const TCOD_CHAR_MALE: ::libc::c_uint = 11; +pub const TCOD_CHAR_FEMALE: ::libc::c_uint = 12; +pub const TCOD_CHAR_NOTE: ::libc::c_uint = 13; +pub const TCOD_CHAR_NOTE_DOUBLE: ::libc::c_uint = 14; +pub const TCOD_CHAR_LIGHT: ::libc::c_uint = 15; +pub const TCOD_CHAR_EXCLAM_DOUBLE: ::libc::c_uint = 19; +pub const TCOD_CHAR_PILCROW: ::libc::c_uint = 20; +pub const TCOD_CHAR_SECTION: ::libc::c_uint = 21; +pub const TCOD_CHAR_POUND: ::libc::c_uint = 156; +pub const TCOD_CHAR_MULTIPLICATION: ::libc::c_uint = 158; +pub const TCOD_CHAR_FUNCTION: ::libc::c_uint = 159; +pub const TCOD_CHAR_RESERVED: ::libc::c_uint = 169; +pub const TCOD_CHAR_HALF: ::libc::c_uint = 171; +pub const TCOD_CHAR_ONE_QUARTER: ::libc::c_uint = 172; +pub const TCOD_CHAR_COPYRIGHT: ::libc::c_uint = 184; +pub const TCOD_CHAR_CENT: ::libc::c_uint = 189; +pub const TCOD_CHAR_YEN: ::libc::c_uint = 190; +pub const TCOD_CHAR_CURRENCY: ::libc::c_uint = 207; +pub const TCOD_CHAR_THREE_QUARTERS: ::libc::c_uint = 243; +pub const TCOD_CHAR_DIVISION: ::libc::c_uint = 246; +pub const TCOD_CHAR_GRADE: ::libc::c_uint = 248; +pub const TCOD_CHAR_UMLAUT: ::libc::c_uint = 249; +pub const TCOD_CHAR_POW1: ::libc::c_uint = 251; +pub const TCOD_CHAR_POW3: ::libc::c_uint = 252; +pub const TCOD_CHAR_POW2: ::libc::c_uint = 253; +pub const TCOD_CHAR_BULLET_SQUARE: ::libc::c_uint = 254; +pub type TCOD_chars_t = Enum_Unnamed8; +pub type Enum_Unnamed9 = ::libc::c_uint; +pub const TCOD_COLCTRL_1: ::libc::c_uint = 1; +pub const TCOD_COLCTRL_2: ::libc::c_uint = 2; +pub const TCOD_COLCTRL_3: ::libc::c_uint = 3; +pub const TCOD_COLCTRL_4: ::libc::c_uint = 4; +pub const TCOD_COLCTRL_5: ::libc::c_uint = 5; +pub const TCOD_COLCTRL_NUMBER: ::libc::c_uint = 5; +pub const TCOD_COLCTRL_FORE_RGB: ::libc::c_uint = 6; +pub const TCOD_COLCTRL_BACK_RGB: ::libc::c_uint = 7; +pub const TCOD_COLCTRL_STOP: ::libc::c_uint = 8; +pub type TCOD_colctrl_t = Enum_Unnamed9; +pub type Enum_Unnamed10 = ::libc::c_uint; +pub const TCOD_BKGND_NONE: ::libc::c_uint = 0; +pub const TCOD_BKGND_SET: ::libc::c_uint = 1; +pub const TCOD_BKGND_MULTIPLY: ::libc::c_uint = 2; +pub const TCOD_BKGND_LIGHTEN: ::libc::c_uint = 3; +pub const TCOD_BKGND_DARKEN: ::libc::c_uint = 4; +pub const TCOD_BKGND_SCREEN: ::libc::c_uint = 5; +pub const TCOD_BKGND_COLOR_DODGE: ::libc::c_uint = 6; +pub const TCOD_BKGND_COLOR_BURN: ::libc::c_uint = 7; +pub const TCOD_BKGND_ADD: ::libc::c_uint = 8; +pub const TCOD_BKGND_ADDA: ::libc::c_uint = 9; +pub const TCOD_BKGND_BURN: ::libc::c_uint = 10; +pub const TCOD_BKGND_OVERLAY: ::libc::c_uint = 11; +pub const TCOD_BKGND_ALPH: ::libc::c_uint = 12; +pub const TCOD_BKGND_DEFAULT: ::libc::c_uint = 13; +pub type TCOD_bkgnd_flag_t = Enum_Unnamed10; +pub type Enum_Unnamed11 = ::libc::c_uint; +pub const TCOD_KEY_PRESSED: ::libc::c_uint = 1; +pub const TCOD_KEY_RELEASED: ::libc::c_uint = 2; +pub type TCOD_key_status_t = Enum_Unnamed11; +pub type Enum_Unnamed12 = ::libc::c_uint; +pub const TCOD_FONT_LAYOUT_ASCII_INCOL: ::libc::c_uint = 1; +pub const TCOD_FONT_LAYOUT_ASCII_INROW: ::libc::c_uint = 2; +pub const TCOD_FONT_TYPE_GREYSCALE: ::libc::c_uint = 4; +pub const TCOD_FONT_TYPE_GRAYSCALE: ::libc::c_uint = 4; +pub const TCOD_FONT_LAYOUT_TCOD: ::libc::c_uint = 8; +pub type TCOD_font_flags_t = Enum_Unnamed12; +pub type Enum_Unnamed13 = ::libc::c_uint; +pub const TCOD_RENDERER_GLSL: ::libc::c_uint = 0; +pub const TCOD_RENDERER_OPENGL: ::libc::c_uint = 1; +pub const TCOD_RENDERER_SDL: ::libc::c_uint = 2; +pub const TCOD_NB_RENDERERS: ::libc::c_uint = 3; +pub type TCOD_renderer_t = Enum_Unnamed13; +pub type Enum_Unnamed14 = ::libc::c_uint; +pub const TCOD_LEFT: ::libc::c_uint = 0; +pub const TCOD_RIGHT: ::libc::c_uint = 1; +pub const TCOD_CENTER: ::libc::c_uint = 2; +pub type TCOD_alignment_t = Enum_Unnamed14; +pub type TCOD_console_t = *mut ::libc::c_void; +pub type TCOD_image_t = *mut ::libc::c_void; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed15 { + pub x: ::libc::c_int, + pub y: ::libc::c_int, + pub dx: ::libc::c_int, + pub dy: ::libc::c_int, + pub cx: ::libc::c_int, + pub cy: ::libc::c_int, + pub dcx: ::libc::c_int, + pub dcy: ::libc::c_int, + pub lbutton: _bool, + pub rbutton: _bool, + pub mbutton: _bool, + pub lbutton_pressed: _bool, + pub rbutton_pressed: _bool, + pub mbutton_pressed: _bool, + pub wheel_up: _bool, + pub wheel_down: _bool, +} +impl ::std::default::Default for Struct_Unnamed15 { + fn default() -> Struct_Unnamed15 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_mouse_t = Struct_Unnamed15; +pub type Enum_Unnamed16 = ::libc::c_uint; +pub const TCOD_EVENT_NONE: ::libc::c_uint = 0; +pub const TCOD_EVENT_KEY_PRESS: ::libc::c_uint = 1; +pub const TCOD_EVENT_KEY_RELEASE: ::libc::c_uint = 2; +pub const TCOD_EVENT_KEY: ::libc::c_uint = 3; +pub const TCOD_EVENT_MOUSE_MOVE: ::libc::c_uint = 4; +pub const TCOD_EVENT_MOUSE_PRESS: ::libc::c_uint = 8; +pub const TCOD_EVENT_MOUSE_RELEASE: ::libc::c_uint = 16; +pub const TCOD_EVENT_MOUSE: ::libc::c_uint = 28; +pub const TCOD_EVENT_FINGER_MOVE: ::libc::c_uint = 32; +pub const TCOD_EVENT_FINGER_PRESS: ::libc::c_uint = 64; +pub const TCOD_EVENT_FINGER_RELEASE: ::libc::c_uint = 128; +pub const TCOD_EVENT_FINGER: ::libc::c_uint = 224; +pub const TCOD_EVENT_ANY: ::libc::c_uint = 255; +pub type TCOD_event_t = Enum_Unnamed16; +pub type TCOD_thread_t = *mut ::libc::c_void; +pub type TCOD_semaphore_t = *mut ::libc::c_void; +pub type TCOD_mutex_t = *mut ::libc::c_void; +pub type TCOD_cond_t = *mut ::libc::c_void; +pub type TCOD_library_t = *mut ::libc::c_void; +pub type SDL_renderer_t = + ::std::option::Option; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed17 { + pub nb_rolls: ::libc::c_int, + pub nb_faces: ::libc::c_int, + pub multiplier: ::libc::c_float, + pub addsub: ::libc::c_float, +} +impl ::std::default::Default for Struct_Unnamed17 { + fn default() -> Struct_Unnamed17 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_dice_t = Struct_Unnamed17; +pub type Enum_Unnamed18 = ::libc::c_uint; +pub const TCOD_RNG_MT: ::libc::c_uint = 0; +pub const TCOD_RNG_CMWC: ::libc::c_uint = 1; +pub type TCOD_random_algo_t = Enum_Unnamed18; +pub type Enum_Unnamed19 = ::libc::c_uint; +pub const TCOD_DISTRIBUTION_LINEAR: ::libc::c_uint = 0; +pub const TCOD_DISTRIBUTION_GAUSSIAN: ::libc::c_uint = 1; +pub const TCOD_DISTRIBUTION_GAUSSIAN_RANGE: ::libc::c_uint = 2; +pub const TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: ::libc::c_uint = 3; +pub const TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: ::libc::c_uint = 4; +pub type TCOD_distribution_t = Enum_Unnamed19; +pub type TCOD_random_t = *mut ::libc::c_void; +pub type TCOD_line_listener_t = + ::std::option::Option _bool>; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed20 { + pub stepx: ::libc::c_int, + pub stepy: ::libc::c_int, + pub e: ::libc::c_int, + pub deltax: ::libc::c_int, + pub deltay: ::libc::c_int, + pub origx: ::libc::c_int, + pub origy: ::libc::c_int, + pub destx: ::libc::c_int, + pub desty: ::libc::c_int, +} +impl ::std::default::Default for Struct_Unnamed20 { + fn default() -> Struct_Unnamed20 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_bresenham_data_t = Struct_Unnamed20; +pub type TCOD_noise_t = *mut ::libc::c_void; +pub type Enum_Unnamed21 = ::libc::c_uint; +pub const TCOD_NOISE_PERLIN: ::libc::c_uint = 1; +pub const TCOD_NOISE_SIMPLEX: ::libc::c_uint = 2; +pub const TCOD_NOISE_WAVELET: ::libc::c_uint = 4; +pub const TCOD_NOISE_DEFAULT: ::libc::c_uint = 0; +pub type TCOD_noise_type_t = Enum_Unnamed21; +pub type TCOD_map_t = *mut ::libc::c_void; +pub type Enum_Unnamed22 = ::libc::c_uint; +pub const FOV_BASIC: ::libc::c_uint = 0; +pub const FOV_DIAMOND: ::libc::c_uint = 1; +pub const FOV_SHADOW: ::libc::c_uint = 2; +pub const FOV_PERMISSIVE_0: ::libc::c_uint = 3; +pub const FOV_PERMISSIVE_1: ::libc::c_uint = 4; +pub const FOV_PERMISSIVE_2: ::libc::c_uint = 5; +pub const FOV_PERMISSIVE_3: ::libc::c_uint = 6; +pub const FOV_PERMISSIVE_4: ::libc::c_uint = 7; +pub const FOV_PERMISSIVE_5: ::libc::c_uint = 8; +pub const FOV_PERMISSIVE_6: ::libc::c_uint = 9; +pub const FOV_PERMISSIVE_7: ::libc::c_uint = 10; +pub const FOV_PERMISSIVE_8: ::libc::c_uint = 11; +pub const FOV_RESTRICTIVE: ::libc::c_uint = 12; +pub const NB_FOV_ALGORITHMS: ::libc::c_uint = 13; +pub type TCOD_fov_algorithm_t = Enum_Unnamed22; +pub type TCOD_path_func_t = + ::std::option::Option ::libc::c_float>; +pub type TCOD_path_t = *mut ::libc::c_void; +pub type TCOD_dijkstra_t = *mut ::libc::c_void; +#[repr(C)] +#[derive(Copy)] +pub struct Struct_Unnamed23 { + pub file_line: ::libc::c_int, + pub token_type: ::libc::c_int, + pub token_int_val: ::libc::c_int, + pub token_idx: ::libc::c_int, + pub token_float_val: ::libc::c_float, + pub tok: *mut ::libc::c_char, + pub toklen: ::libc::c_int, + pub lastStringDelim: ::libc::c_char, + pub pos: *mut ::libc::c_char, + pub buf: *mut ::libc::c_char, + pub filename: *mut ::libc::c_char, + pub last_javadoc_comment: *mut ::libc::c_char, + pub nb_symbols: ::libc::c_int, + pub nb_keywords: ::libc::c_int, + pub flags: ::libc::c_int, + pub symbols: [[::libc::c_char; 5usize]; 100usize], + pub keywords: [[::libc::c_char; 20usize]; 100usize], + pub simpleCmt: *const ::libc::c_char, + pub cmtStart: *const ::libc::c_char, + pub cmtStop: *const ::libc::c_char, + pub javadocCmtStart: *const ::libc::c_char, + pub stringDelim: *const ::libc::c_char, + pub javadoc_read: _bool, + pub allocBuf: _bool, + pub savept: _bool, +} +impl ::std::clone::Clone for Struct_Unnamed23 { + fn clone(&self) -> Struct_Unnamed23 { + *self + } +} +impl ::std::default::Default for Struct_Unnamed23 { + fn default() -> Struct_Unnamed23 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_lex_t = Struct_Unnamed23; +pub type Enum_Unnamed24 = ::libc::c_uint; +pub const TCOD_TYPE_NONE: ::libc::c_uint = 0; +pub const TCOD_TYPE_BOOL: ::libc::c_uint = 1; +pub const TCOD_TYPE_CHAR: ::libc::c_uint = 2; +pub const TCOD_TYPE_INT: ::libc::c_uint = 3; +pub const TCOD_TYPE_FLOAT: ::libc::c_uint = 4; +pub const TCOD_TYPE_STRING: ::libc::c_uint = 5; +pub const TCOD_TYPE_COLOR: ::libc::c_uint = 6; +pub const TCOD_TYPE_DICE: ::libc::c_uint = 7; +pub const TCOD_TYPE_VALUELIST00: ::libc::c_uint = 8; +pub const TCOD_TYPE_VALUELIST01: ::libc::c_uint = 9; +pub const TCOD_TYPE_VALUELIST02: ::libc::c_uint = 10; +pub const TCOD_TYPE_VALUELIST03: ::libc::c_uint = 11; +pub const TCOD_TYPE_VALUELIST04: ::libc::c_uint = 12; +pub const TCOD_TYPE_VALUELIST05: ::libc::c_uint = 13; +pub const TCOD_TYPE_VALUELIST06: ::libc::c_uint = 14; +pub const TCOD_TYPE_VALUELIST07: ::libc::c_uint = 15; +pub const TCOD_TYPE_VALUELIST08: ::libc::c_uint = 16; +pub const TCOD_TYPE_VALUELIST09: ::libc::c_uint = 17; +pub const TCOD_TYPE_VALUELIST10: ::libc::c_uint = 18; +pub const TCOD_TYPE_VALUELIST11: ::libc::c_uint = 19; +pub const TCOD_TYPE_VALUELIST12: ::libc::c_uint = 20; +pub const TCOD_TYPE_VALUELIST13: ::libc::c_uint = 21; +pub const TCOD_TYPE_VALUELIST14: ::libc::c_uint = 22; +pub const TCOD_TYPE_VALUELIST15: ::libc::c_uint = 23; +pub const TCOD_TYPE_CUSTOM00: ::libc::c_uint = 24; +pub const TCOD_TYPE_CUSTOM01: ::libc::c_uint = 25; +pub const TCOD_TYPE_CUSTOM02: ::libc::c_uint = 26; +pub const TCOD_TYPE_CUSTOM03: ::libc::c_uint = 27; +pub const TCOD_TYPE_CUSTOM04: ::libc::c_uint = 28; +pub const TCOD_TYPE_CUSTOM05: ::libc::c_uint = 29; +pub const TCOD_TYPE_CUSTOM06: ::libc::c_uint = 30; +pub const TCOD_TYPE_CUSTOM07: ::libc::c_uint = 31; +pub const TCOD_TYPE_CUSTOM08: ::libc::c_uint = 32; +pub const TCOD_TYPE_CUSTOM09: ::libc::c_uint = 33; +pub const TCOD_TYPE_CUSTOM10: ::libc::c_uint = 34; +pub const TCOD_TYPE_CUSTOM11: ::libc::c_uint = 35; +pub const TCOD_TYPE_CUSTOM12: ::libc::c_uint = 36; +pub const TCOD_TYPE_CUSTOM13: ::libc::c_uint = 37; +pub const TCOD_TYPE_CUSTOM14: ::libc::c_uint = 38; +pub const TCOD_TYPE_CUSTOM15: ::libc::c_uint = 39; +pub const TCOD_TYPE_LIST: ::libc::c_uint = 1024; +pub type TCOD_value_type_t = Enum_Unnamed24; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Union_Unnamed25 { + pub _bindgen_data_: [u64; 2usize], +} +impl Union_Unnamed25 { + pub unsafe fn b(&mut self) -> *mut _bool { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn c(&mut self) -> *mut ::libc::c_char { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn i(&mut self) -> *mut int32 { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn f(&mut self) -> *mut ::libc::c_float { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn s(&mut self) -> *mut *mut ::libc::c_char { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn col(&mut self) -> *mut TCOD_color_t { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn dice(&mut self) -> *mut TCOD_dice_t { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn list(&mut self) -> *mut TCOD_list_t { + ::std::mem::transmute(&self._bindgen_data_) + } + pub unsafe fn custom(&mut self) -> *mut *mut ::libc::c_void { + ::std::mem::transmute(&self._bindgen_data_) + } +} +impl ::std::default::Default for Union_Unnamed25 { + fn default() -> Union_Unnamed25 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_value_t = Union_Unnamed25; +pub type TCOD_parser_struct_t = *mut ::libc::c_void; +#[repr(C)] +#[derive(Copy)] +pub struct Struct_Unnamed26 { + pub new_struct: ::std::option::Option _bool>, + pub new_flag: ::std::option::Option _bool>, + pub new_property: ::std::option::Option _bool>, + pub end_struct: ::std::option::Option _bool>, + pub error: ::std::option::Option, +} +impl Clone for Struct_Unnamed26 { + fn clone(&self) -> Struct_Unnamed26 { + *self + } +} +impl ::std::default::Default for Struct_Unnamed26 { + fn default() -> Struct_Unnamed26 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_parser_listener_t = Struct_Unnamed26; +pub type TCOD_parser_custom_t = + ::std::option::Option TCOD_value_t>; +pub type TCOD_parser_t = *mut ::libc::c_void; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed27 { + pub name: *mut ::libc::c_char, + pub flags: TCOD_list_t, + pub props: TCOD_list_t, + pub lists: TCOD_list_t, + pub structs: TCOD_list_t, +} +impl ::std::default::Default for Struct_Unnamed27 { + fn default() -> Struct_Unnamed27 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_struct_int_t = Struct_Unnamed27; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed28 { + pub structs: TCOD_list_t, + pub customs: [TCOD_parser_custom_t; 16usize], + pub fatal: _bool, + pub props: TCOD_list_t, +} +impl ::std::default::Default for Struct_Unnamed28 { + fn default() -> Struct_Unnamed28 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_parser_int_t = Struct_Unnamed28; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct__TCOD_tree_t { + pub next: *mut Struct__TCOD_tree_t, + pub father: *mut Struct__TCOD_tree_t, + pub sons: *mut Struct__TCOD_tree_t, +} +impl ::std::default::Default for Struct__TCOD_tree_t { + fn default() -> Struct__TCOD_tree_t { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_tree_t = Struct__TCOD_tree_t; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed29 { + tree: TCOD_tree_t, + pub x: ::libc::c_int, + pub y: ::libc::c_int, + pub w: ::libc::c_int, + pub h: ::libc::c_int, + pub position: ::libc::c_int, + pub level: uint8, + pub horizontal: _bool, +} +impl ::std::default::Default for Struct_Unnamed29 { + fn default() -> Struct_Unnamed29 { unsafe { ::std::mem::zeroed() } } +} +impl Struct_Unnamed29 { + pub unsafe fn tree(&mut self) -> &mut TCOD_tree_t { + &mut self.tree + } +} +pub type TCOD_bsp_t = Struct_Unnamed29; +pub type TCOD_bsp_callback_t = + ::std::option::Option _bool>; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct_Unnamed30 { + pub w: ::libc::c_int, + pub h: ::libc::c_int, + pub values: *mut ::libc::c_float, +} +impl ::std::default::Default for Struct_Unnamed30 { + fn default() -> Struct_Unnamed30 { unsafe { ::std::mem::zeroed() } } +} +pub type TCOD_heightmap_t = Struct_Unnamed30; +pub type TCOD_zip_t = *mut ::libc::c_void; +pub type TCOD_namegen_t = *mut ::libc::c_void; +pub type TCOD_text_t = *mut ::libc::c_void; +pub type __va_list_tag = Struct___va_list_tag; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Struct___va_list_tag { + pub gp_offset: ::libc::c_uint, + pub fp_offset: ::libc::c_uint, + pub overflow_arg_area: *mut ::libc::c_void, + pub reg_save_area: *mut ::libc::c_void, +} +impl ::std::default::Default for Struct___va_list_tag { + fn default() -> Struct___va_list_tag { unsafe { ::std::mem::zeroed() } } +} +#[link(name = "tcod")] +extern "C" { + pub static mut TCOD_colors: [[TCOD_color_t; 8usize]; 21usize]; + pub static TCOD_black: TCOD_color_t; + pub static TCOD_darkest_grey: TCOD_color_t; + pub static TCOD_darker_grey: TCOD_color_t; + pub static TCOD_dark_grey: TCOD_color_t; + pub static TCOD_grey: TCOD_color_t; + pub static TCOD_light_grey: TCOD_color_t; + pub static TCOD_lighter_grey: TCOD_color_t; + pub static TCOD_lightest_grey: TCOD_color_t; + pub static TCOD_darkest_gray: TCOD_color_t; + pub static TCOD_darker_gray: TCOD_color_t; + pub static TCOD_dark_gray: TCOD_color_t; + pub static TCOD_gray: TCOD_color_t; + pub static TCOD_light_gray: TCOD_color_t; + pub static TCOD_lighter_gray: TCOD_color_t; + pub static TCOD_lightest_gray: TCOD_color_t; + pub static TCOD_white: TCOD_color_t; + pub static TCOD_darkest_sepia: TCOD_color_t; + pub static TCOD_darker_sepia: TCOD_color_t; + pub static TCOD_dark_sepia: TCOD_color_t; + pub static TCOD_sepia: TCOD_color_t; + pub static TCOD_light_sepia: TCOD_color_t; + pub static TCOD_lighter_sepia: TCOD_color_t; + pub static TCOD_lightest_sepia: TCOD_color_t; + pub static TCOD_red: TCOD_color_t; + pub static TCOD_flame: TCOD_color_t; + pub static TCOD_orange: TCOD_color_t; + pub static TCOD_amber: TCOD_color_t; + pub static TCOD_yellow: TCOD_color_t; + pub static TCOD_lime: TCOD_color_t; + pub static TCOD_chartreuse: TCOD_color_t; + pub static TCOD_green: TCOD_color_t; + pub static TCOD_sea: TCOD_color_t; + pub static TCOD_turquoise: TCOD_color_t; + pub static TCOD_cyan: TCOD_color_t; + pub static TCOD_sky: TCOD_color_t; + pub static TCOD_azure: TCOD_color_t; + pub static TCOD_blue: TCOD_color_t; + pub static TCOD_han: TCOD_color_t; + pub static TCOD_violet: TCOD_color_t; + pub static TCOD_purple: TCOD_color_t; + pub static TCOD_fuchsia: TCOD_color_t; + pub static TCOD_magenta: TCOD_color_t; + pub static TCOD_pink: TCOD_color_t; + pub static TCOD_crimson: TCOD_color_t; + pub static TCOD_dark_red: TCOD_color_t; + pub static TCOD_dark_flame: TCOD_color_t; + pub static TCOD_dark_orange: TCOD_color_t; + pub static TCOD_dark_amber: TCOD_color_t; + pub static TCOD_dark_yellow: TCOD_color_t; + pub static TCOD_dark_lime: TCOD_color_t; + pub static TCOD_dark_chartreuse: TCOD_color_t; + pub static TCOD_dark_green: TCOD_color_t; + pub static TCOD_dark_sea: TCOD_color_t; + pub static TCOD_dark_turquoise: TCOD_color_t; + pub static TCOD_dark_cyan: TCOD_color_t; + pub static TCOD_dark_sky: TCOD_color_t; + pub static TCOD_dark_azure: TCOD_color_t; + pub static TCOD_dark_blue: TCOD_color_t; + pub static TCOD_dark_han: TCOD_color_t; + pub static TCOD_dark_violet: TCOD_color_t; + pub static TCOD_dark_purple: TCOD_color_t; + pub static TCOD_dark_fuchsia: TCOD_color_t; + pub static TCOD_dark_magenta: TCOD_color_t; + pub static TCOD_dark_pink: TCOD_color_t; + pub static TCOD_dark_crimson: TCOD_color_t; + pub static TCOD_darker_red: TCOD_color_t; + pub static TCOD_darker_flame: TCOD_color_t; + pub static TCOD_darker_orange: TCOD_color_t; + pub static TCOD_darker_amber: TCOD_color_t; + pub static TCOD_darker_yellow: TCOD_color_t; + pub static TCOD_darker_lime: TCOD_color_t; + pub static TCOD_darker_chartreuse: TCOD_color_t; + pub static TCOD_darker_green: TCOD_color_t; + pub static TCOD_darker_sea: TCOD_color_t; + pub static TCOD_darker_turquoise: TCOD_color_t; + pub static TCOD_darker_cyan: TCOD_color_t; + pub static TCOD_darker_sky: TCOD_color_t; + pub static TCOD_darker_azure: TCOD_color_t; + pub static TCOD_darker_blue: TCOD_color_t; + pub static TCOD_darker_han: TCOD_color_t; + pub static TCOD_darker_violet: TCOD_color_t; + pub static TCOD_darker_purple: TCOD_color_t; + pub static TCOD_darker_fuchsia: TCOD_color_t; + pub static TCOD_darker_magenta: TCOD_color_t; + pub static TCOD_darker_pink: TCOD_color_t; + pub static TCOD_darker_crimson: TCOD_color_t; + pub static TCOD_darkest_red: TCOD_color_t; + pub static TCOD_darkest_flame: TCOD_color_t; + pub static TCOD_darkest_orange: TCOD_color_t; + pub static TCOD_darkest_amber: TCOD_color_t; + pub static TCOD_darkest_yellow: TCOD_color_t; + pub static TCOD_darkest_lime: TCOD_color_t; + pub static TCOD_darkest_chartreuse: TCOD_color_t; + pub static TCOD_darkest_green: TCOD_color_t; + pub static TCOD_darkest_sea: TCOD_color_t; + pub static TCOD_darkest_turquoise: TCOD_color_t; + pub static TCOD_darkest_cyan: TCOD_color_t; + pub static TCOD_darkest_sky: TCOD_color_t; + pub static TCOD_darkest_azure: TCOD_color_t; + pub static TCOD_darkest_blue: TCOD_color_t; + pub static TCOD_darkest_han: TCOD_color_t; + pub static TCOD_darkest_violet: TCOD_color_t; + pub static TCOD_darkest_purple: TCOD_color_t; + pub static TCOD_darkest_fuchsia: TCOD_color_t; + pub static TCOD_darkest_magenta: TCOD_color_t; + pub static TCOD_darkest_pink: TCOD_color_t; + pub static TCOD_darkest_crimson: TCOD_color_t; + pub static TCOD_light_red: TCOD_color_t; + pub static TCOD_light_flame: TCOD_color_t; + pub static TCOD_light_orange: TCOD_color_t; + pub static TCOD_light_amber: TCOD_color_t; + pub static TCOD_light_yellow: TCOD_color_t; + pub static TCOD_light_lime: TCOD_color_t; + pub static TCOD_light_chartreuse: TCOD_color_t; + pub static TCOD_light_green: TCOD_color_t; + pub static TCOD_light_sea: TCOD_color_t; + pub static TCOD_light_turquoise: TCOD_color_t; + pub static TCOD_light_cyan: TCOD_color_t; + pub static TCOD_light_sky: TCOD_color_t; + pub static TCOD_light_azure: TCOD_color_t; + pub static TCOD_light_blue: TCOD_color_t; + pub static TCOD_light_han: TCOD_color_t; + pub static TCOD_light_violet: TCOD_color_t; + pub static TCOD_light_purple: TCOD_color_t; + pub static TCOD_light_fuchsia: TCOD_color_t; + pub static TCOD_light_magenta: TCOD_color_t; + pub static TCOD_light_pink: TCOD_color_t; + pub static TCOD_light_crimson: TCOD_color_t; + pub static TCOD_lighter_red: TCOD_color_t; + pub static TCOD_lighter_flame: TCOD_color_t; + pub static TCOD_lighter_orange: TCOD_color_t; + pub static TCOD_lighter_amber: TCOD_color_t; + pub static TCOD_lighter_yellow: TCOD_color_t; + pub static TCOD_lighter_lime: TCOD_color_t; + pub static TCOD_lighter_chartreuse: TCOD_color_t; + pub static TCOD_lighter_green: TCOD_color_t; + pub static TCOD_lighter_sea: TCOD_color_t; + pub static TCOD_lighter_turquoise: TCOD_color_t; + pub static TCOD_lighter_cyan: TCOD_color_t; + pub static TCOD_lighter_sky: TCOD_color_t; + pub static TCOD_lighter_azure: TCOD_color_t; + pub static TCOD_lighter_blue: TCOD_color_t; + pub static TCOD_lighter_han: TCOD_color_t; + pub static TCOD_lighter_violet: TCOD_color_t; + pub static TCOD_lighter_purple: TCOD_color_t; + pub static TCOD_lighter_fuchsia: TCOD_color_t; + pub static TCOD_lighter_magenta: TCOD_color_t; + pub static TCOD_lighter_pink: TCOD_color_t; + pub static TCOD_lighter_crimson: TCOD_color_t; + pub static TCOD_lightest_red: TCOD_color_t; + pub static TCOD_lightest_flame: TCOD_color_t; + pub static TCOD_lightest_orange: TCOD_color_t; + pub static TCOD_lightest_amber: TCOD_color_t; + pub static TCOD_lightest_yellow: TCOD_color_t; + pub static TCOD_lightest_lime: TCOD_color_t; + pub static TCOD_lightest_chartreuse: TCOD_color_t; + pub static TCOD_lightest_green: TCOD_color_t; + pub static TCOD_lightest_sea: TCOD_color_t; + pub static TCOD_lightest_turquoise: TCOD_color_t; + pub static TCOD_lightest_cyan: TCOD_color_t; + pub static TCOD_lightest_sky: TCOD_color_t; + pub static TCOD_lightest_azure: TCOD_color_t; + pub static TCOD_lightest_blue: TCOD_color_t; + pub static TCOD_lightest_han: TCOD_color_t; + pub static TCOD_lightest_violet: TCOD_color_t; + pub static TCOD_lightest_purple: TCOD_color_t; + pub static TCOD_lightest_fuchsia: TCOD_color_t; + pub static TCOD_lightest_magenta: TCOD_color_t; + pub static TCOD_lightest_pink: TCOD_color_t; + pub static TCOD_lightest_crimson: TCOD_color_t; + pub static TCOD_desaturated_red: TCOD_color_t; + pub static TCOD_desaturated_flame: TCOD_color_t; + pub static TCOD_desaturated_orange: TCOD_color_t; + pub static TCOD_desaturated_amber: TCOD_color_t; + pub static TCOD_desaturated_yellow: TCOD_color_t; + pub static TCOD_desaturated_lime: TCOD_color_t; + pub static TCOD_desaturated_chartreuse: TCOD_color_t; + pub static TCOD_desaturated_green: TCOD_color_t; + pub static TCOD_desaturated_sea: TCOD_color_t; + pub static TCOD_desaturated_turquoise: TCOD_color_t; + pub static TCOD_desaturated_cyan: TCOD_color_t; + pub static TCOD_desaturated_sky: TCOD_color_t; + pub static TCOD_desaturated_azure: TCOD_color_t; + pub static TCOD_desaturated_blue: TCOD_color_t; + pub static TCOD_desaturated_han: TCOD_color_t; + pub static TCOD_desaturated_violet: TCOD_color_t; + pub static TCOD_desaturated_purple: TCOD_color_t; + pub static TCOD_desaturated_fuchsia: TCOD_color_t; + pub static TCOD_desaturated_magenta: TCOD_color_t; + pub static TCOD_desaturated_pink: TCOD_color_t; + pub static TCOD_desaturated_crimson: TCOD_color_t; + pub static TCOD_brass: TCOD_color_t; + pub static TCOD_copper: TCOD_color_t; + pub static TCOD_gold: TCOD_color_t; + pub static TCOD_silver: TCOD_color_t; + pub static TCOD_celadon: TCOD_color_t; + pub static TCOD_peach: TCOD_color_t; +} +#[link(name = "tcod")] +extern "C" { + pub fn wcscpy(__dest: *mut wchar_t, __src: *const wchar_t) + -> *mut wchar_t; + pub fn wcsncpy(__dest: *mut wchar_t, __src: *const wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn wcscat(__dest: *mut wchar_t, __src: *const wchar_t) + -> *mut wchar_t; + pub fn wcsncat(__dest: *mut wchar_t, __src: *const wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn wcscmp(__s1: *const wchar_t, __s2: *const wchar_t) + -> ::libc::c_int; + pub fn wcsncmp(__s1: *const wchar_t, __s2: *const wchar_t, __n: size_t) + -> ::libc::c_int; + pub fn wcscasecmp(__s1: *const wchar_t, __s2: *const wchar_t) + -> ::libc::c_int; + pub fn wcsncasecmp(__s1: *const wchar_t, __s2: *const wchar_t, + __n: size_t) -> ::libc::c_int; + pub fn wcscasecmp_l(__s1: *const wchar_t, __s2: *const wchar_t, + __loc: __locale_t) -> ::libc::c_int; + pub fn wcsncasecmp_l(__s1: *const wchar_t, __s2: *const wchar_t, + __n: size_t, __loc: __locale_t) -> ::libc::c_int; + pub fn wcscoll(__s1: *const wchar_t, __s2: *const wchar_t) + -> ::libc::c_int; + pub fn wcsxfrm(__s1: *mut wchar_t, __s2: *const wchar_t, __n: size_t) + -> size_t; + pub fn wcscoll_l(__s1: *const wchar_t, __s2: *const wchar_t, + __loc: __locale_t) -> ::libc::c_int; + pub fn wcsxfrm_l(__s1: *mut wchar_t, __s2: *const wchar_t, __n: size_t, + __loc: __locale_t) -> size_t; + pub fn wcsdup(__s: *const wchar_t) -> *mut wchar_t; + pub fn wcschr(__wcs: *const wchar_t, __wc: wchar_t) -> *mut wchar_t; + pub fn wcsrchr(__wcs: *const wchar_t, __wc: wchar_t) -> *mut wchar_t; + pub fn wcscspn(__wcs: *const wchar_t, __reject: *const wchar_t) -> size_t; + pub fn wcsspn(__wcs: *const wchar_t, __accept: *const wchar_t) -> size_t; + pub fn wcspbrk(__wcs: *const wchar_t, __accept: *const wchar_t) + -> *mut wchar_t; + pub fn wcsstr(__haystack: *const wchar_t, __needle: *const wchar_t) + -> *mut wchar_t; + pub fn wcstok(__s: *mut wchar_t, __delim: *const wchar_t, + __ptr: *mut *mut wchar_t) -> *mut wchar_t; + pub fn wcslen(__s: *const wchar_t) -> size_t; + pub fn wcsnlen(__s: *const wchar_t, __maxlen: size_t) -> size_t; + pub fn wmemchr(__s: *const wchar_t, __c: wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn wmemcmp(__s1: *const wchar_t, __s2: *const wchar_t, __n: size_t) + -> ::libc::c_int; + pub fn wmemcpy(__s1: *mut wchar_t, __s2: *const wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn wmemmove(__s1: *mut wchar_t, __s2: *const wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn wmemset(__s: *mut wchar_t, __c: wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn btowc(__c: ::libc::c_int) -> wint_t; + pub fn wctob(__c: wint_t) -> ::libc::c_int; + pub fn mbsinit(__ps: *const mbstate_t) -> ::libc::c_int; + pub fn mbrtowc(__pwc: *mut wchar_t, __s: *const ::libc::c_char, + __n: size_t, __p: *mut mbstate_t) -> size_t; + pub fn wcrtomb(__s: *mut ::libc::c_char, __wc: wchar_t, + __ps: *mut mbstate_t) -> size_t; + pub fn __mbrlen(__s: *const ::libc::c_char, __n: size_t, + __ps: *mut mbstate_t) -> size_t; + pub fn mbrlen(__s: *const ::libc::c_char, __n: size_t, + __ps: *mut mbstate_t) -> size_t; + pub fn mbsrtowcs(__dst: *mut wchar_t, __src: *mut *const ::libc::c_char, + __len: size_t, __ps: *mut mbstate_t) -> size_t; + pub fn wcsrtombs(__dst: *mut ::libc::c_char, __src: *mut *const wchar_t, + __len: size_t, __ps: *mut mbstate_t) -> size_t; + pub fn mbsnrtowcs(__dst: *mut wchar_t, __src: *mut *const ::libc::c_char, + __nmc: size_t, __len: size_t, __ps: *mut mbstate_t) + -> size_t; + pub fn wcsnrtombs(__dst: *mut ::libc::c_char, __src: *mut *const wchar_t, + __nwc: size_t, __len: size_t, __ps: *mut mbstate_t) + -> size_t; + pub fn wcstod(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t) + -> ::libc::c_double; + pub fn wcstof(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t) + -> ::libc::c_float; + pub fn wcstold(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t) + -> ::libc::c_double; + pub fn wcstol(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t, + __base: ::libc::c_int) -> ::libc::c_long; + pub fn wcstoul(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t, + __base: ::libc::c_int) -> ::libc::c_ulong; + pub fn wcstoll(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t, + __base: ::libc::c_int) -> ::libc::c_longlong; + pub fn wcstoull(__nptr: *const wchar_t, __endptr: *mut *mut wchar_t, + __base: ::libc::c_int) -> ::libc::c_ulonglong; + pub fn wcpcpy(__dest: *mut wchar_t, __src: *const wchar_t) + -> *mut wchar_t; + pub fn wcpncpy(__dest: *mut wchar_t, __src: *const wchar_t, __n: size_t) + -> *mut wchar_t; + pub fn open_wmemstream(__bufloc: *mut *mut wchar_t, + __sizeloc: *mut size_t) -> *mut __FILE; + pub fn fwide(__fp: *mut __FILE, __mode: ::libc::c_int) -> ::libc::c_int; + pub fn fwprintf(__stream: *mut __FILE, __format: *const wchar_t, ...) + -> ::libc::c_int; + pub fn wprintf(__format: *const wchar_t, ...) -> ::libc::c_int; + pub fn swprintf(__s: *mut wchar_t, __n: size_t, + __format: *const wchar_t, ...) -> ::libc::c_int; + pub fn vfwprintf(__s: *mut __FILE, __format: *const wchar_t, + __arg: __gnuc_va_list) -> ::libc::c_int; + pub fn vwprintf(__format: *const wchar_t, __arg: __gnuc_va_list) + -> ::libc::c_int; + pub fn vswprintf(__s: *mut wchar_t, __n: size_t, __format: *const wchar_t, + __arg: __gnuc_va_list) -> ::libc::c_int; + pub fn fwscanf(__stream: *mut __FILE, __format: *const wchar_t, ...) + -> ::libc::c_int; + pub fn wscanf(__format: *const wchar_t, ...) -> ::libc::c_int; + pub fn swscanf(__s: *const wchar_t, __format: *const wchar_t, ...) + -> ::libc::c_int; + pub fn vfwscanf(__s: *mut __FILE, __format: *const wchar_t, + __arg: __gnuc_va_list) -> ::libc::c_int; + pub fn vwscanf(__format: *const wchar_t, __arg: __gnuc_va_list) + -> ::libc::c_int; + pub fn vswscanf(__s: *const wchar_t, __format: *const wchar_t, + __arg: __gnuc_va_list) -> ::libc::c_int; + pub fn fgetwc(__stream: *mut __FILE) -> wint_t; + pub fn getwc(__stream: *mut __FILE) -> wint_t; + pub fn getwchar() -> wint_t; + pub fn fputwc(__wc: wchar_t, __stream: *mut __FILE) -> wint_t; + pub fn putwc(__wc: wchar_t, __stream: *mut __FILE) -> wint_t; + pub fn putwchar(__wc: wchar_t) -> wint_t; + pub fn fgetws(__ws: *mut wchar_t, __n: ::libc::c_int, + __stream: *mut __FILE) -> *mut wchar_t; + pub fn fputws(__ws: *const wchar_t, __stream: *mut __FILE) + -> ::libc::c_int; + pub fn ungetwc(__wc: wint_t, __stream: *mut __FILE) -> wint_t; + pub fn wcsftime(__s: *mut wchar_t, __maxsize: size_t, + __format: *const wchar_t, __tp: *const Struct_tm) + -> size_t; + pub fn TCOD_strdup(s: *const ::libc::c_char) -> *mut ::libc::c_char; + pub fn TCOD_strcasecmp(s1: *const ::libc::c_char, + s2: *const ::libc::c_char) -> ::libc::c_int; + pub fn TCOD_strncasecmp(s1: *const ::libc::c_char, + s2: *const ::libc::c_char, n: size_t) + -> ::libc::c_int; + pub fn TCOD_list_new() -> TCOD_list_t; + pub fn TCOD_list_allocate(nb_elements: ::libc::c_int) -> TCOD_list_t; + pub fn TCOD_list_duplicate(l: TCOD_list_t) -> TCOD_list_t; + pub fn TCOD_list_delete(l: TCOD_list_t); + pub fn TCOD_list_push(l: TCOD_list_t, elt: *const ::libc::c_void); + pub fn TCOD_list_pop(l: TCOD_list_t) -> *mut ::libc::c_void; + pub fn TCOD_list_peek(l: TCOD_list_t) -> *mut ::libc::c_void; + pub fn TCOD_list_add_all(l: TCOD_list_t, l2: TCOD_list_t); + pub fn TCOD_list_get(l: TCOD_list_t, idx: ::libc::c_int) + -> *mut ::libc::c_void; + pub fn TCOD_list_set(l: TCOD_list_t, elt: *const ::libc::c_void, + idx: ::libc::c_int); + pub fn TCOD_list_begin(l: TCOD_list_t) -> *mut *mut ::libc::c_void; + pub fn TCOD_list_end(l: TCOD_list_t) -> *mut *mut ::libc::c_void; + pub fn TCOD_list_reverse(l: TCOD_list_t); + pub fn TCOD_list_remove_iterator(l: TCOD_list_t, + elt: *mut *mut ::libc::c_void) + -> *mut *mut ::libc::c_void; + pub fn TCOD_list_remove(l: TCOD_list_t, elt: *const ::libc::c_void); + pub fn TCOD_list_remove_iterator_fast(l: TCOD_list_t, + elt: *mut *mut ::libc::c_void) + -> *mut *mut ::libc::c_void; + pub fn TCOD_list_remove_fast(l: TCOD_list_t, elt: *const ::libc::c_void); + pub fn TCOD_list_contains(l: TCOD_list_t, elt: *const ::libc::c_void) + -> _bool; + pub fn TCOD_list_clear(l: TCOD_list_t); + pub fn TCOD_list_clear_and_delete(l: TCOD_list_t); + pub fn TCOD_list_size(l: TCOD_list_t) -> ::libc::c_int; + pub fn TCOD_list_insert_before(l: TCOD_list_t, elt: *const ::libc::c_void, + before: ::libc::c_int) + -> *mut *mut ::libc::c_void; + pub fn TCOD_list_is_empty(l: TCOD_list_t) -> _bool; + pub fn TCOD_color_RGB(r: uint8, g: uint8, b: uint8) -> TCOD_color_t; + pub fn TCOD_color_HSV(h: ::libc::c_float, s: ::libc::c_float, + v: ::libc::c_float) -> TCOD_color_t; + pub fn TCOD_color_equals(c1: TCOD_color_t, c2: TCOD_color_t) -> _bool; + pub fn TCOD_color_add(c1: TCOD_color_t, c2: TCOD_color_t) -> TCOD_color_t; + pub fn TCOD_color_subtract(c1: TCOD_color_t, c2: TCOD_color_t) + -> TCOD_color_t; + pub fn TCOD_color_multiply(c1: TCOD_color_t, c2: TCOD_color_t) + -> TCOD_color_t; + pub fn TCOD_color_multiply_scalar(c1: TCOD_color_t, + value: ::libc::c_float) -> TCOD_color_t; + pub fn TCOD_color_lerp(c1: TCOD_color_t, c2: TCOD_color_t, + coef: ::libc::c_float) -> TCOD_color_t; + pub fn TCOD_color_set_HSV(c: *mut TCOD_color_t, h: ::libc::c_float, + s: ::libc::c_float, v: ::libc::c_float); + pub fn TCOD_color_get_HSV(c: TCOD_color_t, h: *mut ::libc::c_float, + s: *mut ::libc::c_float, + v: *mut ::libc::c_float); + pub fn TCOD_color_get_hue(c: TCOD_color_t) -> ::libc::c_float; + pub fn TCOD_color_set_hue(c: *mut TCOD_color_t, h: ::libc::c_float); + pub fn TCOD_color_get_saturation(c: TCOD_color_t) -> ::libc::c_float; + pub fn TCOD_color_set_saturation(c: *mut TCOD_color_t, + s: ::libc::c_float); + pub fn TCOD_color_get_value(c: TCOD_color_t) -> ::libc::c_float; + pub fn TCOD_color_set_value(c: *mut TCOD_color_t, v: ::libc::c_float); + pub fn TCOD_color_shift_hue(c: *mut TCOD_color_t, + hshift: ::libc::c_float); + pub fn TCOD_color_scale_HSV(c: *mut TCOD_color_t, scoef: ::libc::c_float, + vcoef: ::libc::c_float); + pub fn TCOD_color_gen_map(map: *mut TCOD_color_t, nb_key: ::libc::c_int, + key_color: *const TCOD_color_t, + key_index: *const ::libc::c_int); + pub fn TCOD_console_init_root(w: ::libc::c_int, h: ::libc::c_int, + title: *const ::libc::c_char, + fullscreen: _bool, + renderer: TCOD_renderer_t); + pub fn TCOD_console_set_window_title(title: *const ::libc::c_char); + pub fn TCOD_console_set_fullscreen(fullscreen: _bool); + pub fn TCOD_console_is_fullscreen() -> _bool; + pub fn TCOD_console_is_window_closed() -> _bool; + pub fn TCOD_console_has_mouse_focus() -> _bool; + pub fn TCOD_console_is_active() -> _bool; + pub fn TCOD_console_set_custom_font(fontFile: *const ::libc::c_char, + flags: ::libc::c_int, + nb_char_horiz: ::libc::c_int, + nb_char_vertic: ::libc::c_int); + pub fn TCOD_console_map_ascii_code_to_font(asciiCode: ::libc::c_int, + fontCharX: ::libc::c_int, + fontCharY: ::libc::c_int); + pub fn TCOD_console_map_ascii_codes_to_font(asciiCode: ::libc::c_int, + nbCodes: ::libc::c_int, + fontCharX: ::libc::c_int, + fontCharY: ::libc::c_int); + pub fn TCOD_console_map_string_to_font(s: *const ::libc::c_char, + fontCharX: ::libc::c_int, + fontCharY: ::libc::c_int); + pub fn TCOD_console_set_dirty(x: ::libc::c_int, y: ::libc::c_int, + w: ::libc::c_int, h: ::libc::c_int); + pub fn TCOD_console_set_default_background(con: TCOD_console_t, + col: TCOD_color_t); + pub fn TCOD_console_set_default_foreground(con: TCOD_console_t, + col: TCOD_color_t); + pub fn TCOD_console_clear(con: TCOD_console_t); + pub fn TCOD_console_set_char_background(con: TCOD_console_t, + x: ::libc::c_int, + y: ::libc::c_int, + col: TCOD_color_t, + flag: TCOD_bkgnd_flag_t); + pub fn TCOD_console_set_char_foreground(con: TCOD_console_t, + x: ::libc::c_int, + y: ::libc::c_int, + col: TCOD_color_t); + pub fn TCOD_console_set_char(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, c: ::libc::c_int); + pub fn TCOD_console_put_char(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, c: ::libc::c_int, + flag: TCOD_bkgnd_flag_t); + pub fn TCOD_console_put_char_ex(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, c: ::libc::c_int, + fore: TCOD_color_t, back: TCOD_color_t); + pub fn TCOD_console_set_background_flag(con: TCOD_console_t, + flag: TCOD_bkgnd_flag_t); + pub fn TCOD_console_get_background_flag(con: TCOD_console_t) + -> TCOD_bkgnd_flag_t; + pub fn TCOD_console_set_alignment(con: TCOD_console_t, + alignment: TCOD_alignment_t); + pub fn TCOD_console_get_alignment(con: TCOD_console_t) + -> TCOD_alignment_t; + pub fn TCOD_console_print(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, + fmt: *const ::libc::c_char, ...); + pub fn TCOD_console_print_ex(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, flag: TCOD_bkgnd_flag_t, + alignment: TCOD_alignment_t, + fmt: *const ::libc::c_char, ...); + pub fn TCOD_console_print_rect(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int, + fmt: *const ::libc::c_char, ...) + -> ::libc::c_int; + pub fn TCOD_console_print_rect_ex(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int, + flag: TCOD_bkgnd_flag_t, + alignment: TCOD_alignment_t, + fmt: *const ::libc::c_char, ...) + -> ::libc::c_int; + pub fn TCOD_console_get_height_rect(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int, + fmt: *const ::libc::c_char, ...) + -> ::libc::c_int; + pub fn TCOD_console_rect(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int, clear: _bool, + flag: TCOD_bkgnd_flag_t); + pub fn TCOD_console_hline(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, l: ::libc::c_int, + flag: TCOD_bkgnd_flag_t); + pub fn TCOD_console_vline(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, l: ::libc::c_int, + flag: TCOD_bkgnd_flag_t); + pub fn TCOD_console_print_frame(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int, empty: _bool, + flag: TCOD_bkgnd_flag_t, + fmt: *const ::libc::c_char, ...); + pub fn TCOD_console_map_string_to_font_utf(s: *const wchar_t, + fontCharX: ::libc::c_int, + fontCharY: ::libc::c_int); + pub fn TCOD_console_print_utf(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, fmt: *const wchar_t, ...); + pub fn TCOD_console_print_ex_utf(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, + flag: TCOD_bkgnd_flag_t, + alignment: TCOD_alignment_t, + fmt: *const wchar_t, ...); + pub fn TCOD_console_print_rect_utf(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int, + fmt: *const wchar_t, ...) + -> ::libc::c_int; + pub fn TCOD_console_print_rect_ex_utf(con: TCOD_console_t, + x: ::libc::c_int, y: ::libc::c_int, + w: ::libc::c_int, h: ::libc::c_int, + flag: TCOD_bkgnd_flag_t, + alignment: TCOD_alignment_t, + fmt: *const wchar_t, ...) + -> ::libc::c_int; + pub fn TCOD_console_get_height_rect_utf(con: TCOD_console_t, + x: ::libc::c_int, + y: ::libc::c_int, + w: ::libc::c_int, + h: ::libc::c_int, + fmt: *const wchar_t, ...) + -> ::libc::c_int; + pub fn TCOD_console_get_default_background(con: TCOD_console_t) + -> TCOD_color_t; + pub fn TCOD_console_get_default_foreground(con: TCOD_console_t) + -> TCOD_color_t; + pub fn TCOD_console_get_char_background(con: TCOD_console_t, + x: ::libc::c_int, + y: ::libc::c_int) -> TCOD_color_t; + pub fn TCOD_console_get_char_foreground(con: TCOD_console_t, + x: ::libc::c_int, + y: ::libc::c_int) -> TCOD_color_t; + pub fn TCOD_console_get_char(con: TCOD_console_t, x: ::libc::c_int, + y: ::libc::c_int) -> ::libc::c_int; + pub fn TCOD_console_set_fade(val: uint8, fade: TCOD_color_t); + pub fn TCOD_console_get_fade() -> uint8; + pub fn TCOD_console_get_fading_color() -> TCOD_color_t; + pub fn TCOD_console_flush(); + pub fn TCOD_console_set_color_control(con: TCOD_colctrl_t, + fore: TCOD_color_t, + back: TCOD_color_t); + pub fn TCOD_console_check_for_keypress(flags: ::libc::c_int) + -> TCOD_key_t; + pub fn TCOD_console_wait_for_keypress(flush: _bool) -> TCOD_key_t; + pub fn TCOD_console_set_keyboard_repeat(initial_delay: ::libc::c_int, + interval: ::libc::c_int); + pub fn TCOD_console_disable_keyboard_repeat(); + pub fn TCOD_console_is_key_pressed(key: TCOD_keycode_t) -> _bool; + pub fn TCOD_console_from_file(filename: *const ::libc::c_char) + -> TCOD_console_t; + pub fn TCOD_console_load_asc(con: TCOD_console_t, + filename: *const ::libc::c_char) -> _bool; + pub fn TCOD_console_load_apf(con: TCOD_console_t, + filename: *const ::libc::c_char) -> _bool; + pub fn TCOD_console_save_asc(con: TCOD_console_t, + filename: *const ::libc::c_char) -> _bool; + pub fn TCOD_console_save_apf(con: TCOD_console_t, + filename: *const ::libc::c_char) -> _bool; + pub fn TCOD_console_new(w: ::libc::c_int, h: ::libc::c_int) + -> TCOD_console_t; + pub fn TCOD_console_get_width(con: TCOD_console_t) -> ::libc::c_int; + pub fn TCOD_console_get_height(con: TCOD_console_t) -> ::libc::c_int; + pub fn TCOD_console_set_key_color(con: TCOD_console_t, col: TCOD_color_t); + pub fn TCOD_console_blit(src: TCOD_console_t, xSrc: ::libc::c_int, + ySrc: ::libc::c_int, wSrc: ::libc::c_int, + hSrc: ::libc::c_int, dst: TCOD_console_t, + xDst: ::libc::c_int, yDst: ::libc::c_int, + foreground_alpha: ::libc::c_float, + background_alpha: ::libc::c_float); + pub fn TCOD_console_delete(console: TCOD_console_t); + pub fn TCOD_console_credits(); + pub fn TCOD_console_credits_reset(); + pub fn TCOD_console_credits_render(x: ::libc::c_int, y: ::libc::c_int, + alpha: _bool) -> _bool; + pub fn TCOD_image_new(width: ::libc::c_int, height: ::libc::c_int) + -> TCOD_image_t; + pub fn TCOD_image_from_console(console: TCOD_console_t) -> TCOD_image_t; + pub fn TCOD_image_refresh_console(image: TCOD_image_t, + console: TCOD_console_t); + pub fn TCOD_image_load(filename: *const ::libc::c_char) -> TCOD_image_t; + pub fn TCOD_image_clear(image: TCOD_image_t, color: TCOD_color_t); + pub fn TCOD_image_invert(image: TCOD_image_t); + pub fn TCOD_image_hflip(image: TCOD_image_t); + pub fn TCOD_image_rotate90(image: TCOD_image_t, + numRotations: ::libc::c_int); + pub fn TCOD_image_vflip(image: TCOD_image_t); + pub fn TCOD_image_scale(image: TCOD_image_t, neww: ::libc::c_int, + newh: ::libc::c_int); + pub fn TCOD_image_save(image: TCOD_image_t, + filename: *const ::libc::c_char); + pub fn TCOD_image_get_size(image: TCOD_image_t, w: *mut ::libc::c_int, + h: *mut ::libc::c_int); + pub fn TCOD_image_get_pixel(image: TCOD_image_t, x: ::libc::c_int, + y: ::libc::c_int) -> TCOD_color_t; + pub fn TCOD_image_get_alpha(image: TCOD_image_t, x: ::libc::c_int, + y: ::libc::c_int) -> ::libc::c_int; + pub fn TCOD_image_get_mipmap_pixel(image: TCOD_image_t, + x0: ::libc::c_float, + y0: ::libc::c_float, + x1: ::libc::c_float, + y1: ::libc::c_float) -> TCOD_color_t; + pub fn TCOD_image_put_pixel(image: TCOD_image_t, x: ::libc::c_int, + y: ::libc::c_int, col: TCOD_color_t); + pub fn TCOD_image_blit(image: TCOD_image_t, console: TCOD_console_t, + x: ::libc::c_float, y: ::libc::c_float, + bkgnd_flag: TCOD_bkgnd_flag_t, + scalex: ::libc::c_float, scaley: ::libc::c_float, + angle: ::libc::c_float); + pub fn TCOD_image_blit_rect(image: TCOD_image_t, console: TCOD_console_t, + x: ::libc::c_int, y: ::libc::c_int, + w: ::libc::c_int, h: ::libc::c_int, + bkgnd_flag: TCOD_bkgnd_flag_t); + pub fn TCOD_image_blit_2x(image: TCOD_image_t, dest: TCOD_console_t, + dx: ::libc::c_int, dy: ::libc::c_int, + sx: ::libc::c_int, sy: ::libc::c_int, + w: ::libc::c_int, h: ::libc::c_int); + pub fn TCOD_image_delete(image: TCOD_image_t); + pub fn TCOD_image_set_key_color(image: TCOD_image_t, + key_color: TCOD_color_t); + pub fn TCOD_image_is_pixel_transparent(image: TCOD_image_t, + x: ::libc::c_int, y: ::libc::c_int) + -> _bool; + pub fn TCOD_mouse_show_cursor(visible: _bool); + pub fn TCOD_mouse_get_status() -> TCOD_mouse_t; + pub fn TCOD_mouse_is_cursor_visible() -> _bool; + pub fn TCOD_mouse_move(x: ::libc::c_int, y: ::libc::c_int); + pub fn TCOD_mouse_includes_touch(enable: _bool); + pub fn TCOD_sys_elapsed_milli() -> uint32; + pub fn TCOD_sys_elapsed_seconds() -> ::libc::c_float; + pub fn TCOD_sys_sleep_milli(val: uint32); + pub fn TCOD_sys_save_screenshot(filename: *const ::libc::c_char); + pub fn TCOD_sys_force_fullscreen_resolution(width: ::libc::c_int, + height: ::libc::c_int); + pub fn TCOD_sys_set_renderer(renderer: TCOD_renderer_t); + pub fn TCOD_sys_get_renderer() -> TCOD_renderer_t; + pub fn TCOD_sys_set_fps(val: ::libc::c_int); + pub fn TCOD_sys_get_fps() -> ::libc::c_int; + pub fn TCOD_sys_get_last_frame_length() -> ::libc::c_float; + pub fn TCOD_sys_get_current_resolution(w: *mut ::libc::c_int, + h: *mut ::libc::c_int); + pub fn TCOD_sys_get_fullscreen_offsets(offx: *mut ::libc::c_int, + offy: *mut ::libc::c_int); + pub fn TCOD_sys_update_char(asciiCode: ::libc::c_int, + fontx: ::libc::c_int, fonty: ::libc::c_int, + img: TCOD_image_t, x: ::libc::c_int, + y: ::libc::c_int); + pub fn TCOD_sys_get_char_size(w: *mut ::libc::c_int, + h: *mut ::libc::c_int); + pub fn TCOD_sys_get_SDL_window() -> *mut ::libc::c_void; + pub fn TCOD_sys_wait_for_event(eventMask: ::libc::c_int, + key: *mut TCOD_key_t, + mouse: *mut TCOD_mouse_t, flush: _bool) + -> TCOD_event_t; + pub fn TCOD_sys_check_for_event(eventMask: ::libc::c_int, + key: *mut TCOD_key_t, + mouse: *mut TCOD_mouse_t) -> TCOD_event_t; + pub fn TCOD_sys_create_directory(path: *const ::libc::c_char) -> _bool; + pub fn TCOD_sys_delete_file(path: *const ::libc::c_char) -> _bool; + pub fn TCOD_sys_delete_directory(path: *const ::libc::c_char) -> _bool; + pub fn TCOD_sys_is_directory(path: *const ::libc::c_char) -> _bool; + pub fn TCOD_sys_get_directory_content(path: *const ::libc::c_char, + pattern: *const ::libc::c_char) + -> TCOD_list_t; + pub fn TCOD_sys_file_exists(filename: *const ::libc::c_char, ...) + -> _bool; + pub fn TCOD_sys_read_file(filename: *const ::libc::c_char, + buf: *mut *mut ::libc::c_uchar, + size: *mut size_t) -> _bool; + pub fn TCOD_sys_write_file(filename: *const ::libc::c_char, + buf: *mut ::libc::c_uchar, size: uint32) + -> _bool; + pub fn TCOD_sys_clipboard_set(value: *const ::libc::c_char); + pub fn TCOD_sys_clipboard_get() -> *const ::libc::c_char; + pub fn TCOD_thread_new(func: + ::std::option::Option ::libc::c_int>, + data: *mut ::libc::c_void) -> TCOD_thread_t; + pub fn TCOD_thread_delete(th: TCOD_thread_t); + pub fn TCOD_sys_get_num_cores() -> ::libc::c_int; + pub fn TCOD_thread_wait(th: TCOD_thread_t); + pub fn TCOD_mutex_new() -> TCOD_mutex_t; + pub fn TCOD_mutex_in(_mut: TCOD_mutex_t); + pub fn TCOD_mutex_out(_mut: TCOD_mutex_t); + pub fn TCOD_mutex_delete(_mut: TCOD_mutex_t); + pub fn TCOD_semaphore_new(initVal: ::libc::c_int) -> TCOD_semaphore_t; + pub fn TCOD_semaphore_lock(sem: TCOD_semaphore_t); + pub fn TCOD_semaphore_unlock(sem: TCOD_semaphore_t); + pub fn TCOD_semaphore_delete(sem: TCOD_semaphore_t); + pub fn TCOD_condition_new() -> TCOD_cond_t; + pub fn TCOD_condition_signal(sem: TCOD_cond_t); + pub fn TCOD_condition_broadcast(sem: TCOD_cond_t); + pub fn TCOD_condition_wait(sem: TCOD_cond_t, _mut: TCOD_mutex_t); + pub fn TCOD_condition_delete(sem: TCOD_cond_t); + pub fn TCOD_load_library(path: *const ::libc::c_char) -> TCOD_library_t; + pub fn TCOD_get_function_address(library: TCOD_library_t, + function_name: *const ::libc::c_char) + -> *mut ::libc::c_void; + pub fn TCOD_close_library(arg1: TCOD_library_t); + pub fn TCOD_sys_register_SDL_renderer(renderer: SDL_renderer_t); + pub fn TCOD_random_get_instance() -> TCOD_random_t; + pub fn TCOD_random_new(algo: TCOD_random_algo_t) -> TCOD_random_t; + pub fn TCOD_random_save(mersenne: TCOD_random_t) -> TCOD_random_t; + pub fn TCOD_random_restore(mersenne: TCOD_random_t, + backup: TCOD_random_t); + pub fn TCOD_random_new_from_seed(algo: TCOD_random_algo_t, seed: uint32) + -> TCOD_random_t; + pub fn TCOD_random_delete(mersenne: TCOD_random_t); + pub fn TCOD_random_set_distribution(mersenne: TCOD_random_t, + distribution: TCOD_distribution_t); + pub fn TCOD_random_get_int(mersenne: TCOD_random_t, min: ::libc::c_int, + max: ::libc::c_int) -> ::libc::c_int; + pub fn TCOD_random_get_float(mersenne: TCOD_random_t, + min: ::libc::c_float, max: ::libc::c_float) + -> ::libc::c_float; + pub fn TCOD_random_get_double(mersenne: TCOD_random_t, + min: ::libc::c_double, + max: ::libc::c_double) -> ::libc::c_double; + pub fn TCOD_random_get_int_mean(mersenne: TCOD_random_t, + min: ::libc::c_int, max: ::libc::c_int, + mean: ::libc::c_int) -> ::libc::c_int; + pub fn TCOD_random_get_float_mean(mersenne: TCOD_random_t, + min: ::libc::c_float, + max: ::libc::c_float, + mean: ::libc::c_float) + -> ::libc::c_float; + pub fn TCOD_random_get_double_mean(mersenne: TCOD_random_t, + min: ::libc::c_double, + max: ::libc::c_double, + mean: ::libc::c_double) + -> ::libc::c_double; + pub fn TCOD_random_dice_new(s: *const ::libc::c_char) -> TCOD_dice_t; + pub fn TCOD_random_dice_roll(mersenne: TCOD_random_t, dice: TCOD_dice_t) + -> ::libc::c_int; + pub fn TCOD_random_dice_roll_s(mersenne: TCOD_random_t, + s: *const ::libc::c_char) -> ::libc::c_int; + pub fn TCOD_line_init(xFrom: ::libc::c_int, yFrom: ::libc::c_int, + xTo: ::libc::c_int, yTo: ::libc::c_int); + pub fn TCOD_line_step(xCur: *mut ::libc::c_int, yCur: *mut ::libc::c_int) + -> _bool; + pub fn TCOD_line(xFrom: ::libc::c_int, yFrom: ::libc::c_int, + xTo: ::libc::c_int, yTo: ::libc::c_int, + listener: TCOD_line_listener_t) -> _bool; + pub fn TCOD_line_init_mt(xFrom: ::libc::c_int, yFrom: ::libc::c_int, + xTo: ::libc::c_int, yTo: ::libc::c_int, + data: *mut TCOD_bresenham_data_t); + pub fn TCOD_line_step_mt(xCur: *mut ::libc::c_int, + yCur: *mut ::libc::c_int, + data: *mut TCOD_bresenham_data_t) -> _bool; + pub fn TCOD_line_mt(xFrom: ::libc::c_int, yFrom: ::libc::c_int, + xTo: ::libc::c_int, yTo: ::libc::c_int, + listener: TCOD_line_listener_t, + data: *mut TCOD_bresenham_data_t) -> _bool; + pub fn TCOD_noise_new(dimensions: ::libc::c_int, hurst: ::libc::c_float, + lacunarity: ::libc::c_float, random: TCOD_random_t) + -> TCOD_noise_t; + pub fn TCOD_noise_set_type(noise: TCOD_noise_t, _type: TCOD_noise_type_t); + pub fn TCOD_noise_get_ex(noise: TCOD_noise_t, f: *mut ::libc::c_float, + _type: TCOD_noise_type_t) -> ::libc::c_float; + pub fn TCOD_noise_get_fbm_ex(noise: TCOD_noise_t, f: *mut ::libc::c_float, + octaves: ::libc::c_float, + _type: TCOD_noise_type_t) -> ::libc::c_float; + pub fn TCOD_noise_get_turbulence_ex(noise: TCOD_noise_t, + f: *mut ::libc::c_float, + octaves: ::libc::c_float, + _type: TCOD_noise_type_t) + -> ::libc::c_float; + pub fn TCOD_noise_get(noise: TCOD_noise_t, f: *mut ::libc::c_float) + -> ::libc::c_float; + pub fn TCOD_noise_get_fbm(noise: TCOD_noise_t, f: *mut ::libc::c_float, + octaves: ::libc::c_float) -> ::libc::c_float; + pub fn TCOD_noise_get_turbulence(noise: TCOD_noise_t, + f: *mut ::libc::c_float, + octaves: ::libc::c_float) + -> ::libc::c_float; + pub fn TCOD_noise_delete(noise: TCOD_noise_t); + pub fn TCOD_map_new(width: ::libc::c_int, height: ::libc::c_int) + -> TCOD_map_t; + pub fn TCOD_map_clear(map: TCOD_map_t, transparent: _bool, + walkable: _bool); + pub fn TCOD_map_copy(source: TCOD_map_t, dest: TCOD_map_t); + pub fn TCOD_map_set_properties(map: TCOD_map_t, x: ::libc::c_int, + y: ::libc::c_int, is_transparent: _bool, + is_walkable: _bool); + pub fn TCOD_map_delete(map: TCOD_map_t); + pub fn TCOD_map_compute_fov(map: TCOD_map_t, player_x: ::libc::c_int, + player_y: ::libc::c_int, + max_radius: ::libc::c_int, light_walls: _bool, + algo: TCOD_fov_algorithm_t); + pub fn TCOD_map_is_in_fov(map: TCOD_map_t, x: ::libc::c_int, + y: ::libc::c_int) -> _bool; + pub fn TCOD_map_set_in_fov(map: TCOD_map_t, x: ::libc::c_int, + y: ::libc::c_int, fov: _bool); + pub fn TCOD_map_is_transparent(map: TCOD_map_t, x: ::libc::c_int, + y: ::libc::c_int) -> _bool; + pub fn TCOD_map_is_walkable(map: TCOD_map_t, x: ::libc::c_int, + y: ::libc::c_int) -> _bool; + pub fn TCOD_map_get_width(map: TCOD_map_t) -> ::libc::c_int; + pub fn TCOD_map_get_height(map: TCOD_map_t) -> ::libc::c_int; + pub fn TCOD_map_get_nb_cells(map: TCOD_map_t) -> ::libc::c_int; + pub fn TCOD_path_new_using_map(map: TCOD_map_t, + diagonalCost: ::libc::c_float) + -> TCOD_path_t; + pub fn TCOD_path_new_using_function(map_width: ::libc::c_int, + map_height: ::libc::c_int, + func: TCOD_path_func_t, + user_data: *mut ::libc::c_void, + diagonalCost: ::libc::c_float) + -> TCOD_path_t; + pub fn TCOD_path_compute(path: TCOD_path_t, ox: ::libc::c_int, + oy: ::libc::c_int, dx: ::libc::c_int, + dy: ::libc::c_int) -> _bool; + pub fn TCOD_path_walk(path: TCOD_path_t, x: *mut ::libc::c_int, + y: *mut ::libc::c_int, + recalculate_when_needed: _bool) -> _bool; + pub fn TCOD_path_is_empty(path: TCOD_path_t) -> _bool; + pub fn TCOD_path_size(path: TCOD_path_t) -> ::libc::c_int; + pub fn TCOD_path_reverse(path: TCOD_path_t); + pub fn TCOD_path_get(path: TCOD_path_t, index: ::libc::c_int, + x: *mut ::libc::c_int, y: *mut ::libc::c_int); + pub fn TCOD_path_get_origin(path: TCOD_path_t, x: *mut ::libc::c_int, + y: *mut ::libc::c_int); + pub fn TCOD_path_get_destination(path: TCOD_path_t, x: *mut ::libc::c_int, + y: *mut ::libc::c_int); + pub fn TCOD_path_delete(path: TCOD_path_t); + pub fn TCOD_dijkstra_new(map: TCOD_map_t, diagonalCost: ::libc::c_float) + -> TCOD_dijkstra_t; + pub fn TCOD_dijkstra_new_using_function(map_width: ::libc::c_int, + map_height: ::libc::c_int, + func: TCOD_path_func_t, + user_data: *mut ::libc::c_void, + diagonalCost: ::libc::c_float) + -> TCOD_dijkstra_t; + pub fn TCOD_dijkstra_compute(dijkstra: TCOD_dijkstra_t, + root_x: ::libc::c_int, + root_y: ::libc::c_int); + pub fn TCOD_dijkstra_get_distance(dijkstra: TCOD_dijkstra_t, + x: ::libc::c_int, y: ::libc::c_int) + -> ::libc::c_float; + pub fn TCOD_dijkstra_path_set(dijkstra: TCOD_dijkstra_t, x: ::libc::c_int, + y: ::libc::c_int) -> _bool; + pub fn TCOD_dijkstra_is_empty(path: TCOD_dijkstra_t) -> _bool; + pub fn TCOD_dijkstra_size(path: TCOD_dijkstra_t) -> ::libc::c_int; + pub fn TCOD_dijkstra_reverse(path: TCOD_dijkstra_t); + pub fn TCOD_dijkstra_get(path: TCOD_dijkstra_t, index: ::libc::c_int, + x: *mut ::libc::c_int, y: *mut ::libc::c_int); + pub fn TCOD_dijkstra_path_walk(dijkstra: TCOD_dijkstra_t, + x: *mut ::libc::c_int, + y: *mut ::libc::c_int) -> _bool; + pub fn TCOD_dijkstra_delete(dijkstra: TCOD_dijkstra_t); + pub fn TCOD_lex_new_intern() -> *mut TCOD_lex_t; + pub fn TCOD_lex_new(symbols: *mut *const ::libc::c_char, + keywords: *mut *const ::libc::c_char, + simpleComment: *const ::libc::c_char, + commentStart: *const ::libc::c_char, + commentStop: *const ::libc::c_char, + javadocCommentStart: *const ::libc::c_char, + stringDelim: *const ::libc::c_char, + flags: ::libc::c_int) -> *mut TCOD_lex_t; + pub fn TCOD_lex_delete(lex: *mut TCOD_lex_t); + pub fn TCOD_lex_set_data_buffer(lex: *mut TCOD_lex_t, + dat: *mut ::libc::c_char); + pub fn TCOD_lex_set_data_file(lex: *mut TCOD_lex_t, + filename: *const ::libc::c_char) -> _bool; + pub fn TCOD_lex_parse(lex: *mut TCOD_lex_t) -> ::libc::c_int; + pub fn TCOD_lex_parse_until_token_type(lex: *mut TCOD_lex_t, + token_type: ::libc::c_int) + -> ::libc::c_int; + pub fn TCOD_lex_parse_until_token_value(lex: *mut TCOD_lex_t, + token_value: + *const ::libc::c_char) + -> ::libc::c_int; + pub fn TCOD_lex_expect_token_type(lex: *mut TCOD_lex_t, + token_type: ::libc::c_int) -> _bool; + pub fn TCOD_lex_expect_token_value(lex: *mut TCOD_lex_t, + token_type: ::libc::c_int, + token_value: *const ::libc::c_char) + -> _bool; + pub fn TCOD_lex_savepoint(lex: *mut TCOD_lex_t, savept: *mut TCOD_lex_t); + pub fn TCOD_lex_restore(lex: *mut TCOD_lex_t, savept: *mut TCOD_lex_t); + pub fn TCOD_lex_get_last_javadoc(lex: *mut TCOD_lex_t) + -> *mut ::libc::c_char; + pub fn TCOD_lex_get_token_name(token_type: ::libc::c_int) + -> *const ::libc::c_char; + pub fn TCOD_lex_get_last_error() -> *mut ::libc::c_char; + pub fn TCOD_lex_hextoint(c: ::libc::c_char) -> ::libc::c_int; + pub fn TCOD_struct_get_name(def: TCOD_parser_struct_t) + -> *const ::libc::c_char; + pub fn TCOD_struct_add_property(def: TCOD_parser_struct_t, + name: *const ::libc::c_char, + _type: TCOD_value_type_t, + mandatory: _bool); + pub fn TCOD_struct_add_list_property(def: TCOD_parser_struct_t, + name: *const ::libc::c_char, + _type: TCOD_value_type_t, + mandatory: _bool); + pub fn TCOD_struct_add_value_list(def: TCOD_parser_struct_t, + name: *const ::libc::c_char, + value_list: *mut *const ::libc::c_char, + mandatory: _bool); + pub fn TCOD_struct_add_value_list_sized(def: TCOD_parser_struct_t, + name: *const ::libc::c_char, + value_list: + *mut *const ::libc::c_char, + size: ::libc::c_int, + mandatory: _bool); + pub fn TCOD_struct_add_flag(def: TCOD_parser_struct_t, + propname: *const ::libc::c_char); + pub fn TCOD_struct_add_structure(def: TCOD_parser_struct_t, + sub_structure: TCOD_parser_struct_t); + pub fn TCOD_struct_is_mandatory(def: TCOD_parser_struct_t, + propname: *const ::libc::c_char) -> _bool; + pub fn TCOD_struct_get_type(def: TCOD_parser_struct_t, + propname: *const ::libc::c_char) + -> TCOD_value_type_t; + pub fn TCOD_parser_new() -> TCOD_parser_t; + pub fn TCOD_parser_new_struct(parser: TCOD_parser_t, + name: *mut ::libc::c_char) + -> TCOD_parser_struct_t; + pub fn TCOD_parser_new_custom_type(parser: TCOD_parser_t, + custom_type_parser: + TCOD_parser_custom_t) + -> TCOD_value_type_t; + pub fn TCOD_parser_run(parser: TCOD_parser_t, + filename: *const ::libc::c_char, + listener: *mut TCOD_parser_listener_t); + pub fn TCOD_parser_delete(parser: TCOD_parser_t); + pub fn TCOD_parser_error(msg: *const ::libc::c_char, ...); + pub fn TCOD_parser_has_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) -> _bool; + pub fn TCOD_parser_get_bool_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> _bool; + pub fn TCOD_parser_get_char_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> ::libc::c_int; + pub fn TCOD_parser_get_int_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> ::libc::c_int; + pub fn TCOD_parser_get_float_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> ::libc::c_float; + pub fn TCOD_parser_get_string_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> *const ::libc::c_char; + pub fn TCOD_parser_get_color_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> TCOD_color_t; + pub fn TCOD_parser_get_dice_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> TCOD_dice_t; + pub fn TCOD_parser_get_dice_property_py(parser: TCOD_parser_t, + name: *const ::libc::c_char, + dice: *mut TCOD_dice_t); + pub fn TCOD_parser_get_custom_property(parser: TCOD_parser_t, + name: *const ::libc::c_char) + -> *mut ::libc::c_void; + pub fn TCOD_parser_get_list_property(parser: TCOD_parser_t, + name: *const ::libc::c_char, + _type: TCOD_value_type_t) + -> TCOD_list_t; + pub fn TCOD_parse_bool_value() -> TCOD_value_t; + pub fn TCOD_parse_char_value() -> TCOD_value_t; + pub fn TCOD_parse_integer_value() -> TCOD_value_t; + pub fn TCOD_parse_float_value() -> TCOD_value_t; + pub fn TCOD_parse_string_value() -> TCOD_value_t; + pub fn TCOD_parse_color_value() -> TCOD_value_t; + pub fn TCOD_parse_dice_value() -> TCOD_value_t; + pub fn TCOD_parse_value_list_value(def: *mut TCOD_struct_int_t, + listnum: ::libc::c_int) + -> TCOD_value_t; + pub fn TCOD_parse_property_value(parser: *mut TCOD_parser_int_t, + def: TCOD_parser_struct_t, + propname: *mut ::libc::c_char, + list: _bool) -> TCOD_value_t; + pub fn TCOD_tree_new() -> *mut TCOD_tree_t; + pub fn TCOD_tree_add_son(node: *mut TCOD_tree_t, son: *mut TCOD_tree_t); + pub fn TCOD_bsp_new() -> *mut TCOD_bsp_t; + pub fn TCOD_bsp_new_with_size(x: ::libc::c_int, y: ::libc::c_int, + w: ::libc::c_int, h: ::libc::c_int) + -> *mut TCOD_bsp_t; + pub fn TCOD_bsp_delete(node: *mut TCOD_bsp_t); + pub fn TCOD_bsp_left(node: *const TCOD_bsp_t) -> *mut TCOD_bsp_t; + pub fn TCOD_bsp_right(node: *const TCOD_bsp_t) -> *mut TCOD_bsp_t; + pub fn TCOD_bsp_father(node: *const TCOD_bsp_t) -> *mut TCOD_bsp_t; + pub fn TCOD_bsp_is_leaf(node: *const TCOD_bsp_t) -> _bool; + pub fn TCOD_bsp_traverse_pre_order(node: *mut TCOD_bsp_t, + listener: TCOD_bsp_callback_t, + userData: *mut ::libc::c_void) + -> _bool; + pub fn TCOD_bsp_traverse_in_order(node: *mut TCOD_bsp_t, + listener: TCOD_bsp_callback_t, + userData: *mut ::libc::c_void) -> _bool; + pub fn TCOD_bsp_traverse_post_order(node: *mut TCOD_bsp_t, + listener: TCOD_bsp_callback_t, + userData: *mut ::libc::c_void) + -> _bool; + pub fn TCOD_bsp_traverse_level_order(node: *mut TCOD_bsp_t, + listener: TCOD_bsp_callback_t, + userData: *mut ::libc::c_void) + -> _bool; + pub fn TCOD_bsp_traverse_inverted_level_order(node: *mut TCOD_bsp_t, + listener: + TCOD_bsp_callback_t, + userData: + *mut ::libc::c_void) + -> _bool; + pub fn TCOD_bsp_contains(node: *const TCOD_bsp_t, x: ::libc::c_int, + y: ::libc::c_int) -> _bool; + pub fn TCOD_bsp_find_node(node: *const TCOD_bsp_t, x: ::libc::c_int, + y: ::libc::c_int) -> *mut TCOD_bsp_t; + pub fn TCOD_bsp_resize(node: *mut TCOD_bsp_t, x: ::libc::c_int, + y: ::libc::c_int, w: ::libc::c_int, + h: ::libc::c_int); + pub fn TCOD_bsp_split_once(node: *mut TCOD_bsp_t, horizontal: _bool, + position: ::libc::c_int); + pub fn TCOD_bsp_split_recursive(node: *mut TCOD_bsp_t, + randomizer: TCOD_random_t, + nb: ::libc::c_int, + minHSize: ::libc::c_int, + minVSize: ::libc::c_int, + maxHRatio: ::libc::c_float, + maxVRatio: ::libc::c_float); + pub fn TCOD_bsp_remove_sons(node: *mut TCOD_bsp_t); + pub fn TCOD_heightmap_new(w: ::libc::c_int, h: ::libc::c_int) + -> *mut TCOD_heightmap_t; + pub fn TCOD_heightmap_delete(hm: *mut TCOD_heightmap_t); + pub fn TCOD_heightmap_get_value(hm: *const TCOD_heightmap_t, + x: ::libc::c_int, y: ::libc::c_int) + -> ::libc::c_float; + pub fn TCOD_heightmap_get_interpolated_value(hm: *const TCOD_heightmap_t, + x: ::libc::c_float, + y: ::libc::c_float) + -> ::libc::c_float; + pub fn TCOD_heightmap_set_value(hm: *mut TCOD_heightmap_t, + x: ::libc::c_int, y: ::libc::c_int, + value: ::libc::c_float); + pub fn TCOD_heightmap_get_slope(hm: *const TCOD_heightmap_t, + x: ::libc::c_int, y: ::libc::c_int) + -> ::libc::c_float; + pub fn TCOD_heightmap_get_normal(hm: *const TCOD_heightmap_t, + x: ::libc::c_float, y: ::libc::c_float, + n: *mut ::libc::c_float, + waterLevel: ::libc::c_float); + pub fn TCOD_heightmap_count_cells(hm: *const TCOD_heightmap_t, + min: ::libc::c_float, + max: ::libc::c_float) -> ::libc::c_int; + pub fn TCOD_heightmap_has_land_on_border(hm: *const TCOD_heightmap_t, + waterLevel: ::libc::c_float) + -> _bool; + pub fn TCOD_heightmap_get_minmax(hm: *const TCOD_heightmap_t, + min: *mut ::libc::c_float, + max: *mut ::libc::c_float); + pub fn TCOD_heightmap_copy(hm_source: *const TCOD_heightmap_t, + hm_dest: *mut TCOD_heightmap_t); + pub fn TCOD_heightmap_add(hm: *mut TCOD_heightmap_t, + value: ::libc::c_float); + pub fn TCOD_heightmap_scale(hm: *mut TCOD_heightmap_t, + value: ::libc::c_float); + pub fn TCOD_heightmap_clamp(hm: *mut TCOD_heightmap_t, + min: ::libc::c_float, max: ::libc::c_float); + pub fn TCOD_heightmap_normalize(hm: *mut TCOD_heightmap_t, + min: ::libc::c_float, + max: ::libc::c_float); + pub fn TCOD_heightmap_clear(hm: *mut TCOD_heightmap_t); + pub fn TCOD_heightmap_lerp_hm(hm1: *const TCOD_heightmap_t, + hm2: *const TCOD_heightmap_t, + hmres: *mut TCOD_heightmap_t, + coef: ::libc::c_float); + pub fn TCOD_heightmap_add_hm(hm1: *const TCOD_heightmap_t, + hm2: *const TCOD_heightmap_t, + hmres: *mut TCOD_heightmap_t); + pub fn TCOD_heightmap_multiply_hm(hm1: *const TCOD_heightmap_t, + hm2: *const TCOD_heightmap_t, + hmres: *mut TCOD_heightmap_t); + pub fn TCOD_heightmap_add_hill(hm: *mut TCOD_heightmap_t, + hx: ::libc::c_float, hy: ::libc::c_float, + hradius: ::libc::c_float, + hheight: ::libc::c_float); + pub fn TCOD_heightmap_dig_hill(hm: *mut TCOD_heightmap_t, + hx: ::libc::c_float, hy: ::libc::c_float, + hradius: ::libc::c_float, + hheight: ::libc::c_float); + pub fn TCOD_heightmap_dig_bezier(hm: *mut TCOD_heightmap_t, + px: *mut ::libc::c_int, + py: *mut ::libc::c_int, + startRadius: ::libc::c_float, + startDepth: ::libc::c_float, + endRadius: ::libc::c_float, + endDepth: ::libc::c_float); + pub fn TCOD_heightmap_rain_erosion(hm: *mut TCOD_heightmap_t, + nbDrops: ::libc::c_int, + erosionCoef: ::libc::c_float, + sedimentationCoef: ::libc::c_float, + rnd: TCOD_random_t); + pub fn TCOD_heightmap_kernel_transform(hm: *mut TCOD_heightmap_t, + kernelsize: ::libc::c_int, + dx: *const ::libc::c_int, + dy: *const ::libc::c_int, + weight: *const ::libc::c_float, + minLevel: ::libc::c_float, + maxLevel: ::libc::c_float); + pub fn TCOD_heightmap_add_voronoi(hm: *mut TCOD_heightmap_t, + nbPoints: ::libc::c_int, + nbCoef: ::libc::c_int, + coef: *const ::libc::c_float, + rnd: TCOD_random_t); + pub fn TCOD_heightmap_mid_point_displacement(hm: *mut TCOD_heightmap_t, + rnd: TCOD_random_t, + roughness: ::libc::c_float); + pub fn TCOD_heightmap_add_fbm(hm: *mut TCOD_heightmap_t, + noise: TCOD_noise_t, mulx: ::libc::c_float, + muly: ::libc::c_float, + addx: ::libc::c_float, + addy: ::libc::c_float, + octaves: ::libc::c_float, + delta: ::libc::c_float, + scale: ::libc::c_float); + pub fn TCOD_heightmap_scale_fbm(hm: *mut TCOD_heightmap_t, + noise: TCOD_noise_t, + mulx: ::libc::c_float, + muly: ::libc::c_float, + addx: ::libc::c_float, + addy: ::libc::c_float, + octaves: ::libc::c_float, + delta: ::libc::c_float, + scale: ::libc::c_float); + pub fn TCOD_heightmap_islandify(hm: *mut TCOD_heightmap_t, + seaLevel: ::libc::c_float, + rnd: TCOD_random_t); + pub fn TCOD_zip_new() -> TCOD_zip_t; + pub fn TCOD_zip_delete(zip: TCOD_zip_t); + pub fn TCOD_zip_put_char(zip: TCOD_zip_t, val: ::libc::c_char); + pub fn TCOD_zip_put_int(zip: TCOD_zip_t, val: ::libc::c_int); + pub fn TCOD_zip_put_float(zip: TCOD_zip_t, val: ::libc::c_float); + pub fn TCOD_zip_put_string(zip: TCOD_zip_t, val: *const ::libc::c_char); + pub fn TCOD_zip_put_color(zip: TCOD_zip_t, val: TCOD_color_t); + pub fn TCOD_zip_put_image(zip: TCOD_zip_t, val: TCOD_image_t); + pub fn TCOD_zip_put_console(zip: TCOD_zip_t, val: TCOD_console_t); + pub fn TCOD_zip_put_data(zip: TCOD_zip_t, nbBytes: ::libc::c_int, + data: *const ::libc::c_void); + pub fn TCOD_zip_get_current_bytes(zip: TCOD_zip_t) -> uint32; + pub fn TCOD_zip_save_to_file(zip: TCOD_zip_t, + filename: *const ::libc::c_char) + -> ::libc::c_int; + pub fn TCOD_zip_load_from_file(zip: TCOD_zip_t, + filename: *const ::libc::c_char) + -> ::libc::c_int; + pub fn TCOD_zip_get_char(zip: TCOD_zip_t) -> ::libc::c_char; + pub fn TCOD_zip_get_int(zip: TCOD_zip_t) -> ::libc::c_int; + pub fn TCOD_zip_get_float(zip: TCOD_zip_t) -> ::libc::c_float; + pub fn TCOD_zip_get_string(zip: TCOD_zip_t) -> *const ::libc::c_char; + pub fn TCOD_zip_get_color(zip: TCOD_zip_t) -> TCOD_color_t; + pub fn TCOD_zip_get_image(zip: TCOD_zip_t) -> TCOD_image_t; + pub fn TCOD_zip_get_console(zip: TCOD_zip_t) -> TCOD_console_t; + pub fn TCOD_zip_get_data(zip: TCOD_zip_t, nbBytes: ::libc::c_int, + data: *mut ::libc::c_void) -> ::libc::c_int; + pub fn TCOD_zip_get_remaining_bytes(zip: TCOD_zip_t) -> uint32; + pub fn TCOD_zip_skip_bytes(zip: TCOD_zip_t, nbBytes: uint32); + pub fn TCOD_namegen_parse(filename: *const ::libc::c_char, + random: TCOD_random_t); + pub fn TCOD_namegen_generate(name: *mut ::libc::c_char, allocate: _bool) + -> *mut ::libc::c_char; + pub fn TCOD_namegen_generate_custom(name: *mut ::libc::c_char, + rule: *mut ::libc::c_char, + allocate: _bool) + -> *mut ::libc::c_char; + pub fn TCOD_namegen_get_sets() -> TCOD_list_t; + pub fn TCOD_namegen_destroy(); + pub fn TCOD_text_init(x: ::libc::c_int, y: ::libc::c_int, + w: ::libc::c_int, h: ::libc::c_int, + max_chars: ::libc::c_int) -> TCOD_text_t; + pub fn TCOD_text_init2(w: ::libc::c_int, h: ::libc::c_int, + max_chars: ::libc::c_int) -> TCOD_text_t; + pub fn TCOD_text_set_pos(txt: TCOD_text_t, x: ::libc::c_int, + y: ::libc::c_int); + pub fn TCOD_text_set_properties(txt: TCOD_text_t, + cursor_char: ::libc::c_int, + blink_interval: ::libc::c_int, + prompt: *const ::libc::c_char, + tab_size: ::libc::c_int); + pub fn TCOD_text_set_colors(txt: TCOD_text_t, fore: TCOD_color_t, + back: TCOD_color_t, + back_transparency: ::libc::c_float); + pub fn TCOD_text_update(txt: TCOD_text_t, key: TCOD_key_t) -> _bool; + pub fn TCOD_text_render(txt: TCOD_text_t, con: TCOD_console_t); + pub fn TCOD_text_get(txt: TCOD_text_t) -> *const ::libc::c_char; + pub fn TCOD_text_reset(txt: TCOD_text_t); + pub fn TCOD_text_delete(txt: TCOD_text_t); +} diff --git a/tcod/tcod_sys/libtcod/LIBTCOD-CREDITS.txt b/tcod/tcod_sys/libtcod/LIBTCOD-CREDITS.txt new file mode 100644 index 00000000..0aab7f6b --- /dev/null +++ b/tcod/tcod_sys/libtcod/LIBTCOD-CREDITS.txt @@ -0,0 +1,45 @@ +Products : + +- upx, The Ultimate Packer for eXecutables, by Markus Oberhumer, Laszlo Molnar & John Reiser + http://upx.sourceforge.net +- zlib 1.2.3, by Jean-loup Gailly and Mark Adler + http://www.zlib.org +- lodepng 20120729, by Lode Vandevenne + http://lodev.org/lodepng +- SDL 1.2.12, by Sam Lantinga + http://www.libsdl.org + +Many thanks to everyone who provided feedback and patches, and especially : +- Dominik 'Mingos' Marczuk for the restrictive shadowcasting fov, djikstra + pathfinding, name generator, documentation skin, lots of bitmap fonts and + being the #1 libtcod user, supporter and contributor. +- Joao 'Jotaf' Henriques for his long time support, priceless comments and + suggestions and the awesome python tutorial. +- Chris 'donblas' Hamons for libtcod-net, the cmake system, the swig wrappers... +- Jonathon Duerig for the permissive field of view algorithm +- dividee for polishing and optimizing the python wrapper. +- John Klimek for the early C# port and valuable bug fixes. +- Kyle 'Hex Decimal' Stewart & Emmanuel 'Altefcat' Dempuré for their contribution + to the python port. +- Antagonist for the awesome SkyFire GLSL roguelike engine, hence libtcod's GLSL + renderer +- Sandman for various tricky bug fixes. +- Joe Osborn for the OSX port, bug fixes and the bresenham 3d routines (still + to be backported from the old 1.5 branch...). +- Paul Sexton for the common Lisp wrapper. +- Bernard Helyer for the D wrapper. +- Adam 'Blinks' Blinkinsop for the OSX port and the autotools compilation system. +- Nick Glauber for being the first libtcod Paypal sponsor. +- Matt Sullivan for the py3k support +- namor for the FreeBSD cmake support +- Anylo for putting some of the demos in the cmake compilation +- Michael De Rosa, Killer_X and Joe Rumsey for their work on OSX port +- Denis Belov for fixes on the heightmap toolkit +- owners of projects using libtcod. + +Fonts : +The celtic garamond and dundalk fonts are from 1001freefonts.com. +The caeldera font is from blambot.com. +Other fonts are included in windows. +The celtic_garamond, arial, courier, dejavu, consolas, prestige and lucida 10x10/12x12 bitmap fonts were created by Mingos. + diff --git a/tcod/tcod_sys/libtcod/LIBTCOD-LICENSE.txt b/tcod/tcod_sys/libtcod/LIBTCOD-LICENSE.txt new file mode 100644 index 00000000..d4316c69 --- /dev/null +++ b/tcod/tcod_sys/libtcod/LIBTCOD-LICENSE.txt @@ -0,0 +1,29 @@ +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* libtcod 'The Doryen library' is a cross-platform C/C++ library for roguelike +* developers. +* Its source code is available from : +* http://doryen.eptalys.net/libtcod +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tcod/tcod_sys/libtcod/README-SDL.txt b/tcod/tcod_sys/libtcod/README-SDL.txt new file mode 100644 index 00000000..1669736c --- /dev/null +++ b/tcod/tcod_sys/libtcod/README-SDL.txt @@ -0,0 +1,13 @@ + +Please distribute this file with the SDL runtime environment: + +The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library +designed to make it easy to write multi-media software, such as games and +emulators. + +The Simple DirectMedia Layer library source code is available from: +http://www.libsdl.org/ + +This library is distributed under the terms of the GNU LGPL license: +http://www.gnu.org/copyleft/lesser.html + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL.h new file mode 100644 index 00000000..6087b7cd --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL.h @@ -0,0 +1,101 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL.h + * Main include header for the SDL library + */ + +#ifndef _SDL_H +#define _SDL_H + +#include "SDL_main.h" +#include "SDL_stdinc.h" +#include "SDL_audio.h" +#include "SDL_cdrom.h" +#include "SDL_cpuinfo.h" +#include "SDL_endian.h" +#include "SDL_error.h" +#include "SDL_events.h" +#include "SDL_loadso.h" +#include "SDL_mutex.h" +#include "SDL_rwops.h" +#include "SDL_thread.h" +#include "SDL_timer.h" +#include "SDL_video.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL.h + * @note As of version 0.5, SDL is loaded dynamically into the application + */ + +/** @name SDL_INIT Flags + * These are the flags which may be passed to SDL_Init() -- you should + * specify the subsystems which you will be using in your application. + */ +/*@{*/ +#define SDL_INIT_TIMER 0x00000001 +#define SDL_INIT_AUDIO 0x00000010 +#define SDL_INIT_VIDEO 0x00000020 +#define SDL_INIT_CDROM 0x00000100 +#define SDL_INIT_JOYSTICK 0x00000200 +#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */ +#define SDL_INIT_EVENTTHREAD 0x01000000 /**< Not supported on all OS's */ +#define SDL_INIT_EVERYTHING 0x0000FFFF +/*@}*/ + +/** This function loads the SDL dynamically linked library and initializes + * the subsystems specified by 'flags' (and those satisfying dependencies) + * Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup + * signal handlers for some commonly ignored fatal signals (like SIGSEGV) + */ +extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); + +/** This function initializes specific SDL subsystems */ +extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); + +/** This function cleans up specific SDL subsystems */ +extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); + +/** This function returns mask of the specified subsystems which have + * been initialized. + * If 'flags' is 0, it returns a mask of all initialized subsystems. + */ +extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); + +/** This function cleans up all initialized subsystems and unloads the + * dynamically linked library. You should call it upon all exit conditions. + */ +extern DECLSPEC void SDLCALL SDL_Quit(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_H */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_active.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_active.h new file mode 100644 index 00000000..cd854e89 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_active.h @@ -0,0 +1,63 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_active.h + * Include file for SDL application focus event handling + */ + +#ifndef _SDL_active_h +#define _SDL_active_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name The available application states */ +/*@{*/ +#define SDL_APPMOUSEFOCUS 0x01 /**< The app has mouse coverage */ +#define SDL_APPINPUTFOCUS 0x02 /**< The app has input focus */ +#define SDL_APPACTIVE 0x04 /**< The application is active */ +/*@}*/ + +/* Function prototypes */ +/** + * This function returns the current state of the application, which is a + * bitwise combination of SDL_APPMOUSEFOCUS, SDL_APPINPUTFOCUS, and + * SDL_APPACTIVE. If SDL_APPACTIVE is set, then the user is able to + * see your application, otherwise it has been iconified or disabled. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetAppState(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_active_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_audio.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_audio.h new file mode 100644 index 00000000..e879c989 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_audio.h @@ -0,0 +1,284 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_audio.h + * Access to the raw audio mixing buffer for the SDL library + */ + +#ifndef _SDL_audio_h +#define _SDL_audio_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_endian.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * When filling in the desired audio spec structure, + * - 'desired->freq' should be the desired audio frequency in samples-per-second. + * - 'desired->format' should be the desired audio format. + * - 'desired->samples' is the desired size of the audio buffer, in samples. + * This number should be a power of two, and may be adjusted by the audio + * driver to a value more suitable for the hardware. Good values seem to + * range between 512 and 8096 inclusive, depending on the application and + * CPU speed. Smaller values yield faster response time, but can lead + * to underflow if the application is doing heavy processing and cannot + * fill the audio buffer in time. A stereo sample consists of both right + * and left channels in LR ordering. + * Note that the number of samples is directly related to time by the + * following formula: ms = (samples*1000)/freq + * - 'desired->size' is the size in bytes of the audio buffer, and is + * calculated by SDL_OpenAudio(). + * - 'desired->silence' is the value used to set the buffer to silence, + * and is calculated by SDL_OpenAudio(). + * - 'desired->callback' should be set to a function that will be called + * when the audio device is ready for more data. It is passed a pointer + * to the audio buffer, and the length in bytes of the audio buffer. + * This function usually runs in a separate thread, and so you should + * protect data structures that it accesses by calling SDL_LockAudio() + * and SDL_UnlockAudio() in your code. + * - 'desired->userdata' is passed as the first parameter to your callback + * function. + * + * @note The calculated values in this structure are calculated by SDL_OpenAudio() + * + */ +typedef struct SDL_AudioSpec { + int freq; /**< DSP frequency -- samples per second */ + Uint16 format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in samples (power of 2) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + /** + * This function is called when the audio device needs more data. + * + * @param[out] stream A pointer to the audio data buffer + * @param[in] len The length of the audio buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + */ + void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); + void *userdata; +} SDL_AudioSpec; + +/** + * @name Audio format flags + * defaults to LSB byte order + */ +/*@{*/ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB + +/** + * @name Native audio byte ordering + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#endif +/*@}*/ + +/*@}*/ + + +/** A structure to hold a set of audio conversion filters and buffers */ +typedef struct SDL_AudioCVT { + int needed; /**< Set to 1 if conversion possible */ + Uint16 src_format; /**< Source audio format */ + Uint16 dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + void (SDLCALL *filters[10])(struct SDL_AudioCVT *cvt, Uint16 format); + int filter_index; /**< Current audio conversion function */ +} SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * @name Audio Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the audio driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * current audio driver, and returns a pointer to it if the audio driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); + +/** + * This function opens the audio device with the desired parameters, and + * returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio + * data passed to the callback function will be guaranteed to be in the + * requested format, and will be automatically converted to the hardware + * audio format if necessary. This function returns -1 if it failed + * to open the audio device, or couldn't set up the audio thread. + * + * The audio device starts out playing silence when it's opened, and should + * be enabled for playing by calling SDL_PauseAudio(0) when you are ready + * for your audio callback function to be called. Since the audio driver + * may modify the requested size of the audio buffer, you should allocate + * any local mixing buffers after you open the audio device. + * + * @sa SDL_AudioSpec + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); + +typedef enum { + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_audiostatus; + +/** Get the current audio state */ +extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); + +/** + * This function pauses and unpauses the audio callback processing. + * It should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); + +/** + * This function loads a WAVE from the data source, automatically freeing + * that source if 'freesrc' is non-zero. For example, to load a WAVE file, + * you could do: + * @code SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); @endcode + * + * If this function succeeds, it returns the given SDL_AudioSpec, + * filled with the audio data format of the wave data, and sets + * 'audio_buf' to a malloc()'d buffer containing the audio data, + * and sets 'audio_len' to the length of that audio buffer, in bytes. + * You need to free the audio buffer with SDL_FreeWAV() when you are + * done with it. + * + * This function returns NULL and sets the SDL error message if the + * wave file cannot be opened, uses an unknown data format, or is + * corrupt. Currently raw and MS-ADPCM WAVE files are supported. + */ +extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); + +/** Compatibility convenience function -- loads a WAV from a file */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * This function frees data previously allocated with SDL_LoadWAV_RW() + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 *audio_buf); + +/** + * This function takes a source format and rate and a destination format + * and rate, and initializes the 'cvt' structure with information needed + * by SDL_ConvertAudio() to convert a buffer of audio data from one format + * to the other. + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, + Uint16 src_format, Uint8 src_channels, int src_rate, + Uint16 dst_format, Uint8 dst_channels, int dst_rate); + +/** + * Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), + * created an audio buffer cvt->buf, and filled it with cvt->len bytes of + * audio data in the source format, this function will convert it in-place + * to the desired format. + * The data conversion may expand the size of the audio data, so the buffer + * cvt->buf should be allocated after the cvt structure is initialized by + * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt); + + +#define SDL_MIX_MAXVOLUME 128 +/** + * This takes two audio buffers of the playing audio format and mixes + * them, performing addition, volume adjustment, and overflow clipping. + * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume. Note this does not change hardware volume. + * This is provided for convenience -- you can mix your own audio data. + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume); + +/** + * @name Audio Locks + * The lock manipulated by these functions protects the callback function. + * During a LockAudio/UnlockAudio pair, you can be guaranteed that the + * callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); +/*@}*/ + +/** + * This function shuts down audio processing and closes the audio device. + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_audio_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_byteorder.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_byteorder.h new file mode 100644 index 00000000..47332c3d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_byteorder.h @@ -0,0 +1,29 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_byteorder.h + * @deprecated Use SDL_endian.h instead + */ + +/* DEPRECATED */ +#include "SDL_endian.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cdrom.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cdrom.h new file mode 100644 index 00000000..febb19dc --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cdrom.h @@ -0,0 +1,202 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cdrom.h + * This is the CD-audio control API for Simple DirectMedia Layer + */ + +#ifndef _SDL_cdrom_h +#define _SDL_cdrom_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file SDL_cdrom.h + * In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_CDROM flag. This causes SDL to scan the system + * for CD-ROM drives, and load appropriate drivers. + */ + +/** The maximum number of CD-ROM tracks on a disk */ +#define SDL_MAX_TRACKS 99 + +/** @name Track Types + * The types of CD-ROM track possible + */ +/*@{*/ +#define SDL_AUDIO_TRACK 0x00 +#define SDL_DATA_TRACK 0x04 +/*@}*/ + +/** The possible states which a CD-ROM drive can be in. */ +typedef enum { + CD_TRAYEMPTY, + CD_STOPPED, + CD_PLAYING, + CD_PAUSED, + CD_ERROR = -1 +} CDstatus; + +/** Given a status, returns true if there's a disk in the drive */ +#define CD_INDRIVE(status) ((int)(status) > 0) + +typedef struct SDL_CDtrack { + Uint8 id; /**< Track number */ + Uint8 type; /**< Data or audio track */ + Uint16 unused; + Uint32 length; /**< Length, in frames, of this track */ + Uint32 offset; /**< Offset, in frames, from start of disk */ +} SDL_CDtrack; + +/** This structure is only current as of the last call to SDL_CDStatus() */ +typedef struct SDL_CD { + int id; /**< Private drive identifier */ + CDstatus status; /**< Current drive status */ + + /** The rest of this structure is only valid if there's a CD in drive */ + /*@{*/ + int numtracks; /**< Number of tracks on disk */ + int cur_track; /**< Current track position */ + int cur_frame; /**< Current frame offset within current track */ + SDL_CDtrack track[SDL_MAX_TRACKS+1]; + /*@}*/ +} SDL_CD; + +/** @name Frames / MSF Conversion Functions + * Conversion functions from frames to Minute/Second/Frames and vice versa + */ +/*@{*/ +#define CD_FPS 75 +#define FRAMES_TO_MSF(f, M,S,F) { \ + int value = f; \ + *(F) = value%CD_FPS; \ + value /= CD_FPS; \ + *(S) = value%60; \ + value /= 60; \ + *(M) = value; \ +} +#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) +/*@}*/ + +/* CD-audio API functions: */ + +/** + * Returns the number of CD-ROM drives on the system, or -1 if + * SDL_Init() has not been called with the SDL_INIT_CDROM flag. + */ +extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); + +/** + * Returns a human-readable, system-dependent identifier for the CD-ROM. + * Example: + * - "/dev/cdrom" + * - "E:" + * - "/dev/disk/ide/1/master" + */ +extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); + +/** + * Opens a CD-ROM drive for access. It returns a drive handle on success, + * or NULL if the drive was invalid or busy. This newly opened CD-ROM + * becomes the default CD used when other CD functions are passed a NULL + * CD-ROM handle. + * Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. + */ +extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); + +/** + * This function returns the current status of the given drive. + * If the drive has a CD in it, the table of contents of the CD and current + * play position of the CD will be stored in the SDL_CD structure. + */ +extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); + +/** + * Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' + * tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play + * until the end of the CD. This function will skip data tracks. + * This function should only be called after calling SDL_CDStatus() to + * get track information about the CD. + * For example: + * @code + * // Play entire CD: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); + * // Play last track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { + * SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); + * } + * // Play first and second track and 10 seconds of third track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); + * @endcode + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, + int start_track, int start_frame, int ntracks, int nframes); + +/** + * Play the given CD starting at 'start' frame for 'length' frames. + * @return It returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); + +/** Pause play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); + +/** Resume play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); + +/** Stop play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); + +/** Eject CD-ROM + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); + +/** Closes the handle for the CD-ROM drive */ +extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config.h new file mode 100644 index 00000000..09ba38a7 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config.h @@ -0,0 +1,45 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_h +#define _SDL_config_h + +#include "SDL_platform.h" + +/* Add any platform that doesn't build using the configure system */ +#if defined(__DREAMCAST__) +#include "SDL_config_dreamcast.h" +#elif defined(__MACOS__) +#include "SDL_config_macos.h" +#elif defined(__MACOSX__) +#include "SDL_config_macosx.h" +#elif defined(__SYMBIAN32__) +#include "SDL_config_symbian.h" /* must be before win32! */ +#elif defined(__WIN32__) +#include "SDL_config_win32.h" +#elif defined(__OS2__) +#include "SDL_config_os2.h" +#else +#include "SDL_config_minimal.h" +#endif /* platform config */ + +#endif /* _SDL_config_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config_win32.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config_win32.h new file mode 100644 index 00000000..da2c15dd --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_config_win32.h @@ -0,0 +1,183 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_win32_h +#define _SDL_config_win32_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#if defined(__GNUC__) || defined(__DMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#define SDL_HAS_64BIT_TYPE 1 + +/* Enabled for SDL 1.2 (binary compatibility) */ +#define HAVE_LIBC 1 +#ifdef HAVE_LIBC +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#ifndef _WIN32_WCE +#define HAVE_SIGNAL_H 1 +#endif + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE__LTOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_SSCANF 1 +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#ifndef _WIN32_WCE +#define SDL_AUDIO_DRIVER_DSOUND 1 +#endif +#define SDL_AUDIO_DRIVER_WAVEOUT 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#ifdef _WIN32_WCE +#define SDL_CDROM_DISABLED 1 +#else +#define SDL_CDROM_WIN32 1 +#endif + +/* Enable various input drivers */ +#ifdef _WIN32_WCE +#define SDL_JOYSTICK_DISABLED 1 +#else +#define SDL_JOYSTICK_WINMM 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WIN32 1 + +/* Enable various threading systems */ +#define SDL_THREAD_WIN32 1 + +/* Enable various timer systems */ +#ifdef _WIN32_WCE +#define SDL_TIMER_WINCE 1 +#else +#define SDL_TIMER_WIN32 1 +#endif + +/* Enable various video drivers */ +#ifdef _WIN32_WCE +#define SDL_VIDEO_DRIVER_GAPI 1 +#endif +#ifndef _WIN32_WCE +#define SDL_VIDEO_DRIVER_DDRAW 1 +#endif +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDIB 1 + +/* Enable OpenGL support */ +#ifndef _WIN32_WCE +#define SDL_VIDEO_OPENGL 1 +#define SDL_VIDEO_OPENGL_WGL 1 +#endif + +/* Disable screensaver */ +#define SDL_VIDEO_DISABLE_SCREENSAVER 1 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* _SDL_config_win32_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_copying.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_copying.h new file mode 100644 index 00000000..1bd6b84c --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_copying.h @@ -0,0 +1,22 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cpuinfo.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cpuinfo.h new file mode 100644 index 00000000..4200d6d1 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_cpuinfo.h @@ -0,0 +1,69 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cpuinfo.h + * CPU feature detection for SDL + */ + +#ifndef _SDL_cpuinfo_h +#define _SDL_cpuinfo_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This function returns true if the CPU has the RDTSC instruction */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** This function returns true if the CPU has MMX features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** This function returns true if the CPU has MMX Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); + +/** This function returns true if the CPU has 3DNow features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** This function returns true if the CPU has 3DNow! Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); + +/** This function returns true if the CPU has SSE features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** This function returns true if the CPU has SSE2 features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** This function returns true if the CPU has AltiVec features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_cpuinfo_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_endian.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_endian.h new file mode 100644 index 00000000..fd9fc867 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_endian.h @@ -0,0 +1,214 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_endian.h + * Functions for reading and writing endian-specific values + */ + +#ifndef _SDL_endian_h +#define _SDL_endian_h + +#include "SDL_stdinc.h" + +/** @name SDL_ENDIANs + * The two types of endianness + */ +/*@{*/ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/*@}*/ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#else /* __linux __ */ +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux __ */ +#endif /* !SDL_BYTEORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name SDL_Swap Functions + * Use inline functions for compilers that support them, and static + * functions for those that do not. Because these functions become + * static for compilers that do not support inline functions, this + * header should only be included in files that actually use them. + */ +/*@{*/ +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + Uint16 result; + + __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint16 SDL_Swap16(Uint16 x) { + return SDL_static_cast(Uint16, ((x<<8)|(x>>8))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); + __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); + __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint32 SDL_Swap32(Uint32 x) { + return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24))); +} +#endif + +#ifdef SDL_HAS_64BIT_TYPE +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + union { + struct { Uint32 a,b; } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" + : "=r" (v.s.a), "=r" (v.s.b) + : "0" (v.s.a), "1" (v.s.b)); + return v.u; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0" : "=r" (x) : "0" (x)); + return x; +} +#else +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif +#else +/* This is mainly to keep compilers from complaining in SDL code. + * If there is no real 64-bit datatype, then compilers will complain about + * the fake 64-bit datatype that SDL provides when it compiles user code. + */ +#define SDL_Swap64(X) (X) +#endif /* SDL_HAS_64BIT_TYPE */ +/*@}*/ + +/** + * @name SDL_SwapLE and SDL_SwapBE Functions + * Byteswap item from the specified endianness to the native endianness + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#endif +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_endian_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_error.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_error.h new file mode 100644 index 00000000..4e1cce3b --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_error.h @@ -0,0 +1,72 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_error.h + * Simple error message routines for SDL + */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name Public functions + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC char * SDLCALL SDL_GetError(void); +extern DECLSPEC void SDLCALL SDL_ClearError(void); +/*@}*/ + +/** + * @name Private functions + * @internal Private error message function - used internally + */ +/*@{*/ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +typedef enum { + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_events.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_events.h new file mode 100644 index 00000000..94b42025 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_events.h @@ -0,0 +1,356 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_events.h + * Include file for SDL event handling + */ + +#ifndef _SDL_events_h +#define _SDL_events_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_active.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_quit.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name General keyboard/mouse state definitions */ +/*@{*/ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 +/*@}*/ + +/** Event enumerations */ +typedef enum { + SDL_NOEVENT = 0, /**< Unused (do not remove) */ + SDL_ACTIVEEVENT, /**< Application loses/gains visibility */ + SDL_KEYDOWN, /**< Keys pressed */ + SDL_KEYUP, /**< Keys released */ + SDL_MOUSEMOTION, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_JOYAXISMOTION, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_QUIT, /**< User-requested quit */ + SDL_SYSWMEVENT, /**< System specific event */ + SDL_EVENT_RESERVEDA, /**< Reserved for future use.. */ + SDL_EVENT_RESERVEDB, /**< Reserved for future use.. */ + SDL_VIDEORESIZE, /**< User resized video mode */ + SDL_VIDEOEXPOSE, /**< Screen needs to be redrawn */ + SDL_EVENT_RESERVED2, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED3, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED4, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED5, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED6, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED7, /**< Reserved for future use.. */ + /** Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ + SDL_USEREVENT = 24, + /** This last event is only for bounding internal arrays + * It is the number of bits in the event mask datatype -- Uint32 + */ + SDL_NUMEVENTS = 32 +} SDL_EventType; + +/** @name Predefined event masks */ +/*@{*/ +#define SDL_EVENTMASK(X) (1<<(X)) +typedef enum { + SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), + SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), + SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), + SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| + SDL_EVENTMASK(SDL_KEYUP), + SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), + SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), + SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| + SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| + SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), + SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), + SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), + SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), + SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| + SDL_EVENTMASK(SDL_JOYBALLMOTION)| + SDL_EVENTMASK(SDL_JOYHATMOTION)| + SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| + SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), + SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), + SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), + SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) +} SDL_EventMask ; +#define SDL_ALLEVENTS 0xFFFFFFFF +/*@}*/ + +/** Application visibility event structure */ +typedef struct SDL_ActiveEvent { + Uint8 type; /**< SDL_ACTIVEEVENT */ + Uint8 gain; /**< Whether given states were gained or lost (1/0) */ + Uint8 state; /**< A mask of the focus states */ +} SDL_ActiveEvent; + +/** Keyboard event structure */ +typedef struct SDL_KeyboardEvent { + Uint8 type; /**< SDL_KEYDOWN or SDL_KEYUP */ + Uint8 which; /**< The keyboard device index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + SDL_keysym keysym; +} SDL_KeyboardEvent; + +/** Mouse motion event structure */ +typedef struct SDL_MouseMotionEvent { + Uint8 type; /**< SDL_MOUSEMOTION */ + Uint8 which; /**< The mouse device index */ + Uint8 state; /**< The current button state */ + Uint16 x, y; /**< The X/Y coordinates of the mouse */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** Mouse button event structure */ +typedef struct SDL_MouseButtonEvent { + Uint8 type; /**< SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ + Uint8 which; /**< The mouse device index */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + Uint16 x, y; /**< The X/Y coordinates of the mouse at press time */ +} SDL_MouseButtonEvent; + +/** Joystick axis motion event structure */ +typedef struct SDL_JoyAxisEvent { + Uint8 type; /**< SDL_JOYAXISMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 axis; /**< The joystick axis index */ + Sint16 value; /**< The axis value (range: -32768 to 32767) */ +} SDL_JoyAxisEvent; + +/** Joystick trackball motion event structure */ +typedef struct SDL_JoyBallEvent { + Uint8 type; /**< SDL_JOYBALLMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 ball; /**< The joystick trackball index */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** Joystick hat position change event structure */ +typedef struct SDL_JoyHatEvent { + Uint8 type; /**< SDL_JOYHATMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value: + * SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP + * SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT + * SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN + * Note that zero means the POV is centered. + */ +} SDL_JoyHatEvent; + +/** Joystick button event structure */ +typedef struct SDL_JoyButtonEvent { + Uint8 type; /**< SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ + Uint8 which; /**< The joystick device index */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ +} SDL_JoyButtonEvent; + +/** The "window resized" event + * When you get this event, you are responsible for setting a new video + * mode with the new width and height. + */ +typedef struct SDL_ResizeEvent { + Uint8 type; /**< SDL_VIDEORESIZE */ + int w; /**< New width */ + int h; /**< New height */ +} SDL_ResizeEvent; + +/** The "screen redraw" event */ +typedef struct SDL_ExposeEvent { + Uint8 type; /**< SDL_VIDEOEXPOSE */ +} SDL_ExposeEvent; + +/** The "quit requested" event */ +typedef struct SDL_QuitEvent { + Uint8 type; /**< SDL_QUIT */ +} SDL_QuitEvent; + +/** A user-defined event type */ +typedef struct SDL_UserEvent { + Uint8 type; /**< SDL_USEREVENT through SDL_NUMEVENTS-1 */ + int code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + +/** If you want to use this event, you should include SDL_syswm.h */ +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; +typedef struct SDL_SysWMEvent { + Uint8 type; + SDL_SysWMmsg *msg; +} SDL_SysWMEvent; + +/** General event structure */ +typedef union SDL_Event { + Uint8 type; + SDL_ActiveEvent active; + SDL_KeyboardEvent key; + SDL_MouseMotionEvent motion; + SDL_MouseButtonEvent button; + SDL_JoyAxisEvent jaxis; + SDL_JoyBallEvent jball; + SDL_JoyHatEvent jhat; + SDL_JoyButtonEvent jbutton; + SDL_ResizeEvent resize; + SDL_ExposeEvent expose; + SDL_QuitEvent quit; + SDL_UserEvent user; + SDL_SysWMEvent syswm; +} SDL_Event; + + +/* Function prototypes */ + +/** Pumps the event loop, gathering events from the input devices. + * This function updates the event queue and internal input device state. + * This should only be run in the thread that sets the video mode. + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +typedef enum { + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Checks the event queue for messages and optionally returns them. + * + * If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to + * the back of the event queue. + * If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will not + * be removed from the queue. + * If 'action' is SDL_GETEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will be + * removed from the queue. + * + * @return + * This function returns the number of events actually stored, or -1 + * if there was an error. + * + * This function is thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, + SDL_eventaction action, Uint32 mask); + +/** Polls for currently pending events, and returns 1 if there are any pending + * events, or 0 if there are none available. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); + +/** Waits indefinitely for the next available event, returning 1, or 0 if there + * was an error while waiting for events. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); + +/** Add an event to the event queue. + * This function returns 0 on success, or -1 if the event queue was full + * or there was some other error. + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); + +/** @name Event Filtering */ +/*@{*/ +typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); +/** + * This function sets up a filter to process all events before they + * change internal state and are posted to the internal event queue. + * + * The filter is protypted as: + * @code typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); @endcode + * + * If the filter returns 1, then the event will be added to the internal queue. + * If it returns 0, then the event will be dropped from the queue, but the + * internal state will still be updated. This allows selective filtering of + * dynamically arriving events. + * + * @warning Be very careful of what you do in the event filter function, as + * it may run in a different thread! + * + * There is one caveat when dealing with the SDL_QUITEVENT event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will + * be closed, otherwise the window will remain open if possible. + * If the quit event is generated by an interrupt signal, it will bypass the + * internal queue and be delivered to the application at the next event poll. + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); + +/** + * Return the current event filter - can be used to "chain" filters. + * If there is no event filter set, this function returns NULL. + */ +extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); +/*@}*/ + +/** @name Event State */ +/*@{*/ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 +/*@}*/ + +/** +* This function allows you to set the state of processing certain events. +* If 'state' is set to SDL_IGNORE, that event will be automatically dropped +* from the event queue and will not event be filtered. +* If 'state' is set to SDL_ENABLE, that event will be processed normally. +* If 'state' is set to SDL_QUERY, SDL_EventState() will return the +* current processing state of the specified event. +*/ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_events_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_getenv.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_getenv.h new file mode 100644 index 00000000..bea63007 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_getenv.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_getenv.h + * @deprecated Use SDL_stdinc.h instead + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_joystick.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_joystick.h new file mode 100644 index 00000000..708d1a9f --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_joystick.h @@ -0,0 +1,187 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_joystick.h + * Include file for SDL joystick event handling + */ + +#ifndef _SDL_joystick_h +#define _SDL_joystick_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_joystick.h + * @note In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + */ + +/** The joystick structure used to identify an SDL joystick */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* Function prototypes */ +/** + * Count the number of joysticks attached to the system + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char * SDLCALL SDL_JoystickName(int device_index); + +/** + * Open a joystick for use. + * + * @param[in] device_index + * The index passed as an argument refers to + * the N'th joystick on the system. This index is the value which will + * identify this joystick in future joystick events. + * + * @return This function returns a joystick identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_Joystick * SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Returns 1 if the joystick has been opened, or 0 if it has not. + */ +extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); + +/** + * Get the device index of an opened joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick *joystick); + +/** + * Get the number of general axis controls on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); + +/** + * Get the number of trackballs on a joystick + * + * Joystick trackballs have only relative motion events associated + * with them and their state cannot be polled. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); + +/** + * Get the number of POV hats on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); + +/** + * Get the number of buttons on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and check the state of the joystick when you want joystick + * information. + * + * @param[in] state The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +/** + * Get the current state of an axis control on a joystick + * + * @param[in] axis The axis indices start at index 0. + * + * @return The state is a value ranging from -32768 to 32767. + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); + +/** + * @name Hat Positions + * The return value of SDL_JoystickGetHat() is one of the following positions: + */ +/*@{*/ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/*@}*/ + +/** + * Get the current state of a POV hat on a joystick + * + * @param[in] hat The hat indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); + +/** + * Get the ball axis change since the last poll + * + * @param[in] ball The ball indices start at index 0. + * + * @return This returns 0, or -1 if you passed it invalid parameters. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick + * + * @param[in] button The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, int button); + +/** + * Close a joystick previously opened with SDL_JoystickOpen() + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_joystick_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keyboard.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keyboard.h new file mode 100644 index 00000000..9d7129c5 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keyboard.h @@ -0,0 +1,135 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_keyboard.h + * Include file for SDL keyboard event handling + */ + +#ifndef _SDL_keyboard_h +#define _SDL_keyboard_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keysym.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Keysym structure + * + * - The scancode is hardware dependent, and should not be used by general + * applications. If no hardware scancode is available, it will be 0. + * + * - The 'unicode' translated character is only available when character + * translation is enabled by the SDL_EnableUNICODE() API. If non-zero, + * this is a UNICODE character corresponding to the keypress. If the + * high 9 bits of the character are 0, then this maps to the equivalent + * ASCII character: + * @code + * char ch; + * if ( (keysym.unicode & 0xFF80) == 0 ) { + * ch = keysym.unicode & 0x7F; + * } else { + * An international character.. + * } + * @endcode + */ +typedef struct SDL_keysym { + Uint8 scancode; /**< hardware specific scancode */ + SDLKey sym; /**< SDL virtual keysym */ + SDLMod mod; /**< current key modifiers */ + Uint16 unicode; /**< translated character */ +} SDL_keysym; + +/** This is the mask which refers to all hotkey bindings */ +#define SDL_ALL_HOTKEYS 0xFFFFFFFF + +/* Function prototypes */ +/** + * Enable/Disable UNICODE translation of keyboard input. + * + * This translation has some overhead, so translation defaults off. + * + * @param[in] enable + * If 'enable' is 1, translation is enabled. + * If 'enable' is 0, translation is disabled. + * If 'enable' is -1, the translation state is not changed. + * + * @return It returns the previous state of keyboard translation. + */ +extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); + +#define SDL_DEFAULT_REPEAT_DELAY 500 +#define SDL_DEFAULT_REPEAT_INTERVAL 30 +/** + * Enable/Disable keyboard repeat. Keyboard repeat defaults to off. + * + * @param[in] delay + * 'delay' is the initial delay in ms between the time when a key is + * pressed, and keyboard repeat begins. + * + * @param[in] interval + * 'interval' is the time in ms between keyboard repeat events. + * + * If 'delay' is set to 0, keyboard repeat is disabled. + */ +extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); +extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); + +/** + * Get a snapshot of the current state of the keyboard. + * Returns an array of keystates, indexed by the SDLK_* syms. + * Usage: + * @code + * Uint8 *keystate = SDL_GetKeyState(NULL); + * if ( keystate[SDLK_RETURN] ) //... \ is pressed. + * @endcode + */ +extern DECLSPEC Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); + +/** + * Get the current key modifier state + */ +extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); + +/** + * Set the current key modifier state. + * This does not change the keyboard state, only the key modifier flags. + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); + +/** + * Get the name of an SDL virtual keysym + */ +extern DECLSPEC char * SDLCALL SDL_GetKeyName(SDLKey key); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_keyboard_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keysym.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keysym.h new file mode 100644 index 00000000..f2ad12b8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_keysym.h @@ -0,0 +1,326 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_keysym_h +#define _SDL_keysym_h + +/** What we really want is a mapping of every raw key on the keyboard. + * To support international keyboards, we use the range 0xA1 - 0xFF + * as international virtual keycodes. We'll follow in the footsteps of X11... + * @brief The names of the keys + */ +typedef enum { + /** @name ASCII mapped keysyms + * The keyboard syms have been cleverly chosen to map to ASCII + */ + /*@{*/ + SDLK_UNKNOWN = 0, + SDLK_FIRST = 0, + SDLK_BACKSPACE = 8, + SDLK_TAB = 9, + SDLK_CLEAR = 12, + SDLK_RETURN = 13, + SDLK_PAUSE = 19, + SDLK_ESCAPE = 27, + SDLK_SPACE = 32, + SDLK_EXCLAIM = 33, + SDLK_QUOTEDBL = 34, + SDLK_HASH = 35, + SDLK_DOLLAR = 36, + SDLK_AMPERSAND = 38, + SDLK_QUOTE = 39, + SDLK_LEFTPAREN = 40, + SDLK_RIGHTPAREN = 41, + SDLK_ASTERISK = 42, + SDLK_PLUS = 43, + SDLK_COMMA = 44, + SDLK_MINUS = 45, + SDLK_PERIOD = 46, + SDLK_SLASH = 47, + SDLK_0 = 48, + SDLK_1 = 49, + SDLK_2 = 50, + SDLK_3 = 51, + SDLK_4 = 52, + SDLK_5 = 53, + SDLK_6 = 54, + SDLK_7 = 55, + SDLK_8 = 56, + SDLK_9 = 57, + SDLK_COLON = 58, + SDLK_SEMICOLON = 59, + SDLK_LESS = 60, + SDLK_EQUALS = 61, + SDLK_GREATER = 62, + SDLK_QUESTION = 63, + SDLK_AT = 64, + /* + Skip uppercase letters + */ + SDLK_LEFTBRACKET = 91, + SDLK_BACKSLASH = 92, + SDLK_RIGHTBRACKET = 93, + SDLK_CARET = 94, + SDLK_UNDERSCORE = 95, + SDLK_BACKQUOTE = 96, + SDLK_a = 97, + SDLK_b = 98, + SDLK_c = 99, + SDLK_d = 100, + SDLK_e = 101, + SDLK_f = 102, + SDLK_g = 103, + SDLK_h = 104, + SDLK_i = 105, + SDLK_j = 106, + SDLK_k = 107, + SDLK_l = 108, + SDLK_m = 109, + SDLK_n = 110, + SDLK_o = 111, + SDLK_p = 112, + SDLK_q = 113, + SDLK_r = 114, + SDLK_s = 115, + SDLK_t = 116, + SDLK_u = 117, + SDLK_v = 118, + SDLK_w = 119, + SDLK_x = 120, + SDLK_y = 121, + SDLK_z = 122, + SDLK_DELETE = 127, + /* End of ASCII mapped keysyms */ + /*@}*/ + + /** @name International keyboard syms */ + /*@{*/ + SDLK_WORLD_0 = 160, /* 0xA0 */ + SDLK_WORLD_1 = 161, + SDLK_WORLD_2 = 162, + SDLK_WORLD_3 = 163, + SDLK_WORLD_4 = 164, + SDLK_WORLD_5 = 165, + SDLK_WORLD_6 = 166, + SDLK_WORLD_7 = 167, + SDLK_WORLD_8 = 168, + SDLK_WORLD_9 = 169, + SDLK_WORLD_10 = 170, + SDLK_WORLD_11 = 171, + SDLK_WORLD_12 = 172, + SDLK_WORLD_13 = 173, + SDLK_WORLD_14 = 174, + SDLK_WORLD_15 = 175, + SDLK_WORLD_16 = 176, + SDLK_WORLD_17 = 177, + SDLK_WORLD_18 = 178, + SDLK_WORLD_19 = 179, + SDLK_WORLD_20 = 180, + SDLK_WORLD_21 = 181, + SDLK_WORLD_22 = 182, + SDLK_WORLD_23 = 183, + SDLK_WORLD_24 = 184, + SDLK_WORLD_25 = 185, + SDLK_WORLD_26 = 186, + SDLK_WORLD_27 = 187, + SDLK_WORLD_28 = 188, + SDLK_WORLD_29 = 189, + SDLK_WORLD_30 = 190, + SDLK_WORLD_31 = 191, + SDLK_WORLD_32 = 192, + SDLK_WORLD_33 = 193, + SDLK_WORLD_34 = 194, + SDLK_WORLD_35 = 195, + SDLK_WORLD_36 = 196, + SDLK_WORLD_37 = 197, + SDLK_WORLD_38 = 198, + SDLK_WORLD_39 = 199, + SDLK_WORLD_40 = 200, + SDLK_WORLD_41 = 201, + SDLK_WORLD_42 = 202, + SDLK_WORLD_43 = 203, + SDLK_WORLD_44 = 204, + SDLK_WORLD_45 = 205, + SDLK_WORLD_46 = 206, + SDLK_WORLD_47 = 207, + SDLK_WORLD_48 = 208, + SDLK_WORLD_49 = 209, + SDLK_WORLD_50 = 210, + SDLK_WORLD_51 = 211, + SDLK_WORLD_52 = 212, + SDLK_WORLD_53 = 213, + SDLK_WORLD_54 = 214, + SDLK_WORLD_55 = 215, + SDLK_WORLD_56 = 216, + SDLK_WORLD_57 = 217, + SDLK_WORLD_58 = 218, + SDLK_WORLD_59 = 219, + SDLK_WORLD_60 = 220, + SDLK_WORLD_61 = 221, + SDLK_WORLD_62 = 222, + SDLK_WORLD_63 = 223, + SDLK_WORLD_64 = 224, + SDLK_WORLD_65 = 225, + SDLK_WORLD_66 = 226, + SDLK_WORLD_67 = 227, + SDLK_WORLD_68 = 228, + SDLK_WORLD_69 = 229, + SDLK_WORLD_70 = 230, + SDLK_WORLD_71 = 231, + SDLK_WORLD_72 = 232, + SDLK_WORLD_73 = 233, + SDLK_WORLD_74 = 234, + SDLK_WORLD_75 = 235, + SDLK_WORLD_76 = 236, + SDLK_WORLD_77 = 237, + SDLK_WORLD_78 = 238, + SDLK_WORLD_79 = 239, + SDLK_WORLD_80 = 240, + SDLK_WORLD_81 = 241, + SDLK_WORLD_82 = 242, + SDLK_WORLD_83 = 243, + SDLK_WORLD_84 = 244, + SDLK_WORLD_85 = 245, + SDLK_WORLD_86 = 246, + SDLK_WORLD_87 = 247, + SDLK_WORLD_88 = 248, + SDLK_WORLD_89 = 249, + SDLK_WORLD_90 = 250, + SDLK_WORLD_91 = 251, + SDLK_WORLD_92 = 252, + SDLK_WORLD_93 = 253, + SDLK_WORLD_94 = 254, + SDLK_WORLD_95 = 255, /* 0xFF */ + /*@}*/ + + /** @name Numeric keypad */ + /*@{*/ + SDLK_KP0 = 256, + SDLK_KP1 = 257, + SDLK_KP2 = 258, + SDLK_KP3 = 259, + SDLK_KP4 = 260, + SDLK_KP5 = 261, + SDLK_KP6 = 262, + SDLK_KP7 = 263, + SDLK_KP8 = 264, + SDLK_KP9 = 265, + SDLK_KP_PERIOD = 266, + SDLK_KP_DIVIDE = 267, + SDLK_KP_MULTIPLY = 268, + SDLK_KP_MINUS = 269, + SDLK_KP_PLUS = 270, + SDLK_KP_ENTER = 271, + SDLK_KP_EQUALS = 272, + /*@}*/ + + /** @name Arrows + Home/End pad */ + /*@{*/ + SDLK_UP = 273, + SDLK_DOWN = 274, + SDLK_RIGHT = 275, + SDLK_LEFT = 276, + SDLK_INSERT = 277, + SDLK_HOME = 278, + SDLK_END = 279, + SDLK_PAGEUP = 280, + SDLK_PAGEDOWN = 281, + /*@}*/ + + /** @name Function keys */ + /*@{*/ + SDLK_F1 = 282, + SDLK_F2 = 283, + SDLK_F3 = 284, + SDLK_F4 = 285, + SDLK_F5 = 286, + SDLK_F6 = 287, + SDLK_F7 = 288, + SDLK_F8 = 289, + SDLK_F9 = 290, + SDLK_F10 = 291, + SDLK_F11 = 292, + SDLK_F12 = 293, + SDLK_F13 = 294, + SDLK_F14 = 295, + SDLK_F15 = 296, + /*@}*/ + + /** @name Key state modifier keys */ + /*@{*/ + SDLK_NUMLOCK = 300, + SDLK_CAPSLOCK = 301, + SDLK_SCROLLOCK = 302, + SDLK_RSHIFT = 303, + SDLK_LSHIFT = 304, + SDLK_RCTRL = 305, + SDLK_LCTRL = 306, + SDLK_RALT = 307, + SDLK_LALT = 308, + SDLK_RMETA = 309, + SDLK_LMETA = 310, + SDLK_LSUPER = 311, /**< Left "Windows" key */ + SDLK_RSUPER = 312, /**< Right "Windows" key */ + SDLK_MODE = 313, /**< "Alt Gr" key */ + SDLK_COMPOSE = 314, /**< Multi-key compose key */ + /*@}*/ + + /** @name Miscellaneous function keys */ + /*@{*/ + SDLK_HELP = 315, + SDLK_PRINT = 316, + SDLK_SYSREQ = 317, + SDLK_BREAK = 318, + SDLK_MENU = 319, + SDLK_POWER = 320, /**< Power Macintosh power key */ + SDLK_EURO = 321, /**< Some european keyboards */ + SDLK_UNDO = 322, /**< Atari keyboard has Undo */ + /*@}*/ + + /* Add any other keys here */ + + SDLK_LAST +} SDLKey; + +/** Enumeration of valid key mods (possibly OR'd together) */ +typedef enum { + KMOD_NONE = 0x0000, + KMOD_LSHIFT= 0x0001, + KMOD_RSHIFT= 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LMETA = 0x0400, + KMOD_RMETA = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDLMod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_META (KMOD_LMETA|KMOD_RMETA) + +#endif /* _SDL_keysym_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_loadso.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_loadso.h new file mode 100644 index 00000000..0c5e5362 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_loadso.h @@ -0,0 +1,78 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_loadso.h + * System dependent library loading routines + */ + +/** @file SDL_loadso.h + * Some things to keep in mind: + * - These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * - Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * - Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + + +#ifndef _SDL_loadso_h +#define _SDL_loadso_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This function dynamically loads a shared object and returns a pointer + * to the object handle (or NULL if there was an error). + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Given an object handle, this function looks up the address of the + * named function in the shared object and returns it. This address + * is no longer valid after calling SDL_UnloadObject(). + */ +extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); + +/** Unload a shared object from memory */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_loadso_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_main.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_main.h new file mode 100644 index 00000000..ab50ef1e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_main.h @@ -0,0 +1,106 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_main_h +#define _SDL_main_h + +#include "SDL_stdinc.h" + +/** @file SDL_main.h + * Redefine main() on Win32 and MacOS so that it is called by winmain.c + */ + +#if defined(__WIN32__) || \ + (defined(__MWERKS__) && !defined(__BEOS__)) || \ + defined(__MACOS__) || defined(__MACOSX__) || \ + defined(__SYMBIAN32__) || defined(QWS) + +#ifdef __cplusplus +#define C_LINKAGE "C" +#else +#define C_LINKAGE +#endif /* __cplusplus */ + +/** The application's main() function must be called with C linkage, + * and should be declared like this: + * @code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * @endcode + */ +#define main SDL_main + +/** The prototype for the application's main() function */ +extern C_LINKAGE int SDL_main(int argc, char *argv[]); + + +/** @name From the SDL library code -- needed for registering the app on Win32 */ +/*@{*/ +#ifdef __WIN32__ + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** This should be called from your WinMain() function, if any */ +extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); +/** This can also be called, but is no longer necessary */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); +/** This can also be called, but is no longer necessary (SDL_Quit calls it) */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +/** @name From the SDL library code -- needed for registering QuickDraw on MacOS */ +/*@{*/ +#if defined(__MACOS__) + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** Forward declaration so we don't need to include QuickDraw.h */ +struct QDGlobals; + +/** This should be called from your main() function, if any */ +extern DECLSPEC void SDLCALL SDL_InitQuickDraw(struct QDGlobals *the_qd); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +#endif /* Need to redefine main()? */ + +#endif /* _SDL_main_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mouse.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mouse.h new file mode 100644 index 00000000..7c563b94 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mouse.h @@ -0,0 +1,143 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_mouse.h + * Include file for SDL mouse event handling + */ + +#ifndef _SDL_mouse_h +#define _SDL_mouse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct WMcursor WMcursor; /**< Implementation dependent */ +typedef struct SDL_Cursor { + SDL_Rect area; /**< The area of the mouse cursor */ + Sint16 hot_x, hot_y; /**< The "tip" of the cursor */ + Uint8 *data; /**< B/W cursor data */ + Uint8 *mask; /**< B/W cursor mask */ + Uint8 *save[2]; /**< Place to save cursor area */ + WMcursor *wm_cursor; /**< Window-manager cursor */ +} SDL_Cursor; + +/* Function prototypes */ +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * current mouse cursor position. You can pass NULL for either x or y. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState(). + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * Set the position of the mouse cursor (generates a mouse motion event) + */ +extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); + +/** + * Create a cursor using the specified data and mask (in MSB format). + * The cursor width must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * data mask resulting pixel on screen + * 0 1 White + * 1 1 Black + * 0 0 Transparent + * 1 0 Inverted color if possible, black if not. + * + * Cursors created with this function must be freed with SDL_FreeCursor(). + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor + (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); + +/** + * Set the currently active cursor to the specified one. + * If the cursor is currently visible, the change will be immediately + * represented on the display. + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor *cursor); + +/** + * Returns the currently active cursor. + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); + +/** + * Deallocates a cursor created with SDL_CreateCursor(). + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor *cursor); + +/** + * Toggle whether or not the cursor is shown on the screen. + * The cursor start off displayed, but can be turned off. + * SDL_ShowCursor() returns 1 if the cursor was being displayed + * before the call, or 0 if it was not. You can query the current + * state by passing a 'toggle' value of -1. + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/*@{*/ +/** Used as a mask when testing buttons in buttonstate + * Button 1: Left mouse button + * Button 2: Middle mouse button + * Button 3: Right mouse button + * Button 4: Mouse wheel up (may also be a real button) + * Button 5: Mouse wheel down (may also be a real button) + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_WHEELUP 4 +#define SDL_BUTTON_WHEELDOWN 5 +#define SDL_BUTTON_X1 6 +#define SDL_BUTTON_X2 7 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mouse_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mutex.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mutex.h new file mode 100644 index 00000000..c8da9b1a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_mutex.h @@ -0,0 +1,177 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_mutex_h +#define _SDL_mutex_h + +/** @file SDL_mutex.h + * Functions to provide thread synchronization primitives + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** This is the timeout value which corresponds to never time out */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Mutex functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL mutex structure, defined in SDL_mutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** Create a mutex, initialized unlocked */ +extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void); + +#define SDL_LockMutex(m) SDL_mutexP(m) +/** Lock the mutex + * @return 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex); + +#define SDL_UnlockMutex(m) SDL_mutexV(m) +/** Unlock the mutex + * @return 0, or -1 on error + * + * It is an error to unlock a mutex that has not been locked by + * the current thread, and doing so results in undefined behavior. + */ +extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex); + +/** Destroy a mutex */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Semaphore functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL semaphore structure, defined in SDL_sem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** Create a semaphore, initialized with value, returns NULL on failure. */ +extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** Destroy a semaphore */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem); + +/** + * This function suspends the calling thread until the semaphore pointed + * to by sem has a positive count. It then atomically decreases the semaphore + * count. + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem); + +/** Non-blocking variant of SDL_SemWait(). + * @return 0 if the wait succeeds, + * SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem); + +/** Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if + * the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in + * the allotted time, and -1 on error. + * + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms); + +/** Atomically increases the semaphore's count (not blocking). + * @return 0, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem); + +/** Returns the current count of the semaphore */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Condition_variable_functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*@{*/ +/** The SDL condition variable structure, defined in SDL_cond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; +/*@}*/ + +/** Create a condition variable */ +extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void); + +/** Destroy a condition variable */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond); + +/** Restart one of the threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond); + +/** Restart all threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond); + +/** Wait on the condition variable, unlocking the provided mutex. + * The mutex must be locked before entering this function! + * The mutex is re-locked once the condition variable is signaled. + * @return 0 when it is signaled, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); + +/** Waits for at most 'ms' milliseconds, and returns 0 if the condition + * variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not + * signaled in the allotted time, and -1 on error. + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mutex_h */ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_name.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_name.h new file mode 100644 index 00000000..511619af --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_name.h @@ -0,0 +1,11 @@ + +#ifndef _SDLname_h_ +#define _SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* _SDLname_h_ */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_opengl.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_opengl.h new file mode 100644 index 00000000..3d791d69 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_opengl.h @@ -0,0 +1,6570 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_opengl.h + * This is a simple file to encapsulate the OpenGL API headers + */ + +#include "SDL_config.h" + +#ifdef __WIN32__ +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +#define NOMINMAX /* Don't defined min() and max() */ +#endif +#include +#endif +#ifndef NO_SDL_GLEXT +#define __glext_h_ /* Don't let gl.h include glext.h */ +#endif +#if defined(__MACOSX__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#elif defined(__MACOS__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#else +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#endif +#ifndef NO_SDL_GLEXT +#undef __glext_h_ +#endif + +/** @name GLext.h + * This file taken from "GLext.h" from the Jeff Molofee OpenGL tutorials. + * It is included here because glext.h is not available on some systems. + * If you don't want this version included, simply define "NO_SDL_GLEXT" + */ +/*@{*/ +#ifndef NO_SDL_GLEXT +#if !defined(__glext_h_) && !defined(GL_GLEXT_LEGACY) +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2005/06/20 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 29 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; /* native character */ +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptr; +typedef long GLsizeiptr; +#else +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptrARB; +typedef long GLsizeiptrARB; +#else +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and program/shader text */ +typedef char GLcharARB; /* native character */ +#if defined(__APPLE__) +typedef void *GLhandleARB; /* shader object handle */ +#else +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif +#endif + +/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendEquation (GLenum); +GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogram (GLenum); +GLAPI void APIENTRY glResetMinmax (GLenum); +GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum); +GLAPI void APIENTRY glClientActiveTexture (GLenum); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glFogCoordf (GLfloat); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *); +GLAPI void APIENTRY glFogCoordd (GLdouble); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameteri (GLenum, GLint); +GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos2i (GLint, GLint); +GLAPI void APIENTRY glWindowPos2iv (const GLint *); +GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *); +GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3iv (const GLint *); +GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQuery (GLuint); +GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void APIENTRY glEndQuery (GLenum); +GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint); +GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); +GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); +GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); +GLAPI void APIENTRY glAttachShader (GLuint, GLuint); +GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); +GLAPI void APIENTRY glCompileShader (GLuint); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum); +GLAPI void APIENTRY glDeleteProgram (GLuint); +GLAPI void APIENTRY glDeleteShader (GLuint); +GLAPI void APIENTRY glDetachShader (GLuint, GLuint); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); +GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgram (GLuint); +GLAPI GLboolean APIENTRY glIsShader (GLuint); +GLAPI void APIENTRY glLinkProgram (GLuint); +GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); +GLAPI void APIENTRY glUseProgram (GLuint); +GLAPI void APIENTRY glUniform1f (GLint, GLfloat); +GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1i (GLint, GLint); +GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glValidateProgram (GLuint); +GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); +GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); +GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void APIENTRY glEndQueryARB (GLenum); +GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1iARB (GLint, GLint); +GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogramEXT (GLenum); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint); +GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void APIENTRY glDeformSGIX (GLbitfield); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum); +GLAPI void APIENTRY glTextureLightEXT (GLenum); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *); +GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); +GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFinishFenceNV (GLuint); +GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); +GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif +#endif /* NO_SDL_GLEXT */ +/*@}*/ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_platform.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_platform.h new file mode 100644 index 00000000..48540a85 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_platform.h @@ -0,0 +1,110 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_platform.h + * Try to get a standard set of platform defines + */ + +#ifndef _SDL_platform_h +#define _SDL_platform_h + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__BEOS__) +#undef __BEOS__ +#define __BEOS__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(__APPLE__) +#undef __MACOSX__ +#define __MACOSX__ 1 +#elif defined(macintosh) +#undef __MACOS__ +#define __MACOS__ 1 +#endif +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif +#if defined(WIN32) || defined(_WIN32) +#undef __WIN32__ +#define __WIN32__ 1 +#endif + +#endif /* _SDL_platform_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_quit.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_quit.h new file mode 100644 index 00000000..abd2ec6c --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_quit.h @@ -0,0 +1,55 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_quit.h + * Include file for SDL quit event handling + */ + +#ifndef _SDL_quit_h +#define _SDL_quit_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** @file SDL_quit.h + * An SDL_QUITEVENT is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate SDL_QUITEVENT events as well. There is no way + * to determine the cause of an SDL_QUITEVENT, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + */ + +/** @file SDL_quit.h + * There are no functions directly affecting the quit event + */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) + +#endif /* _SDL_quit_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_rwops.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_rwops.h new file mode 100644 index 00000000..98361d7e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_rwops.h @@ -0,0 +1,155 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_rwops.h + * This file provides a general interface for SDL to read and write + * data sources. It can easily be extended to files, memory, etc. + */ + +#ifndef _SDL_rwops_h +#define _SDL_rwops_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the read/write operation structure -- very basic */ + +typedef struct SDL_RWops { + /** Seek to 'offset' relative to whence, one of stdio's whence values: + * SEEK_SET, SEEK_CUR, SEEK_END + * Returns the final offset in the data source. + */ + int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence); + + /** Read up to 'maxnum' objects each of size 'size' from the data + * source to the area pointed at by 'ptr'. + * Returns the number of objects read, or -1 if the read failed. + */ + int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); + + /** Write exactly 'num' objects each of size 'objsize' from the area + * pointed at by 'ptr' to data source. + * Returns 'num', or -1 if the write failed. + */ + int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num); + + /** Close and free an allocated SDL_FSops structure */ + int (SDLCALL *close)(struct SDL_RWops *context); + + Uint32 type; + union { +#if defined(__WIN32__) && !defined(__SYMBIAN32__) + struct { + int append; + void *h; + struct { + void *data; + int size; + int left; + } buffer; + } win32io; +#endif +#ifdef HAVE_STDIO_H + struct { + int autoclose; + FILE *fp; + } stdio; +#endif + struct { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct { + void *data1; + } unknown; + } hidden; + +} SDL_RWops; + + +/** @name Functions to create SDL_RWops structures from various data sources */ +/*@{*/ + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); + +#ifdef HAVE_STDIO_H +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); +#endif + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); + +extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); + +/*@}*/ + +/** @name Seek Reference Points */ +/*@{*/ +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ +/*@}*/ + +/** @name Macros to easily read and write from an SDL_RWops structure */ +/*@{*/ +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) +/*@}*/ + +/** @name Read an item of the specified endianness and return in native format */ +/*@{*/ +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); +/*@}*/ + +/** @name Write an item of native format to the specified endianness */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); +extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rwops_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_stdinc.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_stdinc.h new file mode 100644 index 00000000..35a4fdde --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_stdinc.h @@ -0,0 +1,620 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_stdinc.h + * This is a general header that includes C language support + */ + +#ifndef _SDL_stdinc_h +#define _SDL_stdinc_h + +#include "SDL_config.h" + + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +# include +#endif + +/** The number of elements in an array */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/* Use proper C++ casts when compiled as C++ to be compatible with the option + -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above. */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#endif + +/** @name Basic data types */ +/*@{*/ +typedef enum { + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; + +typedef int8_t Sint8; +typedef uint8_t Uint8; +typedef int16_t Sint16; +typedef uint16_t Uint16; +typedef int32_t Sint32; +typedef uint32_t Uint32; + +#ifdef SDL_HAS_64BIT_TYPE +typedef int64_t Sint64; +#ifndef SYMBIAN32_GCCE +typedef uint64_t Uint64; +#endif +#else +/* This is really just a hack to prevent the compiler from complaining */ +typedef struct { + Uint32 hi; + Uint32 lo; +} Uint64, Sint64; +#endif + +/*@}*/ + +/** @name Make sure the types really have the right sizes */ +/*@{*/ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] + +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +/*@}*/ + +/** @name Enum Size Check + * Check to make sure enums are the size of ints, for structure packing. + * For both Watcom C/C++ and Borland C/C++ the compiler option that makes + * enums having the size of an int must be enabled. + * This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). + */ +/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ +#ifdef __MWERKS__ +#pragma enumsalwaysint on +#endif + +typedef enum { + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +#ifndef __NDS__ +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +/*@}*/ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_MALLOC +#define SDL_malloc malloc +#else +extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); +#endif + +#ifdef HAVE_CALLOC +#define SDL_calloc calloc +#else +extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); +#endif + +#ifdef HAVE_REALLOC +#define SDL_realloc realloc +#else +extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); +#endif + +#ifdef HAVE_FREE +#define SDL_free free +#else +extern DECLSPEC void SDLCALL SDL_free(void *mem); +#endif + +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) + #pragma alloca +# elif defined(__MRC__) + void *alloca (unsigned); +# else + char *alloca (); +# endif +#endif +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +#ifdef HAVE_GETENV +#define SDL_getenv getenv +#else +extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); +#endif + +#ifdef HAVE_PUTENV +#define SDL_putenv putenv +#else +extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); +#endif + +#ifdef HAVE_QSORT +#define SDL_qsort qsort +#else +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, + int (*compare)(const void *, const void *)); +#endif + +#ifdef HAVE_ABS +#define SDL_abs abs +#else +#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) +#endif + +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +#ifdef HAVE_CTYPE_H +#define SDL_isdigit(X) isdigit(X) +#define SDL_isspace(X) isspace(X) +#define SDL_toupper(X) toupper(X) +#define SDL_tolower(X) tolower(X) +#else +#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) +#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) +#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) +#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) +#endif + +#ifdef HAVE_MEMSET +#define SDL_memset memset +#else +extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_memset4(dst, val, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; stosl\n\t" \ + : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memset4 +#define SDL_memset4(dst, val, len) \ +do { \ + unsigned _count = (len); \ + unsigned _n = (_count + 3) / 4; \ + Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ + Uint32 _val = (val); \ + if (len == 0) break; \ + switch (_count % 4) { \ + case 0: do { *_p++ = _val; \ + case 3: *_p++ = _val; \ + case 2: *_p++ = _val; \ + case 1: *_p++ = _val; \ + } while ( --_n ); \ + } \ +} while(0) +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl\n\t" \ + "testb $2,%b4\n\t" \ + "je 1f\n\t" \ + "movsw\n" \ + "1:\ttestb $1,%b4\n\t" \ + "je 2f\n\t" \ + "movsb\n" \ + "2:" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy +#ifdef HAVE_MEMCPY +#define SDL_memcpy memcpy +#elif defined(HAVE_BCOPY) +#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) +#else +extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); +#endif +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy4(dst, src, len) \ +do { \ + int ecx, edi, esi; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl" \ + : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ + : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy4 +#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_revcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + char *dstp = SDL_static_cast(char *, dst); \ + char *srcp = SDL_static_cast(char *, src); \ + int n = (len); \ + if ( n >= 4 ) { \ + __asm__ __volatile__ ( \ + "std\n\t" \ + "rep ; movsl\n\t" \ + "cld\n\t" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (n >> 2), \ + "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ + : "memory" ); \ + } \ + switch (n & 3) { \ + case 3: dstp[2] = srcp[2]; \ + case 2: dstp[1] = srcp[1]; \ + case 1: dstp[0] = srcp[0]; \ + break; \ + default: \ + break; \ + } \ +} while(0) +#endif +#ifndef SDL_revcpy +extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); +#endif + +#ifdef HAVE_MEMMOVE +#define SDL_memmove memmove +#elif defined(HAVE_BCOPY) +#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) +#else +#define SDL_memmove(dst, src, len) \ +do { \ + if ( dst < src ) { \ + SDL_memcpy(dst, src, len); \ + } else { \ + SDL_revcpy(dst, src, len); \ + } \ +} while(0) +#endif + +#ifdef HAVE_MEMCMP +#define SDL_memcmp memcmp +#else +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); +#endif + +#ifdef HAVE_STRLEN +#define SDL_strlen strlen +#else +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); +#endif + +#ifdef HAVE_STRLCPY +#define SDL_strlcpy strlcpy +#else +extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRLCAT +#define SDL_strlcat strlcat +#else +extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRDUP +#define SDL_strdup strdup +#else +extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); +#endif + +#ifdef HAVE__STRREV +#define SDL_strrev _strrev +#else +extern DECLSPEC char * SDLCALL SDL_strrev(char *string); +#endif + +#ifdef HAVE__STRUPR +#define SDL_strupr _strupr +#else +extern DECLSPEC char * SDLCALL SDL_strupr(char *string); +#endif + +#ifdef HAVE__STRLWR +#define SDL_strlwr _strlwr +#else +extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); +#endif + +#ifdef HAVE_STRCHR +#define SDL_strchr strchr +#elif defined(HAVE_INDEX) +#define SDL_strchr index +#else +extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); +#endif + +#ifdef HAVE_STRRCHR +#define SDL_strrchr strrchr +#elif defined(HAVE_RINDEX) +#define SDL_strrchr rindex +#else +extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); +#endif + +#ifdef HAVE_STRSTR +#define SDL_strstr strstr +#else +extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); +#endif + +#ifdef HAVE_ITOA +#define SDL_itoa itoa +#else +#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) +#endif + +#ifdef HAVE__LTOA +#define SDL_ltoa _ltoa +#else +extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); +#endif + +#ifdef HAVE__UITOA +#define SDL_uitoa _uitoa +#else +#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) +#endif + +#ifdef HAVE__ULTOA +#define SDL_ultoa _ultoa +#else +extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOL +#define SDL_strtol strtol +#else +extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOUL +#define SDL_strtoul strtoul +#else +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); +#endif + +#ifdef SDL_HAS_64BIT_TYPE + +#ifdef HAVE__I64TOA +#define SDL_lltoa _i64toa +#else +extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); +#endif + +#ifdef HAVE__UI64TOA +#define SDL_ulltoa _ui64toa +#else +extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOLL +#define SDL_strtoll strtoll +#else +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOULL +#define SDL_strtoull strtoull +#else +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); +#endif + +#endif /* SDL_HAS_64BIT_TYPE */ + +#ifdef HAVE_STRTOD +#define SDL_strtod strtod +#else +extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); +#endif + +#ifdef HAVE_ATOI +#define SDL_atoi atoi +#else +#define SDL_atoi(X) SDL_strtol(X, NULL, 0) +#endif + +#ifdef HAVE_ATOF +#define SDL_atof atof +#else +#define SDL_atof(X) SDL_strtod(X, NULL) +#endif + +#ifdef HAVE_STRCMP +#define SDL_strcmp strcmp +#else +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCMP +#define SDL_strncmp strncmp +#else +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_STRCASECMP +#define SDL_strcasecmp strcasecmp +#elif defined(HAVE__STRICMP) +#define SDL_strcasecmp _stricmp +#else +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCASECMP +#define SDL_strncasecmp strncasecmp +#elif defined(HAVE__STRNICMP) +#define SDL_strncasecmp _strnicmp +#else +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_SSCANF +#define SDL_sscanf sscanf +#else +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +#endif + +#ifdef HAVE_SNPRINTF +#define SDL_snprintf snprintf +#else +extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); +#endif + +#ifdef HAVE_VSNPRINTF +#define SDL_vsnprintf vsnprintf +#else +extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); +#endif + +/** @name SDL_ICONV Error Codes + * The SDL implementation of iconv() returns these error codes + */ +/*@{*/ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 +/*@}*/ + +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +#define SDL_iconv_t iconv_t +#define SDL_iconv_open iconv_open +#define SDL_iconv_close iconv_close +#else +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +#endif +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +/** This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + */ +extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_stdinc_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_syswm.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_syswm.h new file mode 100644 index 00000000..78433c6a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_syswm.h @@ -0,0 +1,226 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_syswm.h + * Include file for SDL custom system window manager hooks + */ + +#ifndef _SDL_syswm_h +#define _SDL_syswm_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_syswm.h + * Your application has access to a special type of event 'SDL_SYSWMEVENT', + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState() + */ +#ifdef SDL_PROTOTYPES_ONLY +struct SDL_SysWMinfo; +typedef struct SDL_SysWMinfo SDL_SysWMinfo; +#else + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +/** These are the various supported subsystems under UNIX */ +typedef enum { + SDL_SYSWM_X11 +} SDL_SYSWM_TYPE; + +/** The UNIX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + XEvent xevent; + } event; +}; + +/** The UNIX custom window manager information structure. + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +typedef struct SDL_SysWMinfo { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + struct { + Display *display; /**< The X11 display */ + Window window; /**< The X11 display window */ + /** These locking functions should be called around + * any X11 functions using the display variable, + * but not the gfxdisplay variable. + * They lock the event thread, so should not be + * called around event functions or from event filters. + */ + /*@{*/ + void (*lock_func)(void); + void (*unlock_func)(void); + /*@}*/ + + /** @name Introduced in SDL 1.0.2 */ + /*@{*/ + Window fswindow; /**< The X11 fullscreen window */ + Window wmwindow; /**< The X11 managed input window */ + /*@}*/ + + /** @name Introduced in SDL 1.2.12 */ + /*@{*/ + Display *gfxdisplay; /**< The X11 display to which rendering is done */ + /*@}*/ + } x11; + } info; +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_NANOX) +#include + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version ; + GR_WINDOW_ID window ; /* The display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || defined(SDL_VIDEO_DRIVER_GAPI) +#define WIN32_LEAN_AND_MEAN +#include + +/** The windows custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + HWND window; /**< The Win32 display window */ + HGLRC hglrc; /**< The OpenGL context, if any */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_RISCOS) + +/** RISC OS custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int eventCode; /**< The window for the message */ + int pollBlock[64]; +}; + +/** The RISC OS custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int wimpVersion; /**< Wimp version running under */ + int taskHandle; /**< The RISC OS task handle */ + int window; /**< The RISC OS display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_PHOTON) +#include +#include + +/** The QNX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The QNX custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#else + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The generic custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#endif /* video driver type */ + +#endif /* SDL_PROTOTYPES_ONLY */ + +/* Function prototypes */ +/** + * This function gives you custom hooks into the window manager information. + * It fills the structure pointed to by 'info' with custom information and + * returns 0 if the function is not implemented, 1 if the function is + * implemented and no error occurred, and -1 if the version member of + * the 'info' structure is not filled in or not supported. + * + * You typically use this function like this: + * @code + * SDL_SysWMinfo info; + * SDL_VERSION(&info.version); + * if ( SDL_GetWMInfo(&info) ) { ... } + * @endcode + */ +extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_syswm_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_thread.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_thread.h new file mode 100644 index 00000000..9ebe00ed --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_thread.h @@ -0,0 +1,115 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_thread_h +#define _SDL_thread_h + +/** @file SDL_thread.h + * Header for the SDL thread management routines + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/** Create a thread */ +#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__) +/** + * We compile SDL into a DLL on OS/2. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL.DLL will + * be initialized for those threads, and not the RTL of the calling application! + * To solve this, we make a little hack here. + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL.DLL which uses this API, + * then the RTL of SDL.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD +#ifndef _WIN32_WCE +#include /* This has _beginthread() and _endthread() defined! */ +#endif + +#ifdef __OS2__ +typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); +typedef void (*pfnSDL_CurrentEndThread)(void); +#else +typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, + unsigned (__stdcall *func)(void *), void *arg, + unsigned, unsigned *threadID); +typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); +#endif + +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread); + +#ifdef __OS2__ +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) +#elif defined(_WIN32_WCE) +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) +#else +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) +#endif +#else +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data); +#endif + +/** Get the 32-bit thread identifier for the current thread */ +extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); + +/** Get the 32-bit thread identifier for the specified thread, + * equivalent to SDL_ThreadID() if the specified thread is NULL. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread); + +/** Wait for a thread to finish. + * The return code for the thread function is placed in the area + * pointed to by 'status', if 'status' is not NULL. + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); + +/** Forcefully kill a thread without worrying about its state */ +extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_thread_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_timer.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_timer.h new file mode 100644 index 00000000..d764d5f3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_timer.h @@ -0,0 +1,125 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_timer_h +#define _SDL_timer_h + +/** @file SDL_timer.h + * Header for the SDL time management routines + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the OS scheduler timeslice, in milliseconds */ +#define SDL_TIMESLICE 10 + +/** This is the maximum resolution of the SDL timer on all platforms */ +#define TIMER_RESOLUTION 10 /**< Experimentally determined */ + +/** + * Get the number of milliseconds since the SDL library initialization. + * Note that this value wraps if the program runs for more than ~49 days. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** Wait a specified number of milliseconds before returning */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** Function prototype for the timer callback function */ +typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval); + +/** + * Set a callback to run after the specified number of milliseconds has + * elapsed. The callback function is passed the current timer interval + * and returns the next timer interval. If the returned value is the + * same as the one passed in, the periodic alarm continues, otherwise a + * new alarm is scheduled. If the callback returns 0, the periodic alarm + * is cancelled. + * + * To cancel a currently running timer, call SDL_SetTimer(0, NULL); + * + * The timer callback function may run in a different thread than your + * main code, and so shouldn't call any functions from within itself. + * + * The maximum resolution of this timer is 10 ms, which means that if + * you request a 16 ms timer, your callback will run approximately 20 ms + * later on an unloaded system. If you wanted to set a flag signaling + * a frame update at 30 frames per second (every 33 ms), you might set a + * timer for 30 ms: + * @code SDL_SetTimer((33/10)*10, flag_update); @endcode + * + * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). + * + * Under UNIX, you should not use raise or use SIGALRM and this function + * in the same program, as it is implemented using setitimer(). You also + * should not use this function in multi-threaded applications as signals + * to multi-threaded apps have undefined behavior in some implementations. + * + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback); + +/** @name New timer API + * New timer API, supports multiple timers + * Written by Stephane Peter + */ +/*@{*/ + +/** + * Function prototype for the new timer callback function. + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param); + +/** Definition of the timer ID type */ +typedef struct _SDL_TimerID *SDL_TimerID; + +/** Add a new timer to the pool of timers already running. + * Returns a timer ID, or NULL when an error occurs. + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); + +/** + * Remove one of the multiple timers knowing its ID. + * Returns a boolean value indicating success. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_timer_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_types.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_types.h new file mode 100644 index 00000000..79d8b28d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_types.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_types.h + * @deprecated Use SDL_stdinc.h instead. + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_version.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_version.h new file mode 100644 index 00000000..fdc17c64 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_version.h @@ -0,0 +1,91 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_version.h + * This header defines the current SDL version + */ + +#ifndef _SDL_version_h +#define _SDL_version_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Version Number + * Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL + */ +/*@{*/ +#define SDL_MAJOR_VERSION 1 +#define SDL_MINOR_VERSION 2 +#define SDL_PATCHLEVEL 15 +/*@}*/ + +typedef struct SDL_version { + Uint8 major; + Uint8 minor; + Uint8 patch; +} SDL_version; + +/** + * This macro can be used to fill a version structure with the compile-time + * version of the SDL library. + */ +#define SDL_VERSION(X) \ +{ \ + (X)->major = SDL_MAJOR_VERSION; \ + (X)->minor = SDL_MINOR_VERSION; \ + (X)->patch = SDL_PATCHLEVEL; \ +} + +/** This macro turns the version numbers into a numeric value: + * (1,2,3) -> (1203) + * This assumes that there will never be more than 100 patchlevels + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** This is the version number macro for the current SDL version */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) + +/** This macro will evaluate to true if compiled with SDL at least X.Y.Z */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) + +/** This function gets the version of the dynamically linked SDL library. + * it should NOT be used to fill a version structure, instead you should + * use the SDL_Version() macro. + */ +extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_version_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_video.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_video.h new file mode 100644 index 00000000..f9c4e070 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/SDL_video.h @@ -0,0 +1,951 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_video.h + * Header file for access to the SDL raw framebuffer window + */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Transparency definitions + * These define alpha as the opacity of a surface + */ +/*@{*/ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/*@}*/ + +/** @name Useful data types */ +/*@{*/ +typedef struct SDL_Rect { + Sint16 x, y; + Uint16 w, h; +} SDL_Rect; + +typedef struct SDL_Color { + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 unused; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette { + int ncolors; + SDL_Color *colors; +} SDL_Palette; +/*@}*/ + +/** Everything in the pixel format structure is read-only */ +typedef struct SDL_PixelFormat { + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + + /** RGB color key information */ + Uint32 colorkey; + /** Alpha value information (per-surface alpha) */ + Uint8 alpha; +} SDL_PixelFormat; + +/** This structure should be treated as read-only, except for 'pixels', + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface { + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + Uint16 pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + int offset; /**< Private */ + + /** Hardware-specific surface info */ + struct private_hwdata *hwdata; + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + Uint32 unused1; /**< for binary compatibility */ + + /** Allow recursive locks */ + Uint32 locked; /**< Private */ + + /** info for fast blit mapping to other surfaces */ + struct SDL_BlitMap *map; /**< Private */ + + /** format version, bumped at every change to invalidate blit maps */ + unsigned int format_version; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** @name SDL_Surface Flags + * These are the currently supported flags for the SDL_surface + */ +/*@{*/ + +/** Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ +/*@{*/ +#define SDL_SWSURFACE 0x00000000 /**< Surface is in system memory */ +#define SDL_HWSURFACE 0x00000001 /**< Surface is in video memory */ +#define SDL_ASYNCBLIT 0x00000004 /**< Use asynchronous blits if possible */ +/*@}*/ + +/** Available for SDL_SetVideoMode() */ +/*@{*/ +#define SDL_ANYFORMAT 0x10000000 /**< Allow any video depth/pixel-format */ +#define SDL_HWPALETTE 0x20000000 /**< Surface has exclusive palette */ +#define SDL_DOUBLEBUF 0x40000000 /**< Set up double-buffered video mode */ +#define SDL_FULLSCREEN 0x80000000 /**< Surface is a full screen display */ +#define SDL_OPENGL 0x00000002 /**< Create an OpenGL rendering context */ +#define SDL_OPENGLBLIT 0x0000000A /**< Create an OpenGL rendering context and use it for blitting */ +#define SDL_RESIZABLE 0x00000010 /**< This video mode may be resized */ +#define SDL_NOFRAME 0x00000020 /**< No window caption or edge frame */ +/*@}*/ + +/** Used internally (read-only) */ +/*@{*/ +#define SDL_HWACCEL 0x00000100 /**< Blit uses hardware acceleration */ +#define SDL_SRCCOLORKEY 0x00001000 /**< Blit uses a source color key */ +#define SDL_RLEACCELOK 0x00002000 /**< Private flag */ +#define SDL_RLEACCEL 0x00004000 /**< Surface is RLE encoded */ +#define SDL_SRCALPHA 0x00010000 /**< Blit uses source alpha blending */ +#define SDL_PREALLOC 0x01000000 /**< Surface uses preallocated memory */ +/*@}*/ + +/*@}*/ + +/** Evaluates to true if the surface needs to be locked before access */ +#define SDL_MUSTLOCK(surface) \ + (surface->offset || \ + ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) + +/** typedef for private surface blitting functions */ +typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, + struct SDL_Surface *dst, SDL_Rect *dstrect); + + +/** Useful for determining the video hardware capabilities */ +typedef struct SDL_VideoInfo { + Uint32 hw_available :1; /**< Flag: Can you create hardware surfaces? */ + Uint32 wm_available :1; /**< Flag: Can you talk to a window manager? */ + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; /**< Flag: Accelerated blits HW --> HW */ + Uint32 blit_hw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_hw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_sw :1; /**< Flag: Accelerated blits SW --> HW */ + Uint32 blit_sw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_sw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_fill :1; /**< Flag: Accelerated color fill */ + Uint32 UnusedBits3 :16; + Uint32 video_mem; /**< The total amount of video memory (in K) */ + SDL_PixelFormat *vfmt; /**< Value: The format of the video surface */ + int current_w; /**< Value: The current video mode width */ + int current_h; /**< Value: The current video mode height */ +} SDL_VideoInfo; + + +/** @name Overlay Formats + * The most common video overlay formats. + * For an explanation of these pixel formats, see: + * http://www.webartz.com/fourcc/indexyuv.htm + * + * For information on the relationship between color spaces, see: + * http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html + */ +/*@{*/ +#define SDL_YV12_OVERLAY 0x32315659 /**< Planar mode: Y + V + U (3 planes) */ +#define SDL_IYUV_OVERLAY 0x56555949 /**< Planar mode: Y + U + V (3 planes) */ +#define SDL_YUY2_OVERLAY 0x32595559 /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ +#define SDL_UYVY_OVERLAY 0x59565955 /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ +#define SDL_YVYU_OVERLAY 0x55595659 /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ +/*@}*/ + +/** The YUV hardware video overlay */ +typedef struct SDL_Overlay { + Uint32 format; /**< Read-only */ + int w, h; /**< Read-only */ + int planes; /**< Read-only */ + Uint16 *pitches; /**< Read-only */ + Uint8 **pixels; /**< Read-write */ + + /** @name Hardware-specific surface info */ + /*@{*/ + struct private_yuvhwfuncs *hwfuncs; + struct private_yuvhwdata *hwdata; + /*@{*/ + + /** @name Special flags */ + /*@{*/ + Uint32 hw_overlay :1; /**< Flag: This overlay hardware accelerated? */ + Uint32 UnusedBits :31; + /*@}*/ +} SDL_Overlay; + + +/** Public enumeration for setting the OpenGL window attributes. */ +typedef enum { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_SWAP_CONTROL +} SDL_GLattr; + +/** @name flags for SDL_SetPalette() */ +/*@{*/ +#define SDL_LOGPAL 0x01 +#define SDL_PHYSPAL 0x02 +/*@}*/ + +/* Function prototypes */ + +/** + * @name Video Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the video driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +/** + * Initializes the video subsystem. Sets up a connection + * to the window manager, etc, and determines the current video mode and + * pixel format, but does not initialize a window or graphics mode. + * Note that event handling is activated by this routine. + * + * If you use both sound and video in your application, you need to call + * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, + * you won't be able to set full-screen display modes. + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, Uint32 flags); +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * video driver, and returns a pointer to it if the video driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); + +/** + * This function returns a pointer to the current display surface. + * If SDL is doing format conversion on the display surface, this + * function returns the publicly visible surface, not the real video + * surface. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void); + +/** + * This function returns a read-only pointer to information about the + * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' + * member of the returned structure will contain the pixel format of the + * "best" video mode. + */ +extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); + +/** + * Check to see if a particular video mode is supported. + * It returns 0 if the requested mode is not supported under any bit depth, + * or returns the bits-per-pixel of the closest available mode with the + * given width and height. If this bits-per-pixel is different from the + * one used when setting the video mode, SDL_SetVideoMode() will succeed, + * but will emulate the requested bits-per-pixel with a shadow surface. + * + * The arguments to SDL_VideoModeOK() are the same ones you would pass to + * SDL_SetVideoMode() + */ +extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); + +/** + * Return a pointer to an array of available screen dimensions for the + * given format and video flags, sorted largest to smallest. Returns + * NULL if there are no dimensions available for a particular format, + * or (SDL_Rect **)-1 if any dimension is okay for the given format. + * + * If 'format' is NULL, the mode list will be for the format given + * by SDL_GetVideoInfo()->vfmt + */ +extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); + +/** + * Set up a video mode with the specified width, height and bits-per-pixel. + * + * If 'bpp' is 0, it is treated as the current display bits per pixel. + * + * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the + * requested bits-per-pixel, but will return whatever video pixel format is + * available. The default is to emulate the requested pixel format if it + * is not natively available. + * + * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in + * video memory, if possible, and you may have to call SDL_LockSurface() + * in order to access the raw framebuffer. Otherwise, the video surface + * will be created in system memory. + * + * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle + * updates asynchronously, but you must always lock before accessing pixels. + * SDL will wait for updates to complete before returning from the lock. + * + * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee + * that the colors set by SDL_SetColors() will be the colors you get. + * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all + * of the colors exactly the way they are requested, and you should look + * at the video surface structure to determine the actual palette. + * If SDL cannot guarantee that the colors you request can be set, + * i.e. if the colormap is shared, then the video surface may be created + * under emulation in system memory, overriding the SDL_HWSURFACE flag. + * + * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set + * a fullscreen video mode. The default is to create a windowed mode + * if the current graphics system has a window manager. + * If the SDL library is able to set a fullscreen video mode, this flag + * will be set in the surface that is returned. + * + * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up + * two surfaces in video memory and swap between them when you call + * SDL_Flip(). This is usually slower than the normal single-buffering + * scheme, but prevents "tearing" artifacts caused by modifying video + * memory while the monitor is refreshing. It should only be used by + * applications that redraw the entire screen on every update. + * + * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the + * window manager, if any, to resize the window at runtime. When this + * occurs, SDL will send a SDL_VIDEORESIZE event to you application, + * and you must respond to the event by re-calling SDL_SetVideoMode() + * with the requested size (or another size that suits the application). + * + * If SDL_NOFRAME is set in 'flags', the SDL library will create a window + * without any title bar or frame decoration. Fullscreen video modes have + * this flag set automatically. + * + * This function returns the video framebuffer surface, or NULL if it fails. + * + * If you rely on functionality provided by certain video flags, check the + * flags of the returned surface to make sure that functionality is available. + * SDL will fall back to reduced functionality if the exact flags you wanted + * are not available. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode + (int width, int height, int bpp, Uint32 flags); + +/** @name SDL_Update Functions + * These functions should not be called while 'screen' is locked. + */ +/*@{*/ +/** + * Makes sure the given list of rectangles is updated on the given screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRects + (SDL_Surface *screen, int numrects, SDL_Rect *rects); +/** + * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire + * screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRect + (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); +/*@}*/ + +/** + * On hardware that supports double-buffering, this function sets up a flip + * and returns. The hardware will wait for vertical retrace, and then swap + * video buffers before the next video surface blit or lock will return. + * On hardware that doesn not support double-buffering, this is equivalent + * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); + * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when + * setting the video mode for this function to perform hardware flipping. + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface *screen); + +/** + * Set the gamma correction for each of the color channels. + * The gamma values range (approximately) between 0.1 and 10.0 + * + * If this function isn't supported directly by the hardware, it will + * be emulated using gamma ramps, if available. If successful, this + * function returns 0, otherwise it returns -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); + +/** + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * You may pass NULL for any of the channels to leave it unchanged. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue); + +/** + * Retrieve the current values of the gamma translation tables. + * + * You must pass in valid pointers to arrays of 256 16-bit quantities. + * Any of the pointers may be NULL to ignore that channel. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); + +/** + * Sets a portion of the colormap for the given 8-bit surface. If 'surface' + * is not a palettized surface, this function does nothing, returning 0. + * If all of the colors were set as passed to SDL_SetColors(), it will + * return 1. If not all the color entries were set exactly as given, + * it will return 0, and you should look at the surface palette to + * determine the actual color palette. + * + * When 'surface' is the surface associated with the current display, the + * display colormap will be updated with the requested colors. If + * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() + * will always return 1, and the palette is guaranteed to be set the way + * you desire, even if the window colormap has to be warped or run under + * emulation. + */ +extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, + SDL_Color *colors, int firstcolor, int ncolors); + +/** + * Sets a portion of the colormap for a given 8-bit surface. + * 'flags' is one or both of: + * SDL_LOGPAL -- set logical palette, which controls how blits are mapped + * to/from the surface, + * SDL_PHYSPAL -- set physical palette, which controls how pixels look on + * the screen + * Only screens have physical palettes. Separate change of physical/logical + * palettes is only possible if the screen has SDL_HWPALETTE set. + * + * The return value is 1 if all colours could be set as requested, and 0 + * otherwise. + * + * SDL_SetColors() is equivalent to calling this function with + * flags = (SDL_LOGPAL|SDL_PHYSPAL). + */ +extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, + SDL_Color *colors, int firstcolor, + int ncolors); + +/** + * Maps an RGB triple to an opaque pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b); + +/** + * Maps an RGBA quadruple to a pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a); + +/** + * Maps a pixel value into the RGB components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b); + +/** + * Maps a pixel value into the RGBA components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); + +/** @sa SDL_CreateRGBSurface */ +#define SDL_AllocSurface SDL_CreateRGBSurface +/** + * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * If the function runs out of memory, it will return NULL. + * + * The 'flags' tell what kind of surface to create. + * SDL_SWSURFACE means that the surface should be created in system memory. + * SDL_HWSURFACE means that the surface should be created in video memory, + * with the same format as the display surface. This is useful for surfaces + * that will not change much, to take advantage of hardware acceleration + * when being blitted to the display surface. + * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with + * this surface, but you must always lock it before accessing the pixels. + * SDL will wait for current blits to finish before returning from the lock. + * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. + * If the hardware supports acceleration of colorkey blits between + * two surfaces in video memory, SDL will try to place the surface in + * video memory. If this isn't possible or if there is no hardware + * acceleration available, the surface will be placed in system memory. + * SDL_SRCALPHA means that the surface will be used for alpha blits and + * if the hardware supports hardware acceleration of alpha blits between + * two surfaces in video memory, to place the surface in video memory + * if possible, otherwise it will be placed in system memory. + * If the surface is created in video memory, blits will be _much_ faster, + * but the surface format must be identical to the video surface format, + * and the only way to access the pixels member of the surface is to use + * the SDL_LockSurface() and SDL_UnlockSurface() calls. + * If the requested surface actually resides in video memory, SDL_HWSURFACE + * will be set in the flags member of the returned surface. If for some + * reason the surface could not be placed in video memory, it will not have + * the SDL_HWSURFACE flag set, and will be created in system memory instead. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +/** @sa SDL_CreateRGBSurface */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, int height, int depth, int pitch, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface *surface); + +/** + * SDL_LockSurface() sets up a surface for directly accessing the pixels. + * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write + * to and read from 'surface->pixels', using the pixel format stored in + * 'surface->format'. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. In particular, if the + * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you + * will not need to lock the display surface before accessing it. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface *surface); +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); + +/** + * Load a surface from a seekable SDL data source (memory or file.) + * If 'freesrc' is non-zero, the source will be closed after being read. + * Returns the new surface, or NULL if there was an error. + * The new surface should be freed with SDL_FreeSurface(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); + +/** Convenience macro -- load a surface from a file */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data source (memory or file.) + * If 'freedst' is non-zero, the source will be closed after being written. + * Returns 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface *surface, SDL_RWops *dst, int freedst); + +/** Convenience macro -- save a surface to a file */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * Sets the color key (transparent pixel) in a blittable surface. + * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), + * 'key' will be the transparent pixel in the source image of a blit. + * SDL_RLEACCEL requests RLE acceleration for the surface if present, + * and removes RLE acceleration if absent. + * If 'flag' is 0, this function clears any current color key. + * This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey + (SDL_Surface *surface, Uint32 flag, Uint32 key); + +/** + * This function sets the alpha value for the entire surface, as opposed to + * using the alpha component of each pixel. This value measures the range + * of transparency of the surface, 0 being completely transparent to 255 + * being completely opaque. An 'alpha' value of 255 causes blits to be + * opaque, the source pixels copied to the destination (the default). Note + * that per-surface alpha can be combined with colorkey transparency. + * + * If 'flag' is 0, alpha blending is disabled for the surface. + * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. + * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the + * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. + * + * The 'alpha' parameter is ignored for surfaces that have an alpha channel. + */ +extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); + +/** + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); + +/** + * Gets the clipping rectangle for the destination surface in a blit. + * 'rect' must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); + +/** + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + * + * This function is used internally by SDL_DisplayFormat(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface + (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); + +/** + * This performs a fast blit from the source surface to the destination + * surface. It assumes that the source and destination rectangles are + * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire + * surface (src or dst) is copied. The final blit rectangles are saved + * in 'srcrect' and 'dstrect' after all clipping is performed. + * If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without alpha and colorkey + * are defined as follows: + * + * RGBA->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using alpha-channel). + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy RGB. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value); + * set destination alpha to opaque. + * SDL_SRCALPHA not set: + * copy RGB, set destination alpha to source per-surface alpha value. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * RGBA->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source alpha channel) the RGB values; + * leave destination alpha untouched. [Note: is this correct?] + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy all of RGBA to the destination. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value). + * SDL_SRCALPHA not set: + * copy RGB. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * If either of the surfaces were in video memory, and the blit returns -2, + * the video memory was lost, so it should be reloaded with artwork and + * re-blitted: + * @code + * while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { + * while ( SDL_LockSurface(image) < 0 ) + * Sleep(10); + * -- Write image pixels to image->pixels -- + * SDL_UnlockSurface(image); + * } + * @endcode + * + * This happens under DirectX 5.0 when the system switches away from your + * fullscreen application. The lock will also fail until you have access + * to the video memory again. + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** This is the public blit function, SDL_BlitSurface(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlit() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); +/** This is a semi-private blit function and it performs low-level surface + * blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/** + * This function performs a fast fill of the given rectangle with 'color' + * The given rectangle is clipped to the destination surface clip area + * and the final fill rectangle is saved in the passed in pointer. + * If 'dstrect' is NULL, the whole surface will be filled with 'color' + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer, suitable for fast + * blitting onto the display surface. It calls SDL_ConvertSurface() + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormat(SDL_Surface *surface); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer (if possible), + * suitable for fast alpha blitting onto the display surface. + * The new surface will always have an alpha channel. + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormatAlpha(SDL_Surface *surface); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name YUV video surface overlay functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** This function creates a video output overlay + * Calling the returned surface an overlay is something of a misnomer because + * the contents of the display surface underneath the area where the overlay + * is shown is undefined - it may be overwritten with the converted YUV data. + */ +extern DECLSPEC SDL_Overlay * SDLCALL SDL_CreateYUVOverlay(int width, int height, + Uint32 format, SDL_Surface *display); + +/** Lock an overlay for direct access, and unlock it when you are done */ +extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay *overlay); +extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay); + +/** Blit a video overlay to the display surface. + * The contents of the video surface underneath the blit destination are + * not defined. + * The width and height of the destination rectangle may be different from + * that of the overlay, but currently only 2x scaling is supported. + */ +extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); + +/** Free a video overlay */ +extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay *overlay); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name OpenGL support functions. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Dynamically load an OpenGL library, or the default one if path is NULL + * + * If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * Get the address of a GL function + */ +extern DECLSPEC void * SDLCALL SDL_GL_GetProcAddress(const char* proc); + +/** + * Set an attribute of the OpenGL subsystem before intialization. + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * Get an attribute of the OpenGL subsystem from the windowing + * interface, such as glX. This is of course different from getting + * the values from SDL's internal OpenGL subsystem, which only + * stores the values you request before initialization. + * + * Developers should track the values they pass into SDL_GL_SetAttribute + * themselves if they want to retrieve these values. + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); + +/** + * Swap the OpenGL buffers, if double-buffering is supported. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); + +/** @name OpenGL Internal Functions + * Internal functions that should not be called unless you have read + * and understood the source code for these functions. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); +extern DECLSPEC void SDLCALL SDL_GL_Lock(void); +extern DECLSPEC void SDLCALL SDL_GL_Unlock(void); +/*@}*/ + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Window Manager Functions */ +/** These functions allow interaction with the window manager, if any. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Sets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); +/** + * Gets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon); + +/** + * Sets the icon for the display window. + * This function must be called before the first call to SDL_SetVideoMode(). + * It takes an icon surface, and a mask in MSB format. + * If 'mask' is NULL, the entire icon surface will be used as the icon. + */ +extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); + +/** + * This function iconifies the window, and returns 1 if it succeeded. + * If the function succeeds, it generates an SDL_APPACTIVE loss event. + * This function is a noop and returns 0 in non-windowed environments. + */ +extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); + +/** + * Toggle fullscreen mode without changing the contents of the screen. + * If the display surface does not require locking before accessing + * the pixel information, then the memory pointers will not change. + * + * If this function was able to toggle fullscreen mode (change from + * running in a window to fullscreen, or vice-versa), it will return 1. + * If it is not implemented, or fails, it returns 0. + * + * The next call to SDL_SetVideoMode() will set the mode fullscreen + * attribute based on the flags parameter - if SDL_FULLSCREEN is not + * set, then the display will be windowed by default where supported. + * + * This is currently only implemented in the X11 video driver. + */ +extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface *surface); + +typedef enum { + SDL_GRAB_QUERY = -1, + SDL_GRAB_OFF = 0, + SDL_GRAB_ON = 1, + SDL_GRAB_FULLSCREEN /**< Used internally */ +} SDL_GrabMode; +/** + * This function allows you to set and query the input grab state of + * the application. It returns the new input grab state. + * + * Grabbing means that the mouse is confined to the application window, + * and nearly all keyboard input is passed directly to the application, + * and not interpreted by a window manager, if any. + */ +extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); + +/*@}*/ + +/** @internal Not in public API at the moment - do not use! */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/begin_code.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/begin_code.h new file mode 100644 index 00000000..27e2f7bc --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-gnu/SDL/begin_code.h @@ -0,0 +1,196 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file begin_code.h + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/** + * @file begin_code.h + * This shouldn't be nested -- included it around code only. + */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +/** + * @def DECLSPEC + * Some compilers use a special export keyword + */ +#ifndef DECLSPEC +# if defined(__BEOS__) || defined(__HAIKU__) +# if defined(__GNUC__) +# define DECLSPEC +# else +# define DECLSPEC __declspec(export) +# endif +# elif defined(__WIN32__) +# ifdef __BORLANDC__ +# ifdef BUILD_SDL +# define DECLSPEC +# else +# define DECLSPEC __declspec(dllimport) +# endif +# else +# define DECLSPEC __declspec(dllexport) +# endif +# elif defined(__OS2__) +# ifdef __WATCOMC__ +# ifdef BUILD_SDL +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# elif defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX = 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# else +# define DECLSPEC +# endif +# endif +#endif + +/** + * @def SDLCALL + * By default SDL uses the C calling convention + */ +#ifndef SDLCALL +# if defined(__WIN32__) && !defined(__GNUC__) +# define SDLCALL __cdecl +# elif defined(__OS2__) +# if defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX freq' should be the desired audio frequency in samples-per-second. + * - 'desired->format' should be the desired audio format. + * - 'desired->samples' is the desired size of the audio buffer, in samples. + * This number should be a power of two, and may be adjusted by the audio + * driver to a value more suitable for the hardware. Good values seem to + * range between 512 and 8096 inclusive, depending on the application and + * CPU speed. Smaller values yield faster response time, but can lead + * to underflow if the application is doing heavy processing and cannot + * fill the audio buffer in time. A stereo sample consists of both right + * and left channels in LR ordering. + * Note that the number of samples is directly related to time by the + * following formula: ms = (samples*1000)/freq + * - 'desired->size' is the size in bytes of the audio buffer, and is + * calculated by SDL_OpenAudio(). + * - 'desired->silence' is the value used to set the buffer to silence, + * and is calculated by SDL_OpenAudio(). + * - 'desired->callback' should be set to a function that will be called + * when the audio device is ready for more data. It is passed a pointer + * to the audio buffer, and the length in bytes of the audio buffer. + * This function usually runs in a separate thread, and so you should + * protect data structures that it accesses by calling SDL_LockAudio() + * and SDL_UnlockAudio() in your code. + * - 'desired->userdata' is passed as the first parameter to your callback + * function. + * + * @note The calculated values in this structure are calculated by SDL_OpenAudio() + * + */ +typedef struct SDL_AudioSpec { + int freq; /**< DSP frequency -- samples per second */ + Uint16 format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in samples (power of 2) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + /** + * This function is called when the audio device needs more data. + * + * @param[out] stream A pointer to the audio data buffer + * @param[in] len The length of the audio buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + */ + void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); + void *userdata; +} SDL_AudioSpec; + +/** + * @name Audio format flags + * defaults to LSB byte order + */ +/*@{*/ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB + +/** + * @name Native audio byte ordering + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#endif +/*@}*/ + +/*@}*/ + + +/** A structure to hold a set of audio conversion filters and buffers */ +typedef struct SDL_AudioCVT { + int needed; /**< Set to 1 if conversion possible */ + Uint16 src_format; /**< Source audio format */ + Uint16 dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + void (SDLCALL *filters[10])(struct SDL_AudioCVT *cvt, Uint16 format); + int filter_index; /**< Current audio conversion function */ +} SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * @name Audio Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the audio driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * current audio driver, and returns a pointer to it if the audio driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); + +/** + * This function opens the audio device with the desired parameters, and + * returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio + * data passed to the callback function will be guaranteed to be in the + * requested format, and will be automatically converted to the hardware + * audio format if necessary. This function returns -1 if it failed + * to open the audio device, or couldn't set up the audio thread. + * + * The audio device starts out playing silence when it's opened, and should + * be enabled for playing by calling SDL_PauseAudio(0) when you are ready + * for your audio callback function to be called. Since the audio driver + * may modify the requested size of the audio buffer, you should allocate + * any local mixing buffers after you open the audio device. + * + * @sa SDL_AudioSpec + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); + +typedef enum { + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_audiostatus; + +/** Get the current audio state */ +extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); + +/** + * This function pauses and unpauses the audio callback processing. + * It should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); + +/** + * This function loads a WAVE from the data source, automatically freeing + * that source if 'freesrc' is non-zero. For example, to load a WAVE file, + * you could do: + * @code SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); @endcode + * + * If this function succeeds, it returns the given SDL_AudioSpec, + * filled with the audio data format of the wave data, and sets + * 'audio_buf' to a malloc()'d buffer containing the audio data, + * and sets 'audio_len' to the length of that audio buffer, in bytes. + * You need to free the audio buffer with SDL_FreeWAV() when you are + * done with it. + * + * This function returns NULL and sets the SDL error message if the + * wave file cannot be opened, uses an unknown data format, or is + * corrupt. Currently raw and MS-ADPCM WAVE files are supported. + */ +extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); + +/** Compatibility convenience function -- loads a WAV from a file */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * This function frees data previously allocated with SDL_LoadWAV_RW() + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 *audio_buf); + +/** + * This function takes a source format and rate and a destination format + * and rate, and initializes the 'cvt' structure with information needed + * by SDL_ConvertAudio() to convert a buffer of audio data from one format + * to the other. + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, + Uint16 src_format, Uint8 src_channels, int src_rate, + Uint16 dst_format, Uint8 dst_channels, int dst_rate); + +/** + * Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), + * created an audio buffer cvt->buf, and filled it with cvt->len bytes of + * audio data in the source format, this function will convert it in-place + * to the desired format. + * The data conversion may expand the size of the audio data, so the buffer + * cvt->buf should be allocated after the cvt structure is initialized by + * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt); + + +#define SDL_MIX_MAXVOLUME 128 +/** + * This takes two audio buffers of the playing audio format and mixes + * them, performing addition, volume adjustment, and overflow clipping. + * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume. Note this does not change hardware volume. + * This is provided for convenience -- you can mix your own audio data. + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume); + +/** + * @name Audio Locks + * The lock manipulated by these functions protects the callback function. + * During a LockAudio/UnlockAudio pair, you can be guaranteed that the + * callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); +/*@}*/ + +/** + * This function shuts down audio processing and closes the audio device. + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_audio_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_byteorder.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_byteorder.h new file mode 100644 index 00000000..47332c3d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_byteorder.h @@ -0,0 +1,29 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_byteorder.h + * @deprecated Use SDL_endian.h instead + */ + +/* DEPRECATED */ +#include "SDL_endian.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cdrom.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cdrom.h new file mode 100644 index 00000000..febb19dc --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cdrom.h @@ -0,0 +1,202 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cdrom.h + * This is the CD-audio control API for Simple DirectMedia Layer + */ + +#ifndef _SDL_cdrom_h +#define _SDL_cdrom_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file SDL_cdrom.h + * In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_CDROM flag. This causes SDL to scan the system + * for CD-ROM drives, and load appropriate drivers. + */ + +/** The maximum number of CD-ROM tracks on a disk */ +#define SDL_MAX_TRACKS 99 + +/** @name Track Types + * The types of CD-ROM track possible + */ +/*@{*/ +#define SDL_AUDIO_TRACK 0x00 +#define SDL_DATA_TRACK 0x04 +/*@}*/ + +/** The possible states which a CD-ROM drive can be in. */ +typedef enum { + CD_TRAYEMPTY, + CD_STOPPED, + CD_PLAYING, + CD_PAUSED, + CD_ERROR = -1 +} CDstatus; + +/** Given a status, returns true if there's a disk in the drive */ +#define CD_INDRIVE(status) ((int)(status) > 0) + +typedef struct SDL_CDtrack { + Uint8 id; /**< Track number */ + Uint8 type; /**< Data or audio track */ + Uint16 unused; + Uint32 length; /**< Length, in frames, of this track */ + Uint32 offset; /**< Offset, in frames, from start of disk */ +} SDL_CDtrack; + +/** This structure is only current as of the last call to SDL_CDStatus() */ +typedef struct SDL_CD { + int id; /**< Private drive identifier */ + CDstatus status; /**< Current drive status */ + + /** The rest of this structure is only valid if there's a CD in drive */ + /*@{*/ + int numtracks; /**< Number of tracks on disk */ + int cur_track; /**< Current track position */ + int cur_frame; /**< Current frame offset within current track */ + SDL_CDtrack track[SDL_MAX_TRACKS+1]; + /*@}*/ +} SDL_CD; + +/** @name Frames / MSF Conversion Functions + * Conversion functions from frames to Minute/Second/Frames and vice versa + */ +/*@{*/ +#define CD_FPS 75 +#define FRAMES_TO_MSF(f, M,S,F) { \ + int value = f; \ + *(F) = value%CD_FPS; \ + value /= CD_FPS; \ + *(S) = value%60; \ + value /= 60; \ + *(M) = value; \ +} +#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) +/*@}*/ + +/* CD-audio API functions: */ + +/** + * Returns the number of CD-ROM drives on the system, or -1 if + * SDL_Init() has not been called with the SDL_INIT_CDROM flag. + */ +extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); + +/** + * Returns a human-readable, system-dependent identifier for the CD-ROM. + * Example: + * - "/dev/cdrom" + * - "E:" + * - "/dev/disk/ide/1/master" + */ +extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); + +/** + * Opens a CD-ROM drive for access. It returns a drive handle on success, + * or NULL if the drive was invalid or busy. This newly opened CD-ROM + * becomes the default CD used when other CD functions are passed a NULL + * CD-ROM handle. + * Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. + */ +extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); + +/** + * This function returns the current status of the given drive. + * If the drive has a CD in it, the table of contents of the CD and current + * play position of the CD will be stored in the SDL_CD structure. + */ +extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); + +/** + * Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' + * tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play + * until the end of the CD. This function will skip data tracks. + * This function should only be called after calling SDL_CDStatus() to + * get track information about the CD. + * For example: + * @code + * // Play entire CD: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); + * // Play last track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { + * SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); + * } + * // Play first and second track and 10 seconds of third track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); + * @endcode + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, + int start_track, int start_frame, int ntracks, int nframes); + +/** + * Play the given CD starting at 'start' frame for 'length' frames. + * @return It returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); + +/** Pause play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); + +/** Resume play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); + +/** Stop play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); + +/** Eject CD-ROM + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); + +/** Closes the handle for the CD-ROM drive */ +extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config.h new file mode 100644 index 00000000..09ba38a7 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config.h @@ -0,0 +1,45 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_h +#define _SDL_config_h + +#include "SDL_platform.h" + +/* Add any platform that doesn't build using the configure system */ +#if defined(__DREAMCAST__) +#include "SDL_config_dreamcast.h" +#elif defined(__MACOS__) +#include "SDL_config_macos.h" +#elif defined(__MACOSX__) +#include "SDL_config_macosx.h" +#elif defined(__SYMBIAN32__) +#include "SDL_config_symbian.h" /* must be before win32! */ +#elif defined(__WIN32__) +#include "SDL_config_win32.h" +#elif defined(__OS2__) +#include "SDL_config_os2.h" +#else +#include "SDL_config_minimal.h" +#endif /* platform config */ + +#endif /* _SDL_config_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_dreamcast.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_dreamcast.h new file mode 100644 index 00000000..fb03098e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_dreamcast.h @@ -0,0 +1,106 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_dreamcast_h +#define _SDL_config_dreamcast_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +typedef unsigned long uintptr_t; +#define SDL_HAS_64BIT_TYPE 1 + +/* Useful headers */ +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRDUP 1 +#define HAVE_INDEX 1 +#define HAVE_RINDEX 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRICMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_DC 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#define SDL_CDROM_DC 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DC 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_DUMMY 1 + +/* Enable various threading systems */ +#define SDL_THREAD_DC 1 + +/* Enable various timer systems */ +#define SDL_TIMER_DC 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DC 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#endif /* _SDL_config_dreamcast_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macos.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macos.h new file mode 100644 index 00000000..4fe1715a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macos.h @@ -0,0 +1,112 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_macos_h +#define _SDL_config_macos_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#include + +typedef SInt8 int8_t; +typedef UInt8 uint8_t; +typedef SInt16 int16_t; +typedef UInt16 uint16_t; +typedef SInt32 int32_t; +typedef UInt32 uint32_t; +typedef SInt64 int64_t; +typedef UInt64 uint64_t; +typedef unsigned long uintptr_t; + +#define SDL_HAS_64BIT_TYPE 1 + +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_SSCANF 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_SNDMGR 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#if TARGET_API_MAC_CARBON +#define SDL_CDROM_DUMMY 1 +#else +#define SDL_CDROM_MACOS 1 +#endif + +/* Enable various input drivers */ +#if TARGET_API_MAC_CARBON +#define SDL_JOYSTICK_DUMMY 1 +#else +#define SDL_JOYSTICK_MACOS 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_MACOS 1 + +/* Enable various threading systems */ +#define SDL_THREADS_DISABLED 1 + +/* Enable various timer systems */ +#define SDL_TIMER_MACOS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_DRAWSPROCKET 1 +#define SDL_VIDEO_DRIVER_TOOLBOX 1 + +/* Enable OpenGL support */ +#define SDL_VIDEO_OPENGL 1 + +#endif /* _SDL_config_macos_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macosx.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macosx.h new file mode 100644 index 00000000..84be6177 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_macosx.h @@ -0,0 +1,150 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_macosx_h +#define _SDL_config_macosx_h + +#include "SDL_platform.h" + +/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ +#include + +/* This is a set of defines to configure the SDL features */ + +#define SDL_HAS_64BIT_TYPE 1 + +/* Useful headers */ +/* If we specified an SDK or have a post-PowerPC chip, then alloca.h exists. */ +#if ( (MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (!defined(__POWERPC__)) ) +#define HAVE_ALLOCA_H 1 +#endif +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_COREAUDIO 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#define SDL_CDROM_MACOSX 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_IOKIT 1 + +/* Enable various shared object loading systems */ +#ifdef __ppc__ +/* For Mac OS X 10.2 compatibility */ +#define SDL_LOADSO_DLCOMPAT 1 +#else +#define SDL_LOADSO_DLOPEN 1 +#endif + +/* Enable various threading systems */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 + +/* Enable various timer systems */ +#define SDL_TIMER_UNIX 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#if ((defined TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON)) +#define SDL_VIDEO_DRIVER_TOOLBOX 1 +#else +#define SDL_VIDEO_DRIVER_QUARTZ 1 +#endif +#define SDL_VIDEO_DRIVER_DGA 1 +#define SDL_VIDEO_DRIVER_X11 1 +#define SDL_VIDEO_DRIVER_X11_DGAMOUSE 1 +#define SDL_VIDEO_DRIVER_X11_DYNAMIC "/usr/X11R6/lib/libX11.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "/usr/X11R6/lib/libXext.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "/usr/X11R6/lib/libXrandr.2.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER "/usr/X11R6/lib/libXrender.1.dylib" +#define SDL_VIDEO_DRIVER_X11_VIDMODE 1 +#define SDL_VIDEO_DRIVER_X11_XINERAMA 1 +#define SDL_VIDEO_DRIVER_X11_XME 1 +#define SDL_VIDEO_DRIVER_X11_XRANDR 1 +#define SDL_VIDEO_DRIVER_X11_XV 1 + +/* Enable OpenGL support */ +#define SDL_VIDEO_OPENGL 1 +#define SDL_VIDEO_OPENGL_GLX 1 + +/* Disable screensaver */ +#define SDL_VIDEO_DISABLE_SCREENSAVER 1 + +/* Enable assembly routines */ +#define SDL_ASSEMBLY_ROUTINES 1 +#ifdef __ppc__ +#define SDL_ALTIVEC_BLITTERS 1 +#endif + +#endif /* _SDL_config_macosx_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_minimal.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_minimal.h new file mode 100644 index 00000000..d10db7c6 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_minimal.h @@ -0,0 +1,62 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_minimal_h +#define _SDL_config_minimal_h + +#include "SDL_platform.h" + +/* This is the minimal configuration that can be used to build SDL */ + +#include + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef unsigned int size_t; +typedef unsigned long uintptr_t; + +/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ +#define SDL_CDROM_DISABLED 1 + +/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ +#define SDL_JOYSTICK_DISABLED 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +/* Enable the stub thread support (src/thread/generic/\*.c) */ +#define SDL_THREADS_DISABLED 1 + +/* Enable the stub timer support (src/timer/dummy/\*.c) */ +#define SDL_TIMERS_DISABLED 1 + +/* Enable the dummy video driver (src/video/dummy/\*.c) */ +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#endif /* _SDL_config_minimal_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_nds.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_nds.h new file mode 100644 index 00000000..cb4d61f6 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_nds.h @@ -0,0 +1,115 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_nds_h +#define _SDL_config_nds_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* C datatypes */ +#define SDL_HAS_64BIT_TYPE 1 + +/* Endianness */ +#define SDL_BYTEORDER 1234 + +/* Useful headers */ +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_SETJMP 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_NDS 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ +#define SDL_CDROM_DISABLED 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_NDS 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +/* Enable the stub thread support (src/thread/generic/\*.c) */ +#define SDL_THREADS_DISABLED 1 + +/* Enable various timer systems */ +#define SDL_TIMER_NDS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_NDS 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#endif /* _SDL_config_nds_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_os2.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_os2.h new file mode 100644 index 00000000..42edd20e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_os2.h @@ -0,0 +1,141 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_os2_h +#define _SDL_config_os2_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef unsigned int size_t; +typedef unsigned long uintptr_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +#define SDL_HAS_64BIT_TYPE 1 + +/* Use Watcom's LIBC */ +#define HAVE_LIBC 1 + +/* Useful headers */ +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_INDEX 1 +#define HAVE_RINDEX 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE__LTOA 1 +#define HAVE__UITOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE__I64TOA 1 +#define HAVE__UI64TOA 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRICMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_SETJMP 1 +#define HAVE_CLOCK_GETTIME 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_DART 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#define SDL_CDROM_OS2 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_OS2 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_OS2 1 + +/* Enable various threading systems */ +#define SDL_THREAD_OS2 1 + +/* Enable various timer systems */ +#define SDL_TIMER_OS2 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_OS2FS 1 + +/* Enable OpenGL support */ +/* Nothing here yet for OS/2... :( */ + +/* Enable assembly routines where available */ +#define SDL_ASSEMBLY_ROUTINES 1 + +#endif /* _SDL_config_os2_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_symbian.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_symbian.h new file mode 100644 index 00000000..e917ac6e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_symbian.h @@ -0,0 +1,146 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* + +Symbian version Markus Mertama + +*/ + + +#ifndef _SDL_CONFIG_SYMBIAN_H +#define _SDL_CONFIG_SYMBIAN_H + +#include "SDL_platform.h" + +/* This is the minimal configuration that can be used to build SDL */ + + +#include +#include + + +#ifdef __GCCE__ +#define SYMBIAN32_GCCE +#endif + +#ifndef _SIZE_T_DEFINED +typedef unsigned int size_t; +#endif + +#ifndef _INTPTR_T_DECLARED +typedef unsigned int uintptr_t; +#endif + +#ifndef _INT8_T_DECLARED +typedef signed char int8_t; +#endif + +#ifndef _UINT8_T_DECLARED +typedef unsigned char uint8_t; +#endif + +#ifndef _INT16_T_DECLARED +typedef signed short int16_t; +#endif + +#ifndef _UINT16_T_DECLARED +typedef unsigned short uint16_t; +#endif + +#ifndef _INT32_T_DECLARED +typedef signed int int32_t; +#endif + +#ifndef _UINT32_T_DECLARED +typedef unsigned int uint32_t; +#endif + +#ifndef _INT64_T_DECLARED +typedef signed long long int64_t; +#endif + +#ifndef _UINT64_T_DECLARED +typedef unsigned long long uint64_t; +#endif + +#define SDL_AUDIO_DRIVER_EPOCAUDIO 1 + + +/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ +#define SDL_CDROM_DISABLED 1 + +/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ +#define SDL_JOYSTICK_DISABLED 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +#define SDL_THREAD_SYMBIAN 1 + +#define SDL_VIDEO_DRIVER_EPOC 1 + +#define SDL_VIDEO_OPENGL 0 + +#define SDL_HAS_64BIT_TYPE 1 + +#define HAVE_LIBC 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 + +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +/*#define HAVE_ALLOCA 1*/ +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRUPR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +/*#define HAVE__STRICMP 1*/ +#define HAVE__STRNICMP 1 +#define HAVE_SSCANF 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 + + + +#endif /* _SDL_CONFIG_SYMBIAN_H */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_win32.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_win32.h new file mode 100644 index 00000000..da2c15dd --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_config_win32.h @@ -0,0 +1,183 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_win32_h +#define _SDL_config_win32_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#if defined(__GNUC__) || defined(__DMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#define SDL_HAS_64BIT_TYPE 1 + +/* Enabled for SDL 1.2 (binary compatibility) */ +#define HAVE_LIBC 1 +#ifdef HAVE_LIBC +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#ifndef _WIN32_WCE +#define HAVE_SIGNAL_H 1 +#endif + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE__LTOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_SSCANF 1 +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#ifndef _WIN32_WCE +#define SDL_AUDIO_DRIVER_DSOUND 1 +#endif +#define SDL_AUDIO_DRIVER_WAVEOUT 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#ifdef _WIN32_WCE +#define SDL_CDROM_DISABLED 1 +#else +#define SDL_CDROM_WIN32 1 +#endif + +/* Enable various input drivers */ +#ifdef _WIN32_WCE +#define SDL_JOYSTICK_DISABLED 1 +#else +#define SDL_JOYSTICK_WINMM 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WIN32 1 + +/* Enable various threading systems */ +#define SDL_THREAD_WIN32 1 + +/* Enable various timer systems */ +#ifdef _WIN32_WCE +#define SDL_TIMER_WINCE 1 +#else +#define SDL_TIMER_WIN32 1 +#endif + +/* Enable various video drivers */ +#ifdef _WIN32_WCE +#define SDL_VIDEO_DRIVER_GAPI 1 +#endif +#ifndef _WIN32_WCE +#define SDL_VIDEO_DRIVER_DDRAW 1 +#endif +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDIB 1 + +/* Enable OpenGL support */ +#ifndef _WIN32_WCE +#define SDL_VIDEO_OPENGL 1 +#define SDL_VIDEO_OPENGL_WGL 1 +#endif + +/* Disable screensaver */ +#define SDL_VIDEO_DISABLE_SCREENSAVER 1 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* _SDL_config_win32_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_copying.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_copying.h new file mode 100644 index 00000000..b5b64f29 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_copying.h @@ -0,0 +1,22 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cpuinfo.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cpuinfo.h new file mode 100644 index 00000000..4200d6d1 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_cpuinfo.h @@ -0,0 +1,69 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cpuinfo.h + * CPU feature detection for SDL + */ + +#ifndef _SDL_cpuinfo_h +#define _SDL_cpuinfo_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This function returns true if the CPU has the RDTSC instruction */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** This function returns true if the CPU has MMX features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** This function returns true if the CPU has MMX Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); + +/** This function returns true if the CPU has 3DNow features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** This function returns true if the CPU has 3DNow! Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); + +/** This function returns true if the CPU has SSE features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** This function returns true if the CPU has SSE2 features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** This function returns true if the CPU has AltiVec features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_cpuinfo_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_endian.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_endian.h new file mode 100644 index 00000000..fd9fc867 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_endian.h @@ -0,0 +1,214 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_endian.h + * Functions for reading and writing endian-specific values + */ + +#ifndef _SDL_endian_h +#define _SDL_endian_h + +#include "SDL_stdinc.h" + +/** @name SDL_ENDIANs + * The two types of endianness + */ +/*@{*/ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/*@}*/ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#else /* __linux __ */ +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux __ */ +#endif /* !SDL_BYTEORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name SDL_Swap Functions + * Use inline functions for compilers that support them, and static + * functions for those that do not. Because these functions become + * static for compilers that do not support inline functions, this + * header should only be included in files that actually use them. + */ +/*@{*/ +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + Uint16 result; + + __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint16 SDL_Swap16(Uint16 x) { + return SDL_static_cast(Uint16, ((x<<8)|(x>>8))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); + __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); + __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint32 SDL_Swap32(Uint32 x) { + return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24))); +} +#endif + +#ifdef SDL_HAS_64BIT_TYPE +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + union { + struct { Uint32 a,b; } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" + : "=r" (v.s.a), "=r" (v.s.b) + : "0" (v.s.a), "1" (v.s.b)); + return v.u; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0" : "=r" (x) : "0" (x)); + return x; +} +#else +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif +#else +/* This is mainly to keep compilers from complaining in SDL code. + * If there is no real 64-bit datatype, then compilers will complain about + * the fake 64-bit datatype that SDL provides when it compiles user code. + */ +#define SDL_Swap64(X) (X) +#endif /* SDL_HAS_64BIT_TYPE */ +/*@}*/ + +/** + * @name SDL_SwapLE and SDL_SwapBE Functions + * Byteswap item from the specified endianness to the native endianness + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#endif +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_endian_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_error.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_error.h new file mode 100644 index 00000000..4e1cce3b --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_error.h @@ -0,0 +1,72 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_error.h + * Simple error message routines for SDL + */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name Public functions + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC char * SDLCALL SDL_GetError(void); +extern DECLSPEC void SDLCALL SDL_ClearError(void); +/*@}*/ + +/** + * @name Private functions + * @internal Private error message function - used internally + */ +/*@{*/ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +typedef enum { + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_events.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_events.h new file mode 100644 index 00000000..94b42025 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_events.h @@ -0,0 +1,356 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_events.h + * Include file for SDL event handling + */ + +#ifndef _SDL_events_h +#define _SDL_events_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_active.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_quit.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name General keyboard/mouse state definitions */ +/*@{*/ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 +/*@}*/ + +/** Event enumerations */ +typedef enum { + SDL_NOEVENT = 0, /**< Unused (do not remove) */ + SDL_ACTIVEEVENT, /**< Application loses/gains visibility */ + SDL_KEYDOWN, /**< Keys pressed */ + SDL_KEYUP, /**< Keys released */ + SDL_MOUSEMOTION, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_JOYAXISMOTION, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_QUIT, /**< User-requested quit */ + SDL_SYSWMEVENT, /**< System specific event */ + SDL_EVENT_RESERVEDA, /**< Reserved for future use.. */ + SDL_EVENT_RESERVEDB, /**< Reserved for future use.. */ + SDL_VIDEORESIZE, /**< User resized video mode */ + SDL_VIDEOEXPOSE, /**< Screen needs to be redrawn */ + SDL_EVENT_RESERVED2, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED3, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED4, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED5, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED6, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED7, /**< Reserved for future use.. */ + /** Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ + SDL_USEREVENT = 24, + /** This last event is only for bounding internal arrays + * It is the number of bits in the event mask datatype -- Uint32 + */ + SDL_NUMEVENTS = 32 +} SDL_EventType; + +/** @name Predefined event masks */ +/*@{*/ +#define SDL_EVENTMASK(X) (1<<(X)) +typedef enum { + SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), + SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), + SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), + SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| + SDL_EVENTMASK(SDL_KEYUP), + SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), + SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), + SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| + SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| + SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), + SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), + SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), + SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), + SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| + SDL_EVENTMASK(SDL_JOYBALLMOTION)| + SDL_EVENTMASK(SDL_JOYHATMOTION)| + SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| + SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), + SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), + SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), + SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) +} SDL_EventMask ; +#define SDL_ALLEVENTS 0xFFFFFFFF +/*@}*/ + +/** Application visibility event structure */ +typedef struct SDL_ActiveEvent { + Uint8 type; /**< SDL_ACTIVEEVENT */ + Uint8 gain; /**< Whether given states were gained or lost (1/0) */ + Uint8 state; /**< A mask of the focus states */ +} SDL_ActiveEvent; + +/** Keyboard event structure */ +typedef struct SDL_KeyboardEvent { + Uint8 type; /**< SDL_KEYDOWN or SDL_KEYUP */ + Uint8 which; /**< The keyboard device index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + SDL_keysym keysym; +} SDL_KeyboardEvent; + +/** Mouse motion event structure */ +typedef struct SDL_MouseMotionEvent { + Uint8 type; /**< SDL_MOUSEMOTION */ + Uint8 which; /**< The mouse device index */ + Uint8 state; /**< The current button state */ + Uint16 x, y; /**< The X/Y coordinates of the mouse */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** Mouse button event structure */ +typedef struct SDL_MouseButtonEvent { + Uint8 type; /**< SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ + Uint8 which; /**< The mouse device index */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + Uint16 x, y; /**< The X/Y coordinates of the mouse at press time */ +} SDL_MouseButtonEvent; + +/** Joystick axis motion event structure */ +typedef struct SDL_JoyAxisEvent { + Uint8 type; /**< SDL_JOYAXISMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 axis; /**< The joystick axis index */ + Sint16 value; /**< The axis value (range: -32768 to 32767) */ +} SDL_JoyAxisEvent; + +/** Joystick trackball motion event structure */ +typedef struct SDL_JoyBallEvent { + Uint8 type; /**< SDL_JOYBALLMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 ball; /**< The joystick trackball index */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** Joystick hat position change event structure */ +typedef struct SDL_JoyHatEvent { + Uint8 type; /**< SDL_JOYHATMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value: + * SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP + * SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT + * SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN + * Note that zero means the POV is centered. + */ +} SDL_JoyHatEvent; + +/** Joystick button event structure */ +typedef struct SDL_JoyButtonEvent { + Uint8 type; /**< SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ + Uint8 which; /**< The joystick device index */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ +} SDL_JoyButtonEvent; + +/** The "window resized" event + * When you get this event, you are responsible for setting a new video + * mode with the new width and height. + */ +typedef struct SDL_ResizeEvent { + Uint8 type; /**< SDL_VIDEORESIZE */ + int w; /**< New width */ + int h; /**< New height */ +} SDL_ResizeEvent; + +/** The "screen redraw" event */ +typedef struct SDL_ExposeEvent { + Uint8 type; /**< SDL_VIDEOEXPOSE */ +} SDL_ExposeEvent; + +/** The "quit requested" event */ +typedef struct SDL_QuitEvent { + Uint8 type; /**< SDL_QUIT */ +} SDL_QuitEvent; + +/** A user-defined event type */ +typedef struct SDL_UserEvent { + Uint8 type; /**< SDL_USEREVENT through SDL_NUMEVENTS-1 */ + int code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + +/** If you want to use this event, you should include SDL_syswm.h */ +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; +typedef struct SDL_SysWMEvent { + Uint8 type; + SDL_SysWMmsg *msg; +} SDL_SysWMEvent; + +/** General event structure */ +typedef union SDL_Event { + Uint8 type; + SDL_ActiveEvent active; + SDL_KeyboardEvent key; + SDL_MouseMotionEvent motion; + SDL_MouseButtonEvent button; + SDL_JoyAxisEvent jaxis; + SDL_JoyBallEvent jball; + SDL_JoyHatEvent jhat; + SDL_JoyButtonEvent jbutton; + SDL_ResizeEvent resize; + SDL_ExposeEvent expose; + SDL_QuitEvent quit; + SDL_UserEvent user; + SDL_SysWMEvent syswm; +} SDL_Event; + + +/* Function prototypes */ + +/** Pumps the event loop, gathering events from the input devices. + * This function updates the event queue and internal input device state. + * This should only be run in the thread that sets the video mode. + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +typedef enum { + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Checks the event queue for messages and optionally returns them. + * + * If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to + * the back of the event queue. + * If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will not + * be removed from the queue. + * If 'action' is SDL_GETEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will be + * removed from the queue. + * + * @return + * This function returns the number of events actually stored, or -1 + * if there was an error. + * + * This function is thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, + SDL_eventaction action, Uint32 mask); + +/** Polls for currently pending events, and returns 1 if there are any pending + * events, or 0 if there are none available. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); + +/** Waits indefinitely for the next available event, returning 1, or 0 if there + * was an error while waiting for events. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); + +/** Add an event to the event queue. + * This function returns 0 on success, or -1 if the event queue was full + * or there was some other error. + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); + +/** @name Event Filtering */ +/*@{*/ +typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); +/** + * This function sets up a filter to process all events before they + * change internal state and are posted to the internal event queue. + * + * The filter is protypted as: + * @code typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); @endcode + * + * If the filter returns 1, then the event will be added to the internal queue. + * If it returns 0, then the event will be dropped from the queue, but the + * internal state will still be updated. This allows selective filtering of + * dynamically arriving events. + * + * @warning Be very careful of what you do in the event filter function, as + * it may run in a different thread! + * + * There is one caveat when dealing with the SDL_QUITEVENT event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will + * be closed, otherwise the window will remain open if possible. + * If the quit event is generated by an interrupt signal, it will bypass the + * internal queue and be delivered to the application at the next event poll. + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); + +/** + * Return the current event filter - can be used to "chain" filters. + * If there is no event filter set, this function returns NULL. + */ +extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); +/*@}*/ + +/** @name Event State */ +/*@{*/ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 +/*@}*/ + +/** +* This function allows you to set the state of processing certain events. +* If 'state' is set to SDL_IGNORE, that event will be automatically dropped +* from the event queue and will not event be filtered. +* If 'state' is set to SDL_ENABLE, that event will be processed normally. +* If 'state' is set to SDL_QUERY, SDL_EventState() will return the +* current processing state of the specified event. +*/ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_events_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_getenv.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_getenv.h new file mode 100644 index 00000000..bea63007 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_getenv.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_getenv.h + * @deprecated Use SDL_stdinc.h instead + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_joystick.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_joystick.h new file mode 100644 index 00000000..708d1a9f --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_joystick.h @@ -0,0 +1,187 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_joystick.h + * Include file for SDL joystick event handling + */ + +#ifndef _SDL_joystick_h +#define _SDL_joystick_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_joystick.h + * @note In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + */ + +/** The joystick structure used to identify an SDL joystick */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* Function prototypes */ +/** + * Count the number of joysticks attached to the system + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char * SDLCALL SDL_JoystickName(int device_index); + +/** + * Open a joystick for use. + * + * @param[in] device_index + * The index passed as an argument refers to + * the N'th joystick on the system. This index is the value which will + * identify this joystick in future joystick events. + * + * @return This function returns a joystick identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_Joystick * SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Returns 1 if the joystick has been opened, or 0 if it has not. + */ +extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); + +/** + * Get the device index of an opened joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick *joystick); + +/** + * Get the number of general axis controls on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); + +/** + * Get the number of trackballs on a joystick + * + * Joystick trackballs have only relative motion events associated + * with them and their state cannot be polled. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); + +/** + * Get the number of POV hats on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); + +/** + * Get the number of buttons on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and check the state of the joystick when you want joystick + * information. + * + * @param[in] state The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +/** + * Get the current state of an axis control on a joystick + * + * @param[in] axis The axis indices start at index 0. + * + * @return The state is a value ranging from -32768 to 32767. + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); + +/** + * @name Hat Positions + * The return value of SDL_JoystickGetHat() is one of the following positions: + */ +/*@{*/ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/*@}*/ + +/** + * Get the current state of a POV hat on a joystick + * + * @param[in] hat The hat indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); + +/** + * Get the ball axis change since the last poll + * + * @param[in] ball The ball indices start at index 0. + * + * @return This returns 0, or -1 if you passed it invalid parameters. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick + * + * @param[in] button The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, int button); + +/** + * Close a joystick previously opened with SDL_JoystickOpen() + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_joystick_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keyboard.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keyboard.h new file mode 100644 index 00000000..9d7129c5 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keyboard.h @@ -0,0 +1,135 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_keyboard.h + * Include file for SDL keyboard event handling + */ + +#ifndef _SDL_keyboard_h +#define _SDL_keyboard_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keysym.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Keysym structure + * + * - The scancode is hardware dependent, and should not be used by general + * applications. If no hardware scancode is available, it will be 0. + * + * - The 'unicode' translated character is only available when character + * translation is enabled by the SDL_EnableUNICODE() API. If non-zero, + * this is a UNICODE character corresponding to the keypress. If the + * high 9 bits of the character are 0, then this maps to the equivalent + * ASCII character: + * @code + * char ch; + * if ( (keysym.unicode & 0xFF80) == 0 ) { + * ch = keysym.unicode & 0x7F; + * } else { + * An international character.. + * } + * @endcode + */ +typedef struct SDL_keysym { + Uint8 scancode; /**< hardware specific scancode */ + SDLKey sym; /**< SDL virtual keysym */ + SDLMod mod; /**< current key modifiers */ + Uint16 unicode; /**< translated character */ +} SDL_keysym; + +/** This is the mask which refers to all hotkey bindings */ +#define SDL_ALL_HOTKEYS 0xFFFFFFFF + +/* Function prototypes */ +/** + * Enable/Disable UNICODE translation of keyboard input. + * + * This translation has some overhead, so translation defaults off. + * + * @param[in] enable + * If 'enable' is 1, translation is enabled. + * If 'enable' is 0, translation is disabled. + * If 'enable' is -1, the translation state is not changed. + * + * @return It returns the previous state of keyboard translation. + */ +extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); + +#define SDL_DEFAULT_REPEAT_DELAY 500 +#define SDL_DEFAULT_REPEAT_INTERVAL 30 +/** + * Enable/Disable keyboard repeat. Keyboard repeat defaults to off. + * + * @param[in] delay + * 'delay' is the initial delay in ms between the time when a key is + * pressed, and keyboard repeat begins. + * + * @param[in] interval + * 'interval' is the time in ms between keyboard repeat events. + * + * If 'delay' is set to 0, keyboard repeat is disabled. + */ +extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); +extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); + +/** + * Get a snapshot of the current state of the keyboard. + * Returns an array of keystates, indexed by the SDLK_* syms. + * Usage: + * @code + * Uint8 *keystate = SDL_GetKeyState(NULL); + * if ( keystate[SDLK_RETURN] ) //... \ is pressed. + * @endcode + */ +extern DECLSPEC Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); + +/** + * Get the current key modifier state + */ +extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); + +/** + * Set the current key modifier state. + * This does not change the keyboard state, only the key modifier flags. + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); + +/** + * Get the name of an SDL virtual keysym + */ +extern DECLSPEC char * SDLCALL SDL_GetKeyName(SDLKey key); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_keyboard_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keysym.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keysym.h new file mode 100644 index 00000000..f2ad12b8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_keysym.h @@ -0,0 +1,326 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_keysym_h +#define _SDL_keysym_h + +/** What we really want is a mapping of every raw key on the keyboard. + * To support international keyboards, we use the range 0xA1 - 0xFF + * as international virtual keycodes. We'll follow in the footsteps of X11... + * @brief The names of the keys + */ +typedef enum { + /** @name ASCII mapped keysyms + * The keyboard syms have been cleverly chosen to map to ASCII + */ + /*@{*/ + SDLK_UNKNOWN = 0, + SDLK_FIRST = 0, + SDLK_BACKSPACE = 8, + SDLK_TAB = 9, + SDLK_CLEAR = 12, + SDLK_RETURN = 13, + SDLK_PAUSE = 19, + SDLK_ESCAPE = 27, + SDLK_SPACE = 32, + SDLK_EXCLAIM = 33, + SDLK_QUOTEDBL = 34, + SDLK_HASH = 35, + SDLK_DOLLAR = 36, + SDLK_AMPERSAND = 38, + SDLK_QUOTE = 39, + SDLK_LEFTPAREN = 40, + SDLK_RIGHTPAREN = 41, + SDLK_ASTERISK = 42, + SDLK_PLUS = 43, + SDLK_COMMA = 44, + SDLK_MINUS = 45, + SDLK_PERIOD = 46, + SDLK_SLASH = 47, + SDLK_0 = 48, + SDLK_1 = 49, + SDLK_2 = 50, + SDLK_3 = 51, + SDLK_4 = 52, + SDLK_5 = 53, + SDLK_6 = 54, + SDLK_7 = 55, + SDLK_8 = 56, + SDLK_9 = 57, + SDLK_COLON = 58, + SDLK_SEMICOLON = 59, + SDLK_LESS = 60, + SDLK_EQUALS = 61, + SDLK_GREATER = 62, + SDLK_QUESTION = 63, + SDLK_AT = 64, + /* + Skip uppercase letters + */ + SDLK_LEFTBRACKET = 91, + SDLK_BACKSLASH = 92, + SDLK_RIGHTBRACKET = 93, + SDLK_CARET = 94, + SDLK_UNDERSCORE = 95, + SDLK_BACKQUOTE = 96, + SDLK_a = 97, + SDLK_b = 98, + SDLK_c = 99, + SDLK_d = 100, + SDLK_e = 101, + SDLK_f = 102, + SDLK_g = 103, + SDLK_h = 104, + SDLK_i = 105, + SDLK_j = 106, + SDLK_k = 107, + SDLK_l = 108, + SDLK_m = 109, + SDLK_n = 110, + SDLK_o = 111, + SDLK_p = 112, + SDLK_q = 113, + SDLK_r = 114, + SDLK_s = 115, + SDLK_t = 116, + SDLK_u = 117, + SDLK_v = 118, + SDLK_w = 119, + SDLK_x = 120, + SDLK_y = 121, + SDLK_z = 122, + SDLK_DELETE = 127, + /* End of ASCII mapped keysyms */ + /*@}*/ + + /** @name International keyboard syms */ + /*@{*/ + SDLK_WORLD_0 = 160, /* 0xA0 */ + SDLK_WORLD_1 = 161, + SDLK_WORLD_2 = 162, + SDLK_WORLD_3 = 163, + SDLK_WORLD_4 = 164, + SDLK_WORLD_5 = 165, + SDLK_WORLD_6 = 166, + SDLK_WORLD_7 = 167, + SDLK_WORLD_8 = 168, + SDLK_WORLD_9 = 169, + SDLK_WORLD_10 = 170, + SDLK_WORLD_11 = 171, + SDLK_WORLD_12 = 172, + SDLK_WORLD_13 = 173, + SDLK_WORLD_14 = 174, + SDLK_WORLD_15 = 175, + SDLK_WORLD_16 = 176, + SDLK_WORLD_17 = 177, + SDLK_WORLD_18 = 178, + SDLK_WORLD_19 = 179, + SDLK_WORLD_20 = 180, + SDLK_WORLD_21 = 181, + SDLK_WORLD_22 = 182, + SDLK_WORLD_23 = 183, + SDLK_WORLD_24 = 184, + SDLK_WORLD_25 = 185, + SDLK_WORLD_26 = 186, + SDLK_WORLD_27 = 187, + SDLK_WORLD_28 = 188, + SDLK_WORLD_29 = 189, + SDLK_WORLD_30 = 190, + SDLK_WORLD_31 = 191, + SDLK_WORLD_32 = 192, + SDLK_WORLD_33 = 193, + SDLK_WORLD_34 = 194, + SDLK_WORLD_35 = 195, + SDLK_WORLD_36 = 196, + SDLK_WORLD_37 = 197, + SDLK_WORLD_38 = 198, + SDLK_WORLD_39 = 199, + SDLK_WORLD_40 = 200, + SDLK_WORLD_41 = 201, + SDLK_WORLD_42 = 202, + SDLK_WORLD_43 = 203, + SDLK_WORLD_44 = 204, + SDLK_WORLD_45 = 205, + SDLK_WORLD_46 = 206, + SDLK_WORLD_47 = 207, + SDLK_WORLD_48 = 208, + SDLK_WORLD_49 = 209, + SDLK_WORLD_50 = 210, + SDLK_WORLD_51 = 211, + SDLK_WORLD_52 = 212, + SDLK_WORLD_53 = 213, + SDLK_WORLD_54 = 214, + SDLK_WORLD_55 = 215, + SDLK_WORLD_56 = 216, + SDLK_WORLD_57 = 217, + SDLK_WORLD_58 = 218, + SDLK_WORLD_59 = 219, + SDLK_WORLD_60 = 220, + SDLK_WORLD_61 = 221, + SDLK_WORLD_62 = 222, + SDLK_WORLD_63 = 223, + SDLK_WORLD_64 = 224, + SDLK_WORLD_65 = 225, + SDLK_WORLD_66 = 226, + SDLK_WORLD_67 = 227, + SDLK_WORLD_68 = 228, + SDLK_WORLD_69 = 229, + SDLK_WORLD_70 = 230, + SDLK_WORLD_71 = 231, + SDLK_WORLD_72 = 232, + SDLK_WORLD_73 = 233, + SDLK_WORLD_74 = 234, + SDLK_WORLD_75 = 235, + SDLK_WORLD_76 = 236, + SDLK_WORLD_77 = 237, + SDLK_WORLD_78 = 238, + SDLK_WORLD_79 = 239, + SDLK_WORLD_80 = 240, + SDLK_WORLD_81 = 241, + SDLK_WORLD_82 = 242, + SDLK_WORLD_83 = 243, + SDLK_WORLD_84 = 244, + SDLK_WORLD_85 = 245, + SDLK_WORLD_86 = 246, + SDLK_WORLD_87 = 247, + SDLK_WORLD_88 = 248, + SDLK_WORLD_89 = 249, + SDLK_WORLD_90 = 250, + SDLK_WORLD_91 = 251, + SDLK_WORLD_92 = 252, + SDLK_WORLD_93 = 253, + SDLK_WORLD_94 = 254, + SDLK_WORLD_95 = 255, /* 0xFF */ + /*@}*/ + + /** @name Numeric keypad */ + /*@{*/ + SDLK_KP0 = 256, + SDLK_KP1 = 257, + SDLK_KP2 = 258, + SDLK_KP3 = 259, + SDLK_KP4 = 260, + SDLK_KP5 = 261, + SDLK_KP6 = 262, + SDLK_KP7 = 263, + SDLK_KP8 = 264, + SDLK_KP9 = 265, + SDLK_KP_PERIOD = 266, + SDLK_KP_DIVIDE = 267, + SDLK_KP_MULTIPLY = 268, + SDLK_KP_MINUS = 269, + SDLK_KP_PLUS = 270, + SDLK_KP_ENTER = 271, + SDLK_KP_EQUALS = 272, + /*@}*/ + + /** @name Arrows + Home/End pad */ + /*@{*/ + SDLK_UP = 273, + SDLK_DOWN = 274, + SDLK_RIGHT = 275, + SDLK_LEFT = 276, + SDLK_INSERT = 277, + SDLK_HOME = 278, + SDLK_END = 279, + SDLK_PAGEUP = 280, + SDLK_PAGEDOWN = 281, + /*@}*/ + + /** @name Function keys */ + /*@{*/ + SDLK_F1 = 282, + SDLK_F2 = 283, + SDLK_F3 = 284, + SDLK_F4 = 285, + SDLK_F5 = 286, + SDLK_F6 = 287, + SDLK_F7 = 288, + SDLK_F8 = 289, + SDLK_F9 = 290, + SDLK_F10 = 291, + SDLK_F11 = 292, + SDLK_F12 = 293, + SDLK_F13 = 294, + SDLK_F14 = 295, + SDLK_F15 = 296, + /*@}*/ + + /** @name Key state modifier keys */ + /*@{*/ + SDLK_NUMLOCK = 300, + SDLK_CAPSLOCK = 301, + SDLK_SCROLLOCK = 302, + SDLK_RSHIFT = 303, + SDLK_LSHIFT = 304, + SDLK_RCTRL = 305, + SDLK_LCTRL = 306, + SDLK_RALT = 307, + SDLK_LALT = 308, + SDLK_RMETA = 309, + SDLK_LMETA = 310, + SDLK_LSUPER = 311, /**< Left "Windows" key */ + SDLK_RSUPER = 312, /**< Right "Windows" key */ + SDLK_MODE = 313, /**< "Alt Gr" key */ + SDLK_COMPOSE = 314, /**< Multi-key compose key */ + /*@}*/ + + /** @name Miscellaneous function keys */ + /*@{*/ + SDLK_HELP = 315, + SDLK_PRINT = 316, + SDLK_SYSREQ = 317, + SDLK_BREAK = 318, + SDLK_MENU = 319, + SDLK_POWER = 320, /**< Power Macintosh power key */ + SDLK_EURO = 321, /**< Some european keyboards */ + SDLK_UNDO = 322, /**< Atari keyboard has Undo */ + /*@}*/ + + /* Add any other keys here */ + + SDLK_LAST +} SDLKey; + +/** Enumeration of valid key mods (possibly OR'd together) */ +typedef enum { + KMOD_NONE = 0x0000, + KMOD_LSHIFT= 0x0001, + KMOD_RSHIFT= 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LMETA = 0x0400, + KMOD_RMETA = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDLMod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_META (KMOD_LMETA|KMOD_RMETA) + +#endif /* _SDL_keysym_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_loadso.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_loadso.h new file mode 100644 index 00000000..0c5e5362 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_loadso.h @@ -0,0 +1,78 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_loadso.h + * System dependent library loading routines + */ + +/** @file SDL_loadso.h + * Some things to keep in mind: + * - These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * - Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * - Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + + +#ifndef _SDL_loadso_h +#define _SDL_loadso_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This function dynamically loads a shared object and returns a pointer + * to the object handle (or NULL if there was an error). + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Given an object handle, this function looks up the address of the + * named function in the shared object and returns it. This address + * is no longer valid after calling SDL_UnloadObject(). + */ +extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); + +/** Unload a shared object from memory */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_loadso_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_main.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_main.h new file mode 100644 index 00000000..ab50ef1e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_main.h @@ -0,0 +1,106 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_main_h +#define _SDL_main_h + +#include "SDL_stdinc.h" + +/** @file SDL_main.h + * Redefine main() on Win32 and MacOS so that it is called by winmain.c + */ + +#if defined(__WIN32__) || \ + (defined(__MWERKS__) && !defined(__BEOS__)) || \ + defined(__MACOS__) || defined(__MACOSX__) || \ + defined(__SYMBIAN32__) || defined(QWS) + +#ifdef __cplusplus +#define C_LINKAGE "C" +#else +#define C_LINKAGE +#endif /* __cplusplus */ + +/** The application's main() function must be called with C linkage, + * and should be declared like this: + * @code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * @endcode + */ +#define main SDL_main + +/** The prototype for the application's main() function */ +extern C_LINKAGE int SDL_main(int argc, char *argv[]); + + +/** @name From the SDL library code -- needed for registering the app on Win32 */ +/*@{*/ +#ifdef __WIN32__ + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** This should be called from your WinMain() function, if any */ +extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); +/** This can also be called, but is no longer necessary */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); +/** This can also be called, but is no longer necessary (SDL_Quit calls it) */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +/** @name From the SDL library code -- needed for registering QuickDraw on MacOS */ +/*@{*/ +#if defined(__MACOS__) + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** Forward declaration so we don't need to include QuickDraw.h */ +struct QDGlobals; + +/** This should be called from your main() function, if any */ +extern DECLSPEC void SDLCALL SDL_InitQuickDraw(struct QDGlobals *the_qd); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +#endif /* Need to redefine main()? */ + +#endif /* _SDL_main_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mouse.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mouse.h new file mode 100644 index 00000000..7c563b94 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mouse.h @@ -0,0 +1,143 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_mouse.h + * Include file for SDL mouse event handling + */ + +#ifndef _SDL_mouse_h +#define _SDL_mouse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct WMcursor WMcursor; /**< Implementation dependent */ +typedef struct SDL_Cursor { + SDL_Rect area; /**< The area of the mouse cursor */ + Sint16 hot_x, hot_y; /**< The "tip" of the cursor */ + Uint8 *data; /**< B/W cursor data */ + Uint8 *mask; /**< B/W cursor mask */ + Uint8 *save[2]; /**< Place to save cursor area */ + WMcursor *wm_cursor; /**< Window-manager cursor */ +} SDL_Cursor; + +/* Function prototypes */ +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * current mouse cursor position. You can pass NULL for either x or y. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState(). + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * Set the position of the mouse cursor (generates a mouse motion event) + */ +extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); + +/** + * Create a cursor using the specified data and mask (in MSB format). + * The cursor width must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * data mask resulting pixel on screen + * 0 1 White + * 1 1 Black + * 0 0 Transparent + * 1 0 Inverted color if possible, black if not. + * + * Cursors created with this function must be freed with SDL_FreeCursor(). + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor + (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); + +/** + * Set the currently active cursor to the specified one. + * If the cursor is currently visible, the change will be immediately + * represented on the display. + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor *cursor); + +/** + * Returns the currently active cursor. + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); + +/** + * Deallocates a cursor created with SDL_CreateCursor(). + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor *cursor); + +/** + * Toggle whether or not the cursor is shown on the screen. + * The cursor start off displayed, but can be turned off. + * SDL_ShowCursor() returns 1 if the cursor was being displayed + * before the call, or 0 if it was not. You can query the current + * state by passing a 'toggle' value of -1. + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/*@{*/ +/** Used as a mask when testing buttons in buttonstate + * Button 1: Left mouse button + * Button 2: Middle mouse button + * Button 3: Right mouse button + * Button 4: Mouse wheel up (may also be a real button) + * Button 5: Mouse wheel down (may also be a real button) + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_WHEELUP 4 +#define SDL_BUTTON_WHEELDOWN 5 +#define SDL_BUTTON_X1 6 +#define SDL_BUTTON_X2 7 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mouse_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mutex.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mutex.h new file mode 100644 index 00000000..c8da9b1a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_mutex.h @@ -0,0 +1,177 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_mutex_h +#define _SDL_mutex_h + +/** @file SDL_mutex.h + * Functions to provide thread synchronization primitives + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** This is the timeout value which corresponds to never time out */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Mutex functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL mutex structure, defined in SDL_mutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** Create a mutex, initialized unlocked */ +extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void); + +#define SDL_LockMutex(m) SDL_mutexP(m) +/** Lock the mutex + * @return 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex); + +#define SDL_UnlockMutex(m) SDL_mutexV(m) +/** Unlock the mutex + * @return 0, or -1 on error + * + * It is an error to unlock a mutex that has not been locked by + * the current thread, and doing so results in undefined behavior. + */ +extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex); + +/** Destroy a mutex */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Semaphore functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL semaphore structure, defined in SDL_sem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** Create a semaphore, initialized with value, returns NULL on failure. */ +extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** Destroy a semaphore */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem); + +/** + * This function suspends the calling thread until the semaphore pointed + * to by sem has a positive count. It then atomically decreases the semaphore + * count. + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem); + +/** Non-blocking variant of SDL_SemWait(). + * @return 0 if the wait succeeds, + * SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem); + +/** Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if + * the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in + * the allotted time, and -1 on error. + * + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms); + +/** Atomically increases the semaphore's count (not blocking). + * @return 0, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem); + +/** Returns the current count of the semaphore */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Condition_variable_functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*@{*/ +/** The SDL condition variable structure, defined in SDL_cond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; +/*@}*/ + +/** Create a condition variable */ +extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void); + +/** Destroy a condition variable */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond); + +/** Restart one of the threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond); + +/** Restart all threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond); + +/** Wait on the condition variable, unlocking the provided mutex. + * The mutex must be locked before entering this function! + * The mutex is re-locked once the condition variable is signaled. + * @return 0 when it is signaled, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); + +/** Waits for at most 'ms' milliseconds, and returns 0 if the condition + * variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not + * signaled in the allotted time, and -1 on error. + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mutex_h */ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_name.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_name.h new file mode 100644 index 00000000..511619af --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_name.h @@ -0,0 +1,11 @@ + +#ifndef _SDLname_h_ +#define _SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* _SDLname_h_ */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_opengl.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_opengl.h new file mode 100644 index 00000000..3d791d69 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_opengl.h @@ -0,0 +1,6570 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_opengl.h + * This is a simple file to encapsulate the OpenGL API headers + */ + +#include "SDL_config.h" + +#ifdef __WIN32__ +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +#define NOMINMAX /* Don't defined min() and max() */ +#endif +#include +#endif +#ifndef NO_SDL_GLEXT +#define __glext_h_ /* Don't let gl.h include glext.h */ +#endif +#if defined(__MACOSX__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#elif defined(__MACOS__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#else +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#endif +#ifndef NO_SDL_GLEXT +#undef __glext_h_ +#endif + +/** @name GLext.h + * This file taken from "GLext.h" from the Jeff Molofee OpenGL tutorials. + * It is included here because glext.h is not available on some systems. + * If you don't want this version included, simply define "NO_SDL_GLEXT" + */ +/*@{*/ +#ifndef NO_SDL_GLEXT +#if !defined(__glext_h_) && !defined(GL_GLEXT_LEGACY) +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2005/06/20 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 29 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; /* native character */ +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptr; +typedef long GLsizeiptr; +#else +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptrARB; +typedef long GLsizeiptrARB; +#else +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and program/shader text */ +typedef char GLcharARB; /* native character */ +#if defined(__APPLE__) +typedef void *GLhandleARB; /* shader object handle */ +#else +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif +#endif + +/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendEquation (GLenum); +GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogram (GLenum); +GLAPI void APIENTRY glResetMinmax (GLenum); +GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum); +GLAPI void APIENTRY glClientActiveTexture (GLenum); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glFogCoordf (GLfloat); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *); +GLAPI void APIENTRY glFogCoordd (GLdouble); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameteri (GLenum, GLint); +GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos2i (GLint, GLint); +GLAPI void APIENTRY glWindowPos2iv (const GLint *); +GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *); +GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3iv (const GLint *); +GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQuery (GLuint); +GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void APIENTRY glEndQuery (GLenum); +GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint); +GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); +GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); +GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); +GLAPI void APIENTRY glAttachShader (GLuint, GLuint); +GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); +GLAPI void APIENTRY glCompileShader (GLuint); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum); +GLAPI void APIENTRY glDeleteProgram (GLuint); +GLAPI void APIENTRY glDeleteShader (GLuint); +GLAPI void APIENTRY glDetachShader (GLuint, GLuint); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); +GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgram (GLuint); +GLAPI GLboolean APIENTRY glIsShader (GLuint); +GLAPI void APIENTRY glLinkProgram (GLuint); +GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); +GLAPI void APIENTRY glUseProgram (GLuint); +GLAPI void APIENTRY glUniform1f (GLint, GLfloat); +GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1i (GLint, GLint); +GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glValidateProgram (GLuint); +GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); +GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); +GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void APIENTRY glEndQueryARB (GLenum); +GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1iARB (GLint, GLint); +GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogramEXT (GLenum); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint); +GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void APIENTRY glDeformSGIX (GLbitfield); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum); +GLAPI void APIENTRY glTextureLightEXT (GLenum); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *); +GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); +GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFinishFenceNV (GLuint); +GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); +GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif +#endif /* NO_SDL_GLEXT */ +/*@}*/ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_platform.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_platform.h new file mode 100644 index 00000000..48540a85 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_platform.h @@ -0,0 +1,110 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_platform.h + * Try to get a standard set of platform defines + */ + +#ifndef _SDL_platform_h +#define _SDL_platform_h + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__BEOS__) +#undef __BEOS__ +#define __BEOS__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(__APPLE__) +#undef __MACOSX__ +#define __MACOSX__ 1 +#elif defined(macintosh) +#undef __MACOS__ +#define __MACOS__ 1 +#endif +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif +#if defined(WIN32) || defined(_WIN32) +#undef __WIN32__ +#define __WIN32__ 1 +#endif + +#endif /* _SDL_platform_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_quit.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_quit.h new file mode 100644 index 00000000..abd2ec6c --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_quit.h @@ -0,0 +1,55 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_quit.h + * Include file for SDL quit event handling + */ + +#ifndef _SDL_quit_h +#define _SDL_quit_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** @file SDL_quit.h + * An SDL_QUITEVENT is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate SDL_QUITEVENT events as well. There is no way + * to determine the cause of an SDL_QUITEVENT, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + */ + +/** @file SDL_quit.h + * There are no functions directly affecting the quit event + */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) + +#endif /* _SDL_quit_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_rwops.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_rwops.h new file mode 100644 index 00000000..98361d7e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_rwops.h @@ -0,0 +1,155 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_rwops.h + * This file provides a general interface for SDL to read and write + * data sources. It can easily be extended to files, memory, etc. + */ + +#ifndef _SDL_rwops_h +#define _SDL_rwops_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the read/write operation structure -- very basic */ + +typedef struct SDL_RWops { + /** Seek to 'offset' relative to whence, one of stdio's whence values: + * SEEK_SET, SEEK_CUR, SEEK_END + * Returns the final offset in the data source. + */ + int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence); + + /** Read up to 'maxnum' objects each of size 'size' from the data + * source to the area pointed at by 'ptr'. + * Returns the number of objects read, or -1 if the read failed. + */ + int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); + + /** Write exactly 'num' objects each of size 'objsize' from the area + * pointed at by 'ptr' to data source. + * Returns 'num', or -1 if the write failed. + */ + int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num); + + /** Close and free an allocated SDL_FSops structure */ + int (SDLCALL *close)(struct SDL_RWops *context); + + Uint32 type; + union { +#if defined(__WIN32__) && !defined(__SYMBIAN32__) + struct { + int append; + void *h; + struct { + void *data; + int size; + int left; + } buffer; + } win32io; +#endif +#ifdef HAVE_STDIO_H + struct { + int autoclose; + FILE *fp; + } stdio; +#endif + struct { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct { + void *data1; + } unknown; + } hidden; + +} SDL_RWops; + + +/** @name Functions to create SDL_RWops structures from various data sources */ +/*@{*/ + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); + +#ifdef HAVE_STDIO_H +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); +#endif + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); + +extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); + +/*@}*/ + +/** @name Seek Reference Points */ +/*@{*/ +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ +/*@}*/ + +/** @name Macros to easily read and write from an SDL_RWops structure */ +/*@{*/ +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) +/*@}*/ + +/** @name Read an item of the specified endianness and return in native format */ +/*@{*/ +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); +/*@}*/ + +/** @name Write an item of native format to the specified endianness */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); +extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rwops_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_stdinc.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_stdinc.h new file mode 100644 index 00000000..35a4fdde --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_stdinc.h @@ -0,0 +1,620 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_stdinc.h + * This is a general header that includes C language support + */ + +#ifndef _SDL_stdinc_h +#define _SDL_stdinc_h + +#include "SDL_config.h" + + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +# include +#endif + +/** The number of elements in an array */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/* Use proper C++ casts when compiled as C++ to be compatible with the option + -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above. */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#endif + +/** @name Basic data types */ +/*@{*/ +typedef enum { + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; + +typedef int8_t Sint8; +typedef uint8_t Uint8; +typedef int16_t Sint16; +typedef uint16_t Uint16; +typedef int32_t Sint32; +typedef uint32_t Uint32; + +#ifdef SDL_HAS_64BIT_TYPE +typedef int64_t Sint64; +#ifndef SYMBIAN32_GCCE +typedef uint64_t Uint64; +#endif +#else +/* This is really just a hack to prevent the compiler from complaining */ +typedef struct { + Uint32 hi; + Uint32 lo; +} Uint64, Sint64; +#endif + +/*@}*/ + +/** @name Make sure the types really have the right sizes */ +/*@{*/ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] + +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +/*@}*/ + +/** @name Enum Size Check + * Check to make sure enums are the size of ints, for structure packing. + * For both Watcom C/C++ and Borland C/C++ the compiler option that makes + * enums having the size of an int must be enabled. + * This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). + */ +/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ +#ifdef __MWERKS__ +#pragma enumsalwaysint on +#endif + +typedef enum { + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +#ifndef __NDS__ +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +/*@}*/ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_MALLOC +#define SDL_malloc malloc +#else +extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); +#endif + +#ifdef HAVE_CALLOC +#define SDL_calloc calloc +#else +extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); +#endif + +#ifdef HAVE_REALLOC +#define SDL_realloc realloc +#else +extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); +#endif + +#ifdef HAVE_FREE +#define SDL_free free +#else +extern DECLSPEC void SDLCALL SDL_free(void *mem); +#endif + +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) + #pragma alloca +# elif defined(__MRC__) + void *alloca (unsigned); +# else + char *alloca (); +# endif +#endif +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +#ifdef HAVE_GETENV +#define SDL_getenv getenv +#else +extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); +#endif + +#ifdef HAVE_PUTENV +#define SDL_putenv putenv +#else +extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); +#endif + +#ifdef HAVE_QSORT +#define SDL_qsort qsort +#else +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, + int (*compare)(const void *, const void *)); +#endif + +#ifdef HAVE_ABS +#define SDL_abs abs +#else +#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) +#endif + +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +#ifdef HAVE_CTYPE_H +#define SDL_isdigit(X) isdigit(X) +#define SDL_isspace(X) isspace(X) +#define SDL_toupper(X) toupper(X) +#define SDL_tolower(X) tolower(X) +#else +#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) +#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) +#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) +#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) +#endif + +#ifdef HAVE_MEMSET +#define SDL_memset memset +#else +extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_memset4(dst, val, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; stosl\n\t" \ + : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memset4 +#define SDL_memset4(dst, val, len) \ +do { \ + unsigned _count = (len); \ + unsigned _n = (_count + 3) / 4; \ + Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ + Uint32 _val = (val); \ + if (len == 0) break; \ + switch (_count % 4) { \ + case 0: do { *_p++ = _val; \ + case 3: *_p++ = _val; \ + case 2: *_p++ = _val; \ + case 1: *_p++ = _val; \ + } while ( --_n ); \ + } \ +} while(0) +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl\n\t" \ + "testb $2,%b4\n\t" \ + "je 1f\n\t" \ + "movsw\n" \ + "1:\ttestb $1,%b4\n\t" \ + "je 2f\n\t" \ + "movsb\n" \ + "2:" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy +#ifdef HAVE_MEMCPY +#define SDL_memcpy memcpy +#elif defined(HAVE_BCOPY) +#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) +#else +extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); +#endif +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy4(dst, src, len) \ +do { \ + int ecx, edi, esi; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl" \ + : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ + : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy4 +#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_revcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + char *dstp = SDL_static_cast(char *, dst); \ + char *srcp = SDL_static_cast(char *, src); \ + int n = (len); \ + if ( n >= 4 ) { \ + __asm__ __volatile__ ( \ + "std\n\t" \ + "rep ; movsl\n\t" \ + "cld\n\t" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (n >> 2), \ + "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ + : "memory" ); \ + } \ + switch (n & 3) { \ + case 3: dstp[2] = srcp[2]; \ + case 2: dstp[1] = srcp[1]; \ + case 1: dstp[0] = srcp[0]; \ + break; \ + default: \ + break; \ + } \ +} while(0) +#endif +#ifndef SDL_revcpy +extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); +#endif + +#ifdef HAVE_MEMMOVE +#define SDL_memmove memmove +#elif defined(HAVE_BCOPY) +#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) +#else +#define SDL_memmove(dst, src, len) \ +do { \ + if ( dst < src ) { \ + SDL_memcpy(dst, src, len); \ + } else { \ + SDL_revcpy(dst, src, len); \ + } \ +} while(0) +#endif + +#ifdef HAVE_MEMCMP +#define SDL_memcmp memcmp +#else +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); +#endif + +#ifdef HAVE_STRLEN +#define SDL_strlen strlen +#else +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); +#endif + +#ifdef HAVE_STRLCPY +#define SDL_strlcpy strlcpy +#else +extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRLCAT +#define SDL_strlcat strlcat +#else +extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRDUP +#define SDL_strdup strdup +#else +extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); +#endif + +#ifdef HAVE__STRREV +#define SDL_strrev _strrev +#else +extern DECLSPEC char * SDLCALL SDL_strrev(char *string); +#endif + +#ifdef HAVE__STRUPR +#define SDL_strupr _strupr +#else +extern DECLSPEC char * SDLCALL SDL_strupr(char *string); +#endif + +#ifdef HAVE__STRLWR +#define SDL_strlwr _strlwr +#else +extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); +#endif + +#ifdef HAVE_STRCHR +#define SDL_strchr strchr +#elif defined(HAVE_INDEX) +#define SDL_strchr index +#else +extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); +#endif + +#ifdef HAVE_STRRCHR +#define SDL_strrchr strrchr +#elif defined(HAVE_RINDEX) +#define SDL_strrchr rindex +#else +extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); +#endif + +#ifdef HAVE_STRSTR +#define SDL_strstr strstr +#else +extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); +#endif + +#ifdef HAVE_ITOA +#define SDL_itoa itoa +#else +#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) +#endif + +#ifdef HAVE__LTOA +#define SDL_ltoa _ltoa +#else +extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); +#endif + +#ifdef HAVE__UITOA +#define SDL_uitoa _uitoa +#else +#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) +#endif + +#ifdef HAVE__ULTOA +#define SDL_ultoa _ultoa +#else +extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOL +#define SDL_strtol strtol +#else +extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOUL +#define SDL_strtoul strtoul +#else +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); +#endif + +#ifdef SDL_HAS_64BIT_TYPE + +#ifdef HAVE__I64TOA +#define SDL_lltoa _i64toa +#else +extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); +#endif + +#ifdef HAVE__UI64TOA +#define SDL_ulltoa _ui64toa +#else +extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOLL +#define SDL_strtoll strtoll +#else +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOULL +#define SDL_strtoull strtoull +#else +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); +#endif + +#endif /* SDL_HAS_64BIT_TYPE */ + +#ifdef HAVE_STRTOD +#define SDL_strtod strtod +#else +extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); +#endif + +#ifdef HAVE_ATOI +#define SDL_atoi atoi +#else +#define SDL_atoi(X) SDL_strtol(X, NULL, 0) +#endif + +#ifdef HAVE_ATOF +#define SDL_atof atof +#else +#define SDL_atof(X) SDL_strtod(X, NULL) +#endif + +#ifdef HAVE_STRCMP +#define SDL_strcmp strcmp +#else +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCMP +#define SDL_strncmp strncmp +#else +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_STRCASECMP +#define SDL_strcasecmp strcasecmp +#elif defined(HAVE__STRICMP) +#define SDL_strcasecmp _stricmp +#else +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCASECMP +#define SDL_strncasecmp strncasecmp +#elif defined(HAVE__STRNICMP) +#define SDL_strncasecmp _strnicmp +#else +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_SSCANF +#define SDL_sscanf sscanf +#else +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +#endif + +#ifdef HAVE_SNPRINTF +#define SDL_snprintf snprintf +#else +extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); +#endif + +#ifdef HAVE_VSNPRINTF +#define SDL_vsnprintf vsnprintf +#else +extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); +#endif + +/** @name SDL_ICONV Error Codes + * The SDL implementation of iconv() returns these error codes + */ +/*@{*/ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 +/*@}*/ + +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +#define SDL_iconv_t iconv_t +#define SDL_iconv_open iconv_open +#define SDL_iconv_close iconv_close +#else +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +#endif +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +/** This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + */ +extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_stdinc_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_syswm.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_syswm.h new file mode 100644 index 00000000..78433c6a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_syswm.h @@ -0,0 +1,226 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_syswm.h + * Include file for SDL custom system window manager hooks + */ + +#ifndef _SDL_syswm_h +#define _SDL_syswm_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_syswm.h + * Your application has access to a special type of event 'SDL_SYSWMEVENT', + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState() + */ +#ifdef SDL_PROTOTYPES_ONLY +struct SDL_SysWMinfo; +typedef struct SDL_SysWMinfo SDL_SysWMinfo; +#else + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +/** These are the various supported subsystems under UNIX */ +typedef enum { + SDL_SYSWM_X11 +} SDL_SYSWM_TYPE; + +/** The UNIX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + XEvent xevent; + } event; +}; + +/** The UNIX custom window manager information structure. + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +typedef struct SDL_SysWMinfo { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + struct { + Display *display; /**< The X11 display */ + Window window; /**< The X11 display window */ + /** These locking functions should be called around + * any X11 functions using the display variable, + * but not the gfxdisplay variable. + * They lock the event thread, so should not be + * called around event functions or from event filters. + */ + /*@{*/ + void (*lock_func)(void); + void (*unlock_func)(void); + /*@}*/ + + /** @name Introduced in SDL 1.0.2 */ + /*@{*/ + Window fswindow; /**< The X11 fullscreen window */ + Window wmwindow; /**< The X11 managed input window */ + /*@}*/ + + /** @name Introduced in SDL 1.2.12 */ + /*@{*/ + Display *gfxdisplay; /**< The X11 display to which rendering is done */ + /*@}*/ + } x11; + } info; +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_NANOX) +#include + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version ; + GR_WINDOW_ID window ; /* The display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || defined(SDL_VIDEO_DRIVER_GAPI) +#define WIN32_LEAN_AND_MEAN +#include + +/** The windows custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + HWND window; /**< The Win32 display window */ + HGLRC hglrc; /**< The OpenGL context, if any */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_RISCOS) + +/** RISC OS custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int eventCode; /**< The window for the message */ + int pollBlock[64]; +}; + +/** The RISC OS custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int wimpVersion; /**< Wimp version running under */ + int taskHandle; /**< The RISC OS task handle */ + int window; /**< The RISC OS display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_PHOTON) +#include +#include + +/** The QNX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The QNX custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#else + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The generic custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#endif /* video driver type */ + +#endif /* SDL_PROTOTYPES_ONLY */ + +/* Function prototypes */ +/** + * This function gives you custom hooks into the window manager information. + * It fills the structure pointed to by 'info' with custom information and + * returns 0 if the function is not implemented, 1 if the function is + * implemented and no error occurred, and -1 if the version member of + * the 'info' structure is not filled in or not supported. + * + * You typically use this function like this: + * @code + * SDL_SysWMinfo info; + * SDL_VERSION(&info.version); + * if ( SDL_GetWMInfo(&info) ) { ... } + * @endcode + */ +extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_syswm_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_thread.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_thread.h new file mode 100644 index 00000000..9ebe00ed --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_thread.h @@ -0,0 +1,115 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_thread_h +#define _SDL_thread_h + +/** @file SDL_thread.h + * Header for the SDL thread management routines + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/** Create a thread */ +#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__) +/** + * We compile SDL into a DLL on OS/2. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL.DLL will + * be initialized for those threads, and not the RTL of the calling application! + * To solve this, we make a little hack here. + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL.DLL which uses this API, + * then the RTL of SDL.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD +#ifndef _WIN32_WCE +#include /* This has _beginthread() and _endthread() defined! */ +#endif + +#ifdef __OS2__ +typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); +typedef void (*pfnSDL_CurrentEndThread)(void); +#else +typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, + unsigned (__stdcall *func)(void *), void *arg, + unsigned, unsigned *threadID); +typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); +#endif + +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread); + +#ifdef __OS2__ +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) +#elif defined(_WIN32_WCE) +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) +#else +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) +#endif +#else +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data); +#endif + +/** Get the 32-bit thread identifier for the current thread */ +extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); + +/** Get the 32-bit thread identifier for the specified thread, + * equivalent to SDL_ThreadID() if the specified thread is NULL. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread); + +/** Wait for a thread to finish. + * The return code for the thread function is placed in the area + * pointed to by 'status', if 'status' is not NULL. + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); + +/** Forcefully kill a thread without worrying about its state */ +extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_thread_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_timer.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_timer.h new file mode 100644 index 00000000..d764d5f3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_timer.h @@ -0,0 +1,125 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_timer_h +#define _SDL_timer_h + +/** @file SDL_timer.h + * Header for the SDL time management routines + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the OS scheduler timeslice, in milliseconds */ +#define SDL_TIMESLICE 10 + +/** This is the maximum resolution of the SDL timer on all platforms */ +#define TIMER_RESOLUTION 10 /**< Experimentally determined */ + +/** + * Get the number of milliseconds since the SDL library initialization. + * Note that this value wraps if the program runs for more than ~49 days. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** Wait a specified number of milliseconds before returning */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** Function prototype for the timer callback function */ +typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval); + +/** + * Set a callback to run after the specified number of milliseconds has + * elapsed. The callback function is passed the current timer interval + * and returns the next timer interval. If the returned value is the + * same as the one passed in, the periodic alarm continues, otherwise a + * new alarm is scheduled. If the callback returns 0, the periodic alarm + * is cancelled. + * + * To cancel a currently running timer, call SDL_SetTimer(0, NULL); + * + * The timer callback function may run in a different thread than your + * main code, and so shouldn't call any functions from within itself. + * + * The maximum resolution of this timer is 10 ms, which means that if + * you request a 16 ms timer, your callback will run approximately 20 ms + * later on an unloaded system. If you wanted to set a flag signaling + * a frame update at 30 frames per second (every 33 ms), you might set a + * timer for 30 ms: + * @code SDL_SetTimer((33/10)*10, flag_update); @endcode + * + * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). + * + * Under UNIX, you should not use raise or use SIGALRM and this function + * in the same program, as it is implemented using setitimer(). You also + * should not use this function in multi-threaded applications as signals + * to multi-threaded apps have undefined behavior in some implementations. + * + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback); + +/** @name New timer API + * New timer API, supports multiple timers + * Written by Stephane Peter + */ +/*@{*/ + +/** + * Function prototype for the new timer callback function. + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param); + +/** Definition of the timer ID type */ +typedef struct _SDL_TimerID *SDL_TimerID; + +/** Add a new timer to the pool of timers already running. + * Returns a timer ID, or NULL when an error occurs. + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); + +/** + * Remove one of the multiple timers knowing its ID. + * Returns a boolean value indicating success. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_timer_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_types.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_types.h new file mode 100644 index 00000000..79d8b28d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_types.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_types.h + * @deprecated Use SDL_stdinc.h instead. + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_version.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_version.h new file mode 100644 index 00000000..fdc17c64 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_version.h @@ -0,0 +1,91 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_version.h + * This header defines the current SDL version + */ + +#ifndef _SDL_version_h +#define _SDL_version_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Version Number + * Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL + */ +/*@{*/ +#define SDL_MAJOR_VERSION 1 +#define SDL_MINOR_VERSION 2 +#define SDL_PATCHLEVEL 15 +/*@}*/ + +typedef struct SDL_version { + Uint8 major; + Uint8 minor; + Uint8 patch; +} SDL_version; + +/** + * This macro can be used to fill a version structure with the compile-time + * version of the SDL library. + */ +#define SDL_VERSION(X) \ +{ \ + (X)->major = SDL_MAJOR_VERSION; \ + (X)->minor = SDL_MINOR_VERSION; \ + (X)->patch = SDL_PATCHLEVEL; \ +} + +/** This macro turns the version numbers into a numeric value: + * (1,2,3) -> (1203) + * This assumes that there will never be more than 100 patchlevels + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** This is the version number macro for the current SDL version */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) + +/** This macro will evaluate to true if compiled with SDL at least X.Y.Z */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) + +/** This function gets the version of the dynamically linked SDL library. + * it should NOT be used to fill a version structure, instead you should + * use the SDL_Version() macro. + */ +extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_version_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_video.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_video.h new file mode 100644 index 00000000..f9c4e070 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/SDL_video.h @@ -0,0 +1,951 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_video.h + * Header file for access to the SDL raw framebuffer window + */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Transparency definitions + * These define alpha as the opacity of a surface + */ +/*@{*/ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/*@}*/ + +/** @name Useful data types */ +/*@{*/ +typedef struct SDL_Rect { + Sint16 x, y; + Uint16 w, h; +} SDL_Rect; + +typedef struct SDL_Color { + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 unused; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette { + int ncolors; + SDL_Color *colors; +} SDL_Palette; +/*@}*/ + +/** Everything in the pixel format structure is read-only */ +typedef struct SDL_PixelFormat { + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + + /** RGB color key information */ + Uint32 colorkey; + /** Alpha value information (per-surface alpha) */ + Uint8 alpha; +} SDL_PixelFormat; + +/** This structure should be treated as read-only, except for 'pixels', + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface { + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + Uint16 pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + int offset; /**< Private */ + + /** Hardware-specific surface info */ + struct private_hwdata *hwdata; + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + Uint32 unused1; /**< for binary compatibility */ + + /** Allow recursive locks */ + Uint32 locked; /**< Private */ + + /** info for fast blit mapping to other surfaces */ + struct SDL_BlitMap *map; /**< Private */ + + /** format version, bumped at every change to invalidate blit maps */ + unsigned int format_version; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** @name SDL_Surface Flags + * These are the currently supported flags for the SDL_surface + */ +/*@{*/ + +/** Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ +/*@{*/ +#define SDL_SWSURFACE 0x00000000 /**< Surface is in system memory */ +#define SDL_HWSURFACE 0x00000001 /**< Surface is in video memory */ +#define SDL_ASYNCBLIT 0x00000004 /**< Use asynchronous blits if possible */ +/*@}*/ + +/** Available for SDL_SetVideoMode() */ +/*@{*/ +#define SDL_ANYFORMAT 0x10000000 /**< Allow any video depth/pixel-format */ +#define SDL_HWPALETTE 0x20000000 /**< Surface has exclusive palette */ +#define SDL_DOUBLEBUF 0x40000000 /**< Set up double-buffered video mode */ +#define SDL_FULLSCREEN 0x80000000 /**< Surface is a full screen display */ +#define SDL_OPENGL 0x00000002 /**< Create an OpenGL rendering context */ +#define SDL_OPENGLBLIT 0x0000000A /**< Create an OpenGL rendering context and use it for blitting */ +#define SDL_RESIZABLE 0x00000010 /**< This video mode may be resized */ +#define SDL_NOFRAME 0x00000020 /**< No window caption or edge frame */ +/*@}*/ + +/** Used internally (read-only) */ +/*@{*/ +#define SDL_HWACCEL 0x00000100 /**< Blit uses hardware acceleration */ +#define SDL_SRCCOLORKEY 0x00001000 /**< Blit uses a source color key */ +#define SDL_RLEACCELOK 0x00002000 /**< Private flag */ +#define SDL_RLEACCEL 0x00004000 /**< Surface is RLE encoded */ +#define SDL_SRCALPHA 0x00010000 /**< Blit uses source alpha blending */ +#define SDL_PREALLOC 0x01000000 /**< Surface uses preallocated memory */ +/*@}*/ + +/*@}*/ + +/** Evaluates to true if the surface needs to be locked before access */ +#define SDL_MUSTLOCK(surface) \ + (surface->offset || \ + ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) + +/** typedef for private surface blitting functions */ +typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, + struct SDL_Surface *dst, SDL_Rect *dstrect); + + +/** Useful for determining the video hardware capabilities */ +typedef struct SDL_VideoInfo { + Uint32 hw_available :1; /**< Flag: Can you create hardware surfaces? */ + Uint32 wm_available :1; /**< Flag: Can you talk to a window manager? */ + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; /**< Flag: Accelerated blits HW --> HW */ + Uint32 blit_hw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_hw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_sw :1; /**< Flag: Accelerated blits SW --> HW */ + Uint32 blit_sw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_sw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_fill :1; /**< Flag: Accelerated color fill */ + Uint32 UnusedBits3 :16; + Uint32 video_mem; /**< The total amount of video memory (in K) */ + SDL_PixelFormat *vfmt; /**< Value: The format of the video surface */ + int current_w; /**< Value: The current video mode width */ + int current_h; /**< Value: The current video mode height */ +} SDL_VideoInfo; + + +/** @name Overlay Formats + * The most common video overlay formats. + * For an explanation of these pixel formats, see: + * http://www.webartz.com/fourcc/indexyuv.htm + * + * For information on the relationship between color spaces, see: + * http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html + */ +/*@{*/ +#define SDL_YV12_OVERLAY 0x32315659 /**< Planar mode: Y + V + U (3 planes) */ +#define SDL_IYUV_OVERLAY 0x56555949 /**< Planar mode: Y + U + V (3 planes) */ +#define SDL_YUY2_OVERLAY 0x32595559 /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ +#define SDL_UYVY_OVERLAY 0x59565955 /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ +#define SDL_YVYU_OVERLAY 0x55595659 /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ +/*@}*/ + +/** The YUV hardware video overlay */ +typedef struct SDL_Overlay { + Uint32 format; /**< Read-only */ + int w, h; /**< Read-only */ + int planes; /**< Read-only */ + Uint16 *pitches; /**< Read-only */ + Uint8 **pixels; /**< Read-write */ + + /** @name Hardware-specific surface info */ + /*@{*/ + struct private_yuvhwfuncs *hwfuncs; + struct private_yuvhwdata *hwdata; + /*@{*/ + + /** @name Special flags */ + /*@{*/ + Uint32 hw_overlay :1; /**< Flag: This overlay hardware accelerated? */ + Uint32 UnusedBits :31; + /*@}*/ +} SDL_Overlay; + + +/** Public enumeration for setting the OpenGL window attributes. */ +typedef enum { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_SWAP_CONTROL +} SDL_GLattr; + +/** @name flags for SDL_SetPalette() */ +/*@{*/ +#define SDL_LOGPAL 0x01 +#define SDL_PHYSPAL 0x02 +/*@}*/ + +/* Function prototypes */ + +/** + * @name Video Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the video driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +/** + * Initializes the video subsystem. Sets up a connection + * to the window manager, etc, and determines the current video mode and + * pixel format, but does not initialize a window or graphics mode. + * Note that event handling is activated by this routine. + * + * If you use both sound and video in your application, you need to call + * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, + * you won't be able to set full-screen display modes. + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, Uint32 flags); +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * video driver, and returns a pointer to it if the video driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); + +/** + * This function returns a pointer to the current display surface. + * If SDL is doing format conversion on the display surface, this + * function returns the publicly visible surface, not the real video + * surface. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void); + +/** + * This function returns a read-only pointer to information about the + * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' + * member of the returned structure will contain the pixel format of the + * "best" video mode. + */ +extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); + +/** + * Check to see if a particular video mode is supported. + * It returns 0 if the requested mode is not supported under any bit depth, + * or returns the bits-per-pixel of the closest available mode with the + * given width and height. If this bits-per-pixel is different from the + * one used when setting the video mode, SDL_SetVideoMode() will succeed, + * but will emulate the requested bits-per-pixel with a shadow surface. + * + * The arguments to SDL_VideoModeOK() are the same ones you would pass to + * SDL_SetVideoMode() + */ +extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); + +/** + * Return a pointer to an array of available screen dimensions for the + * given format and video flags, sorted largest to smallest. Returns + * NULL if there are no dimensions available for a particular format, + * or (SDL_Rect **)-1 if any dimension is okay for the given format. + * + * If 'format' is NULL, the mode list will be for the format given + * by SDL_GetVideoInfo()->vfmt + */ +extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); + +/** + * Set up a video mode with the specified width, height and bits-per-pixel. + * + * If 'bpp' is 0, it is treated as the current display bits per pixel. + * + * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the + * requested bits-per-pixel, but will return whatever video pixel format is + * available. The default is to emulate the requested pixel format if it + * is not natively available. + * + * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in + * video memory, if possible, and you may have to call SDL_LockSurface() + * in order to access the raw framebuffer. Otherwise, the video surface + * will be created in system memory. + * + * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle + * updates asynchronously, but you must always lock before accessing pixels. + * SDL will wait for updates to complete before returning from the lock. + * + * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee + * that the colors set by SDL_SetColors() will be the colors you get. + * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all + * of the colors exactly the way they are requested, and you should look + * at the video surface structure to determine the actual palette. + * If SDL cannot guarantee that the colors you request can be set, + * i.e. if the colormap is shared, then the video surface may be created + * under emulation in system memory, overriding the SDL_HWSURFACE flag. + * + * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set + * a fullscreen video mode. The default is to create a windowed mode + * if the current graphics system has a window manager. + * If the SDL library is able to set a fullscreen video mode, this flag + * will be set in the surface that is returned. + * + * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up + * two surfaces in video memory and swap between them when you call + * SDL_Flip(). This is usually slower than the normal single-buffering + * scheme, but prevents "tearing" artifacts caused by modifying video + * memory while the monitor is refreshing. It should only be used by + * applications that redraw the entire screen on every update. + * + * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the + * window manager, if any, to resize the window at runtime. When this + * occurs, SDL will send a SDL_VIDEORESIZE event to you application, + * and you must respond to the event by re-calling SDL_SetVideoMode() + * with the requested size (or another size that suits the application). + * + * If SDL_NOFRAME is set in 'flags', the SDL library will create a window + * without any title bar or frame decoration. Fullscreen video modes have + * this flag set automatically. + * + * This function returns the video framebuffer surface, or NULL if it fails. + * + * If you rely on functionality provided by certain video flags, check the + * flags of the returned surface to make sure that functionality is available. + * SDL will fall back to reduced functionality if the exact flags you wanted + * are not available. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode + (int width, int height, int bpp, Uint32 flags); + +/** @name SDL_Update Functions + * These functions should not be called while 'screen' is locked. + */ +/*@{*/ +/** + * Makes sure the given list of rectangles is updated on the given screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRects + (SDL_Surface *screen, int numrects, SDL_Rect *rects); +/** + * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire + * screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRect + (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); +/*@}*/ + +/** + * On hardware that supports double-buffering, this function sets up a flip + * and returns. The hardware will wait for vertical retrace, and then swap + * video buffers before the next video surface blit or lock will return. + * On hardware that doesn not support double-buffering, this is equivalent + * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); + * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when + * setting the video mode for this function to perform hardware flipping. + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface *screen); + +/** + * Set the gamma correction for each of the color channels. + * The gamma values range (approximately) between 0.1 and 10.0 + * + * If this function isn't supported directly by the hardware, it will + * be emulated using gamma ramps, if available. If successful, this + * function returns 0, otherwise it returns -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); + +/** + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * You may pass NULL for any of the channels to leave it unchanged. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue); + +/** + * Retrieve the current values of the gamma translation tables. + * + * You must pass in valid pointers to arrays of 256 16-bit quantities. + * Any of the pointers may be NULL to ignore that channel. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); + +/** + * Sets a portion of the colormap for the given 8-bit surface. If 'surface' + * is not a palettized surface, this function does nothing, returning 0. + * If all of the colors were set as passed to SDL_SetColors(), it will + * return 1. If not all the color entries were set exactly as given, + * it will return 0, and you should look at the surface palette to + * determine the actual color palette. + * + * When 'surface' is the surface associated with the current display, the + * display colormap will be updated with the requested colors. If + * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() + * will always return 1, and the palette is guaranteed to be set the way + * you desire, even if the window colormap has to be warped or run under + * emulation. + */ +extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, + SDL_Color *colors, int firstcolor, int ncolors); + +/** + * Sets a portion of the colormap for a given 8-bit surface. + * 'flags' is one or both of: + * SDL_LOGPAL -- set logical palette, which controls how blits are mapped + * to/from the surface, + * SDL_PHYSPAL -- set physical palette, which controls how pixels look on + * the screen + * Only screens have physical palettes. Separate change of physical/logical + * palettes is only possible if the screen has SDL_HWPALETTE set. + * + * The return value is 1 if all colours could be set as requested, and 0 + * otherwise. + * + * SDL_SetColors() is equivalent to calling this function with + * flags = (SDL_LOGPAL|SDL_PHYSPAL). + */ +extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, + SDL_Color *colors, int firstcolor, + int ncolors); + +/** + * Maps an RGB triple to an opaque pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b); + +/** + * Maps an RGBA quadruple to a pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a); + +/** + * Maps a pixel value into the RGB components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b); + +/** + * Maps a pixel value into the RGBA components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); + +/** @sa SDL_CreateRGBSurface */ +#define SDL_AllocSurface SDL_CreateRGBSurface +/** + * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * If the function runs out of memory, it will return NULL. + * + * The 'flags' tell what kind of surface to create. + * SDL_SWSURFACE means that the surface should be created in system memory. + * SDL_HWSURFACE means that the surface should be created in video memory, + * with the same format as the display surface. This is useful for surfaces + * that will not change much, to take advantage of hardware acceleration + * when being blitted to the display surface. + * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with + * this surface, but you must always lock it before accessing the pixels. + * SDL will wait for current blits to finish before returning from the lock. + * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. + * If the hardware supports acceleration of colorkey blits between + * two surfaces in video memory, SDL will try to place the surface in + * video memory. If this isn't possible or if there is no hardware + * acceleration available, the surface will be placed in system memory. + * SDL_SRCALPHA means that the surface will be used for alpha blits and + * if the hardware supports hardware acceleration of alpha blits between + * two surfaces in video memory, to place the surface in video memory + * if possible, otherwise it will be placed in system memory. + * If the surface is created in video memory, blits will be _much_ faster, + * but the surface format must be identical to the video surface format, + * and the only way to access the pixels member of the surface is to use + * the SDL_LockSurface() and SDL_UnlockSurface() calls. + * If the requested surface actually resides in video memory, SDL_HWSURFACE + * will be set in the flags member of the returned surface. If for some + * reason the surface could not be placed in video memory, it will not have + * the SDL_HWSURFACE flag set, and will be created in system memory instead. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +/** @sa SDL_CreateRGBSurface */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, int height, int depth, int pitch, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface *surface); + +/** + * SDL_LockSurface() sets up a surface for directly accessing the pixels. + * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write + * to and read from 'surface->pixels', using the pixel format stored in + * 'surface->format'. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. In particular, if the + * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you + * will not need to lock the display surface before accessing it. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface *surface); +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); + +/** + * Load a surface from a seekable SDL data source (memory or file.) + * If 'freesrc' is non-zero, the source will be closed after being read. + * Returns the new surface, or NULL if there was an error. + * The new surface should be freed with SDL_FreeSurface(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); + +/** Convenience macro -- load a surface from a file */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data source (memory or file.) + * If 'freedst' is non-zero, the source will be closed after being written. + * Returns 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface *surface, SDL_RWops *dst, int freedst); + +/** Convenience macro -- save a surface to a file */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * Sets the color key (transparent pixel) in a blittable surface. + * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), + * 'key' will be the transparent pixel in the source image of a blit. + * SDL_RLEACCEL requests RLE acceleration for the surface if present, + * and removes RLE acceleration if absent. + * If 'flag' is 0, this function clears any current color key. + * This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey + (SDL_Surface *surface, Uint32 flag, Uint32 key); + +/** + * This function sets the alpha value for the entire surface, as opposed to + * using the alpha component of each pixel. This value measures the range + * of transparency of the surface, 0 being completely transparent to 255 + * being completely opaque. An 'alpha' value of 255 causes blits to be + * opaque, the source pixels copied to the destination (the default). Note + * that per-surface alpha can be combined with colorkey transparency. + * + * If 'flag' is 0, alpha blending is disabled for the surface. + * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. + * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the + * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. + * + * The 'alpha' parameter is ignored for surfaces that have an alpha channel. + */ +extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); + +/** + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); + +/** + * Gets the clipping rectangle for the destination surface in a blit. + * 'rect' must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); + +/** + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + * + * This function is used internally by SDL_DisplayFormat(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface + (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); + +/** + * This performs a fast blit from the source surface to the destination + * surface. It assumes that the source and destination rectangles are + * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire + * surface (src or dst) is copied. The final blit rectangles are saved + * in 'srcrect' and 'dstrect' after all clipping is performed. + * If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without alpha and colorkey + * are defined as follows: + * + * RGBA->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using alpha-channel). + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy RGB. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value); + * set destination alpha to opaque. + * SDL_SRCALPHA not set: + * copy RGB, set destination alpha to source per-surface alpha value. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * RGBA->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source alpha channel) the RGB values; + * leave destination alpha untouched. [Note: is this correct?] + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy all of RGBA to the destination. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value). + * SDL_SRCALPHA not set: + * copy RGB. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * If either of the surfaces were in video memory, and the blit returns -2, + * the video memory was lost, so it should be reloaded with artwork and + * re-blitted: + * @code + * while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { + * while ( SDL_LockSurface(image) < 0 ) + * Sleep(10); + * -- Write image pixels to image->pixels -- + * SDL_UnlockSurface(image); + * } + * @endcode + * + * This happens under DirectX 5.0 when the system switches away from your + * fullscreen application. The lock will also fail until you have access + * to the video memory again. + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** This is the public blit function, SDL_BlitSurface(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlit() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); +/** This is a semi-private blit function and it performs low-level surface + * blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/** + * This function performs a fast fill of the given rectangle with 'color' + * The given rectangle is clipped to the destination surface clip area + * and the final fill rectangle is saved in the passed in pointer. + * If 'dstrect' is NULL, the whole surface will be filled with 'color' + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer, suitable for fast + * blitting onto the display surface. It calls SDL_ConvertSurface() + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormat(SDL_Surface *surface); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer (if possible), + * suitable for fast alpha blitting onto the display surface. + * The new surface will always have an alpha channel. + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormatAlpha(SDL_Surface *surface); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name YUV video surface overlay functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** This function creates a video output overlay + * Calling the returned surface an overlay is something of a misnomer because + * the contents of the display surface underneath the area where the overlay + * is shown is undefined - it may be overwritten with the converted YUV data. + */ +extern DECLSPEC SDL_Overlay * SDLCALL SDL_CreateYUVOverlay(int width, int height, + Uint32 format, SDL_Surface *display); + +/** Lock an overlay for direct access, and unlock it when you are done */ +extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay *overlay); +extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay); + +/** Blit a video overlay to the display surface. + * The contents of the video surface underneath the blit destination are + * not defined. + * The width and height of the destination rectangle may be different from + * that of the overlay, but currently only 2x scaling is supported. + */ +extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); + +/** Free a video overlay */ +extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay *overlay); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name OpenGL support functions. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Dynamically load an OpenGL library, or the default one if path is NULL + * + * If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * Get the address of a GL function + */ +extern DECLSPEC void * SDLCALL SDL_GL_GetProcAddress(const char* proc); + +/** + * Set an attribute of the OpenGL subsystem before intialization. + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * Get an attribute of the OpenGL subsystem from the windowing + * interface, such as glX. This is of course different from getting + * the values from SDL's internal OpenGL subsystem, which only + * stores the values you request before initialization. + * + * Developers should track the values they pass into SDL_GL_SetAttribute + * themselves if they want to retrieve these values. + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); + +/** + * Swap the OpenGL buffers, if double-buffering is supported. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); + +/** @name OpenGL Internal Functions + * Internal functions that should not be called unless you have read + * and understood the source code for these functions. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); +extern DECLSPEC void SDLCALL SDL_GL_Lock(void); +extern DECLSPEC void SDLCALL SDL_GL_Unlock(void); +/*@}*/ + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Window Manager Functions */ +/** These functions allow interaction with the window manager, if any. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Sets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); +/** + * Gets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon); + +/** + * Sets the icon for the display window. + * This function must be called before the first call to SDL_SetVideoMode(). + * It takes an icon surface, and a mask in MSB format. + * If 'mask' is NULL, the entire icon surface will be used as the icon. + */ +extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); + +/** + * This function iconifies the window, and returns 1 if it succeeded. + * If the function succeeds, it generates an SDL_APPACTIVE loss event. + * This function is a noop and returns 0 in non-windowed environments. + */ +extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); + +/** + * Toggle fullscreen mode without changing the contents of the screen. + * If the display surface does not require locking before accessing + * the pixel information, then the memory pointers will not change. + * + * If this function was able to toggle fullscreen mode (change from + * running in a window to fullscreen, or vice-versa), it will return 1. + * If it is not implemented, or fails, it returns 0. + * + * The next call to SDL_SetVideoMode() will set the mode fullscreen + * attribute based on the flags parameter - if SDL_FULLSCREEN is not + * set, then the display will be windowed by default where supported. + * + * This is currently only implemented in the X11 video driver. + */ +extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface *surface); + +typedef enum { + SDL_GRAB_QUERY = -1, + SDL_GRAB_OFF = 0, + SDL_GRAB_ON = 1, + SDL_GRAB_FULLSCREEN /**< Used internally */ +} SDL_GrabMode; +/** + * This function allows you to set and query the input grab state of + * the application. It returns the new input grab state. + * + * Grabbing means that the mouse is confined to the application window, + * and nearly all keyboard input is passed directly to the application, + * and not interpreted by a window manager, if any. + */ +extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); + +/*@}*/ + +/** @internal Not in public API at the moment - do not use! */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/begin_code.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/begin_code.h new file mode 100644 index 00000000..27e2f7bc --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/i686-pc-windows-msvc/SDL/begin_code.h @@ -0,0 +1,196 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file begin_code.h + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/** + * @file begin_code.h + * This shouldn't be nested -- included it around code only. + */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +/** + * @def DECLSPEC + * Some compilers use a special export keyword + */ +#ifndef DECLSPEC +# if defined(__BEOS__) || defined(__HAIKU__) +# if defined(__GNUC__) +# define DECLSPEC +# else +# define DECLSPEC __declspec(export) +# endif +# elif defined(__WIN32__) +# ifdef __BORLANDC__ +# ifdef BUILD_SDL +# define DECLSPEC +# else +# define DECLSPEC __declspec(dllimport) +# endif +# else +# define DECLSPEC __declspec(dllexport) +# endif +# elif defined(__OS2__) +# ifdef __WATCOMC__ +# ifdef BUILD_SDL +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# elif defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX = 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# else +# define DECLSPEC +# endif +# endif +#endif + +/** + * @def SDLCALL + * By default SDL uses the C calling convention + */ +#ifndef SDLCALL +# if defined(__WIN32__) && !defined(__GNUC__) +# define SDLCALL __cdecl +# elif defined(__OS2__) +# if defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX freq' should be the desired audio frequency in samples-per-second. + * - 'desired->format' should be the desired audio format. + * - 'desired->samples' is the desired size of the audio buffer, in samples. + * This number should be a power of two, and may be adjusted by the audio + * driver to a value more suitable for the hardware. Good values seem to + * range between 512 and 8096 inclusive, depending on the application and + * CPU speed. Smaller values yield faster response time, but can lead + * to underflow if the application is doing heavy processing and cannot + * fill the audio buffer in time. A stereo sample consists of both right + * and left channels in LR ordering. + * Note that the number of samples is directly related to time by the + * following formula: ms = (samples*1000)/freq + * - 'desired->size' is the size in bytes of the audio buffer, and is + * calculated by SDL_OpenAudio(). + * - 'desired->silence' is the value used to set the buffer to silence, + * and is calculated by SDL_OpenAudio(). + * - 'desired->callback' should be set to a function that will be called + * when the audio device is ready for more data. It is passed a pointer + * to the audio buffer, and the length in bytes of the audio buffer. + * This function usually runs in a separate thread, and so you should + * protect data structures that it accesses by calling SDL_LockAudio() + * and SDL_UnlockAudio() in your code. + * - 'desired->userdata' is passed as the first parameter to your callback + * function. + * + * @note The calculated values in this structure are calculated by SDL_OpenAudio() + * + */ +typedef struct SDL_AudioSpec { + int freq; /**< DSP frequency -- samples per second */ + Uint16 format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in samples (power of 2) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + /** + * This function is called when the audio device needs more data. + * + * @param[out] stream A pointer to the audio data buffer + * @param[in] len The length of the audio buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + */ + void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); + void *userdata; +} SDL_AudioSpec; + +/** + * @name Audio format flags + * defaults to LSB byte order + */ +/*@{*/ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB + +/** + * @name Native audio byte ordering + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#endif +/*@}*/ + +/*@}*/ + + +/** A structure to hold a set of audio conversion filters and buffers */ +typedef struct SDL_AudioCVT { + int needed; /**< Set to 1 if conversion possible */ + Uint16 src_format; /**< Source audio format */ + Uint16 dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + void (SDLCALL *filters[10])(struct SDL_AudioCVT *cvt, Uint16 format); + int filter_index; /**< Current audio conversion function */ +} SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * @name Audio Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the audio driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * current audio driver, and returns a pointer to it if the audio driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); + +/** + * This function opens the audio device with the desired parameters, and + * returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio + * data passed to the callback function will be guaranteed to be in the + * requested format, and will be automatically converted to the hardware + * audio format if necessary. This function returns -1 if it failed + * to open the audio device, or couldn't set up the audio thread. + * + * The audio device starts out playing silence when it's opened, and should + * be enabled for playing by calling SDL_PauseAudio(0) when you are ready + * for your audio callback function to be called. Since the audio driver + * may modify the requested size of the audio buffer, you should allocate + * any local mixing buffers after you open the audio device. + * + * @sa SDL_AudioSpec + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); + +typedef enum { + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_audiostatus; + +/** Get the current audio state */ +extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); + +/** + * This function pauses and unpauses the audio callback processing. + * It should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); + +/** + * This function loads a WAVE from the data source, automatically freeing + * that source if 'freesrc' is non-zero. For example, to load a WAVE file, + * you could do: + * @code SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); @endcode + * + * If this function succeeds, it returns the given SDL_AudioSpec, + * filled with the audio data format of the wave data, and sets + * 'audio_buf' to a malloc()'d buffer containing the audio data, + * and sets 'audio_len' to the length of that audio buffer, in bytes. + * You need to free the audio buffer with SDL_FreeWAV() when you are + * done with it. + * + * This function returns NULL and sets the SDL error message if the + * wave file cannot be opened, uses an unknown data format, or is + * corrupt. Currently raw and MS-ADPCM WAVE files are supported. + */ +extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); + +/** Compatibility convenience function -- loads a WAV from a file */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * This function frees data previously allocated with SDL_LoadWAV_RW() + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 *audio_buf); + +/** + * This function takes a source format and rate and a destination format + * and rate, and initializes the 'cvt' structure with information needed + * by SDL_ConvertAudio() to convert a buffer of audio data from one format + * to the other. + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, + Uint16 src_format, Uint8 src_channels, int src_rate, + Uint16 dst_format, Uint8 dst_channels, int dst_rate); + +/** + * Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), + * created an audio buffer cvt->buf, and filled it with cvt->len bytes of + * audio data in the source format, this function will convert it in-place + * to the desired format. + * The data conversion may expand the size of the audio data, so the buffer + * cvt->buf should be allocated after the cvt structure is initialized by + * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt); + + +#define SDL_MIX_MAXVOLUME 128 +/** + * This takes two audio buffers of the playing audio format and mixes + * them, performing addition, volume adjustment, and overflow clipping. + * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume. Note this does not change hardware volume. + * This is provided for convenience -- you can mix your own audio data. + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume); + +/** + * @name Audio Locks + * The lock manipulated by these functions protects the callback function. + * During a LockAudio/UnlockAudio pair, you can be guaranteed that the + * callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); +/*@}*/ + +/** + * This function shuts down audio processing and closes the audio device. + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_audio_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_byteorder.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_byteorder.h new file mode 100644 index 00000000..9b93cd69 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_byteorder.h @@ -0,0 +1,29 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_byteorder.h + * @deprecated Use SDL_endian.h instead + */ + +/* DEPRECATED */ +#include "SDL_endian.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cdrom.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cdrom.h new file mode 100644 index 00000000..fff5cfa1 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cdrom.h @@ -0,0 +1,202 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cdrom.h + * This is the CD-audio control API for Simple DirectMedia Layer + */ + +#ifndef _SDL_cdrom_h +#define _SDL_cdrom_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file SDL_cdrom.h + * In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_CDROM flag. This causes SDL to scan the system + * for CD-ROM drives, and load appropriate drivers. + */ + +/** The maximum number of CD-ROM tracks on a disk */ +#define SDL_MAX_TRACKS 99 + +/** @name Track Types + * The types of CD-ROM track possible + */ +/*@{*/ +#define SDL_AUDIO_TRACK 0x00 +#define SDL_DATA_TRACK 0x04 +/*@}*/ + +/** The possible states which a CD-ROM drive can be in. */ +typedef enum { + CD_TRAYEMPTY, + CD_STOPPED, + CD_PLAYING, + CD_PAUSED, + CD_ERROR = -1 +} CDstatus; + +/** Given a status, returns true if there's a disk in the drive */ +#define CD_INDRIVE(status) ((int)(status) > 0) + +typedef struct SDL_CDtrack { + Uint8 id; /**< Track number */ + Uint8 type; /**< Data or audio track */ + Uint16 unused; + Uint32 length; /**< Length, in frames, of this track */ + Uint32 offset; /**< Offset, in frames, from start of disk */ +} SDL_CDtrack; + +/** This structure is only current as of the last call to SDL_CDStatus() */ +typedef struct SDL_CD { + int id; /**< Private drive identifier */ + CDstatus status; /**< Current drive status */ + + /** The rest of this structure is only valid if there's a CD in drive */ + /*@{*/ + int numtracks; /**< Number of tracks on disk */ + int cur_track; /**< Current track position */ + int cur_frame; /**< Current frame offset within current track */ + SDL_CDtrack track[SDL_MAX_TRACKS+1]; + /*@}*/ +} SDL_CD; + +/** @name Frames / MSF Conversion Functions + * Conversion functions from frames to Minute/Second/Frames and vice versa + */ +/*@{*/ +#define CD_FPS 75 +#define FRAMES_TO_MSF(f, M,S,F) { \ + int value = f; \ + *(F) = value%CD_FPS; \ + value /= CD_FPS; \ + *(S) = value%60; \ + value /= 60; \ + *(M) = value; \ +} +#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) +/*@}*/ + +/* CD-audio API functions: */ + +/** + * Returns the number of CD-ROM drives on the system, or -1 if + * SDL_Init() has not been called with the SDL_INIT_CDROM flag. + */ +extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); + +/** + * Returns a human-readable, system-dependent identifier for the CD-ROM. + * Example: + * - "/dev/cdrom" + * - "E:" + * - "/dev/disk/ide/1/master" + */ +extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); + +/** + * Opens a CD-ROM drive for access. It returns a drive handle on success, + * or NULL if the drive was invalid or busy. This newly opened CD-ROM + * becomes the default CD used when other CD functions are passed a NULL + * CD-ROM handle. + * Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. + */ +extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); + +/** + * This function returns the current status of the given drive. + * If the drive has a CD in it, the table of contents of the CD and current + * play position of the CD will be stored in the SDL_CD structure. + */ +extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); + +/** + * Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' + * tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play + * until the end of the CD. This function will skip data tracks. + * This function should only be called after calling SDL_CDStatus() to + * get track information about the CD. + * For example: + * @code + * // Play entire CD: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); + * // Play last track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { + * SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); + * } + * // Play first and second track and 10 seconds of third track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); + * @endcode + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, + int start_track, int start_frame, int ntracks, int nframes); + +/** + * Play the given CD starting at 'start' frame for 'length' frames. + * @return It returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); + +/** Pause play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); + +/** Resume play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); + +/** Stop play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); + +/** Eject CD-ROM + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); + +/** Closes the handle for the CD-ROM drive */ +extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_config.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_config.h new file mode 100644 index 00000000..1b5bbd27 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_config.h @@ -0,0 +1,312 @@ +/* include/SDL_config.h. Generated from SDL_config.h.in by configure. */ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_h +#define _SDL_config_h + +/* This is a set of defines to configure the SDL features */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* Make sure that this isn't included by Visual C++ */ +#ifdef _MSC_VER +#error You should copy include/SDL_config.h.default to include/SDL_config.h +#endif + +/* C language features */ +/* #undef const */ +/* #undef inline */ +/* #undef volatile */ + +/* C datatypes */ +/* #undef size_t */ +/* #undef int8_t */ +/* #undef uint8_t */ +/* #undef int16_t */ +/* #undef uint16_t */ +/* #undef int32_t */ +/* #undef uint32_t */ +/* #undef int64_t */ +/* #undef uint64_t */ +/* #undef uintptr_t */ +#define SDL_HAS_64BIT_TYPE 1 + +/* Endianness */ +#define SDL_BYTEORDER 1234 + +/* Comment this if you want to build without any C library requirements */ +#define HAVE_LIBC 1 +#if HAVE_LIBC + +/* Useful headers */ +/* #undef HAVE_ALLOCA_H */ +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +/* #undef HAVE_ICONV_H */ +#define HAVE_SIGNAL_H 1 +/* #undef HAVE_ALTIVEC_H */ + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +/* #undef HAVE_ALLOCA */ +#ifndef _WIN32 /* Don't use C runtime versions of these on Windows */ +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +/* #undef HAVE_UNSETENV */ +#endif +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +/* #undef HAVE_BCOPY */ +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +/* #undef HAVE_MEMCMP */ +#define HAVE_STRLEN 1 +/* #undef HAVE_STRLCPY */ +/* #undef HAVE_STRLCAT */ +#define HAVE_STRDUP 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +/* #undef HAVE_INDEX */ +/* #undef HAVE_RINDEX */ +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE__LTOA 1 +/* #undef HAVE__UITOA */ +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE__I64TOA 1 +#define HAVE__UI64TOA 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +/* #undef HAVE_STRTOD */ +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +/* #undef HAVE_ICONV */ +/* #undef HAVE_SIGACTION */ +/* #undef HAVE_SA_SIGACTION */ +#define HAVE_SETJMP 1 +/* #undef HAVE_NANOSLEEP */ +/* #undef HAVE_CLOCK_GETTIME */ +/* #undef HAVE_GETPAGESIZE */ +/* #undef HAVE_MPROTECT */ + +#else +/* We may need some replacement for stdarg.h here */ +#include +#endif /* HAVE_LIBC */ + +/* Allow disabling of core subsystems */ +/* #undef SDL_AUDIO_DISABLED */ +/* #undef SDL_CDROM_DISABLED */ +/* #undef SDL_CPUINFO_DISABLED */ +/* #undef SDL_EVENTS_DISABLED */ +/* #undef SDL_FILE_DISABLED */ +/* #undef SDL_JOYSTICK_DISABLED */ +/* #undef SDL_LOADSO_DISABLED */ +/* #undef SDL_THREADS_DISABLED */ +/* #undef SDL_TIMERS_DISABLED */ +/* #undef SDL_VIDEO_DISABLED */ + +/* Enable various audio drivers */ +/* #undef SDL_AUDIO_DRIVER_ALSA */ +/* #undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_ARTS */ +/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_BAUDIO */ +/* #undef SDL_AUDIO_DRIVER_BSD */ +/* #undef SDL_AUDIO_DRIVER_COREAUDIO */ +/* #undef SDL_AUDIO_DRIVER_DART */ +/* #undef SDL_AUDIO_DRIVER_DC */ +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 +/* #undef SDL_AUDIO_DRIVER_DMEDIA */ +#define SDL_AUDIO_DRIVER_DSOUND 1 +/* #undef SDL_AUDIO_DRIVER_PULSE */ +/* #undef SDL_AUDIO_DRIVER_PULSE_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_ESD */ +/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_MINT */ +/* #undef SDL_AUDIO_DRIVER_MMEAUDIO */ +/* #undef SDL_AUDIO_DRIVER_NAS */ +/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */ +/* #undef SDL_AUDIO_DRIVER_OSS */ +/* #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H */ +/* #undef SDL_AUDIO_DRIVER_PAUD */ +/* #undef SDL_AUDIO_DRIVER_QNXNTO */ +/* #undef SDL_AUDIO_DRIVER_SNDMGR */ +/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */ +#define SDL_AUDIO_DRIVER_WAVEOUT 1 + +/* Enable various cdrom drivers */ +/* #undef SDL_CDROM_AIX */ +/* #undef SDL_CDROM_BEOS */ +/* #undef SDL_CDROM_BSDI */ +/* #undef SDL_CDROM_DC */ +/* #undef SDL_CDROM_DUMMY */ +/* #undef SDL_CDROM_FREEBSD */ +/* #undef SDL_CDROM_LINUX */ +/* #undef SDL_CDROM_MACOS */ +/* #undef SDL_CDROM_MACOSX */ +/* #undef SDL_CDROM_MINT */ +/* #undef SDL_CDROM_OPENBSD */ +/* #undef SDL_CDROM_OS2 */ +/* #undef SDL_CDROM_OSF */ +/* #undef SDL_CDROM_QNX */ +#define SDL_CDROM_WIN32 1 + +/* Enable various input drivers */ +/* #undef SDL_INPUT_LINUXEV */ +/* #undef SDL_INPUT_TSLIB */ +/* #undef SDL_JOYSTICK_BEOS */ +/* #undef SDL_JOYSTICK_DC */ +/* #undef SDL_JOYSTICK_DUMMY */ +/* #undef SDL_JOYSTICK_IOKIT */ +/* #undef SDL_JOYSTICK_LINUX */ +/* #undef SDL_JOYSTICK_MACOS */ +/* #undef SDL_JOYSTICK_MINT */ +/* #undef SDL_JOYSTICK_OS2 */ +/* #undef SDL_JOYSTICK_RISCOS */ +#define SDL_JOYSTICK_WINMM 1 +/* #undef SDL_JOYSTICK_USBHID */ +/* #undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H */ + +/* Enable various shared object loading systems */ +/* #undef SDL_LOADSO_BEOS */ +/* #undef SDL_LOADSO_DLCOMPAT */ +/* #undef SDL_LOADSO_DLOPEN */ +/* #undef SDL_LOADSO_DUMMY */ +/* #undef SDL_LOADSO_LDG */ +/* #undef SDL_LOADSO_MACOS */ +/* #undef SDL_LOADSO_OS2 */ +#define SDL_LOADSO_WIN32 1 + +/* Enable various threading systems */ +/* #undef SDL_THREAD_BEOS */ +/* #undef SDL_THREAD_DC */ +/* #undef SDL_THREAD_OS2 */ +/* #undef SDL_THREAD_PTH */ +/* #undef SDL_THREAD_PTHREAD */ +/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX */ +/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */ +/* #undef SDL_THREAD_SPROC */ +#define SDL_THREAD_WIN32 1 + +/* Enable various timer systems */ +/* #undef SDL_TIMER_BEOS */ +/* #undef SDL_TIMER_DC */ +/* #undef SDL_TIMER_DUMMY */ +/* #undef SDL_TIMER_MACOS */ +/* #undef SDL_TIMER_MINT */ +/* #undef SDL_TIMER_OS2 */ +/* #undef SDL_TIMER_RISCOS */ +/* #undef SDL_TIMER_UNIX */ +#define SDL_TIMER_WIN32 1 +/* #undef SDL_TIMER_WINCE */ + +/* Enable various video drivers */ +/* #undef SDL_VIDEO_DRIVER_AALIB */ +/* #undef SDL_VIDEO_DRIVER_BWINDOW */ +/* #undef SDL_VIDEO_DRIVER_CACA */ +/* #undef SDL_VIDEO_DRIVER_DC */ +#define SDL_VIDEO_DRIVER_DDRAW 1 +/* #undef SDL_VIDEO_DRIVER_DGA */ +/* #undef SDL_VIDEO_DRIVER_DIRECTFB */ +/* #undef SDL_VIDEO_DRIVER_DRAWSPROCKET */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +/* #undef SDL_VIDEO_DRIVER_FBCON */ +/* #undef SDL_VIDEO_DRIVER_GAPI */ +/* #undef SDL_VIDEO_DRIVER_GEM */ +/* #undef SDL_VIDEO_DRIVER_GGI */ +/* #undef SDL_VIDEO_DRIVER_IPOD */ +/* #undef SDL_VIDEO_DRIVER_NANOX */ +/* #undef SDL_VIDEO_DRIVER_OS2FS */ +/* #undef SDL_VIDEO_DRIVER_PHOTON */ +/* #undef SDL_VIDEO_DRIVER_PICOGUI */ +/* #undef SDL_VIDEO_DRIVER_PS2GS */ +/* #undef SDL_VIDEO_DRIVER_PS3 */ +/* #undef SDL_VIDEO_DRIVER_QTOPIA */ +/* #undef SDL_VIDEO_DRIVER_QUARTZ */ +/* #undef SDL_VIDEO_DRIVER_RISCOS */ +/* #undef SDL_VIDEO_DRIVER_SVGALIB */ +/* #undef SDL_VIDEO_DRIVER_TOOLBOX */ +/* #undef SDL_VIDEO_DRIVER_VGL */ +#define SDL_VIDEO_DRIVER_WINDIB 1 +/* #undef SDL_VIDEO_DRIVER_WSCONS */ +/* #undef SDL_VIDEO_DRIVER_X11 */ +/* #undef SDL_VIDEO_DRIVER_X11_DGAMOUSE */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR */ +/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER */ +/* #undef SDL_VIDEO_DRIVER_X11_VIDMODE */ +/* #undef SDL_VIDEO_DRIVER_X11_XINERAMA */ +/* #undef SDL_VIDEO_DRIVER_X11_XME */ +/* #undef SDL_VIDEO_DRIVER_X11_XRANDR */ +/* #undef SDL_VIDEO_DRIVER_X11_XV */ +/* #undef SDL_VIDEO_DRIVER_XBIOS */ + +/* Enable OpenGL support */ +#define SDL_VIDEO_OPENGL 1 +/* #undef SDL_VIDEO_OPENGL_GLX */ +#define SDL_VIDEO_OPENGL_WGL 1 +/* #undef SDL_VIDEO_OPENGL_OSMESA */ +/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */ + +/* Disable screensaver */ +#define SDL_VIDEO_DISABLE_SCREENSAVER 1 + +/* Enable assembly routines */ +#define SDL_ASSEMBLY_ROUTINES 1 +/* #undef SDL_HERMES_BLITTERS */ +/* #undef SDL_ALTIVEC_BLITTERS */ + +#endif /* _SDL_config_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cpuinfo.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cpuinfo.h new file mode 100644 index 00000000..f4be8e03 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_cpuinfo.h @@ -0,0 +1,69 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cpuinfo.h + * CPU feature detection for SDL + */ + +#ifndef _SDL_cpuinfo_h +#define _SDL_cpuinfo_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This function returns true if the CPU has the RDTSC instruction */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** This function returns true if the CPU has MMX features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** This function returns true if the CPU has MMX Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); + +/** This function returns true if the CPU has 3DNow features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** This function returns true if the CPU has 3DNow! Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); + +/** This function returns true if the CPU has SSE features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** This function returns true if the CPU has SSE2 features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** This function returns true if the CPU has AltiVec features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_cpuinfo_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_endian.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_endian.h new file mode 100644 index 00000000..095b1856 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_endian.h @@ -0,0 +1,214 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_endian.h + * Functions for reading and writing endian-specific values + */ + +#ifndef _SDL_endian_h +#define _SDL_endian_h + +#include "SDL_stdinc.h" + +/** @name SDL_ENDIANs + * The two types of endianness + */ +/*@{*/ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/*@}*/ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#else /* __linux __ */ +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux __ */ +#endif /* !SDL_BYTEORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name SDL_Swap Functions + * Use inline functions for compilers that support them, and static + * functions for those that do not. Because these functions become + * static for compilers that do not support inline functions, this + * header should only be included in files that actually use them. + */ +/*@{*/ +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + Uint16 result; + + __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint16 SDL_Swap16(Uint16 x) { + return SDL_static_cast(Uint16, ((x<<8)|(x>>8))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); + __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); + __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint32 SDL_Swap32(Uint32 x) { + return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24))); +} +#endif + +#ifdef SDL_HAS_64BIT_TYPE +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + union { + struct { Uint32 a,b; } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" + : "=r" (v.s.a), "=r" (v.s.b) + : "0" (v.s.a), "1" (v.s.b)); + return v.u; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0" : "=r" (x) : "0" (x)); + return x; +} +#else +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif +#else +/* This is mainly to keep compilers from complaining in SDL code. + * If there is no real 64-bit datatype, then compilers will complain about + * the fake 64-bit datatype that SDL provides when it compiles user code. + */ +#define SDL_Swap64(X) (X) +#endif /* SDL_HAS_64BIT_TYPE */ +/*@}*/ + +/** + * @name SDL_SwapLE and SDL_SwapBE Functions + * Byteswap item from the specified endianness to the native endianness + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#endif +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_endian_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_error.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_error.h new file mode 100644 index 00000000..b103703a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_error.h @@ -0,0 +1,72 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_error.h + * Simple error message routines for SDL + */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name Public functions + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC char * SDLCALL SDL_GetError(void); +extern DECLSPEC void SDLCALL SDL_ClearError(void); +/*@}*/ + +/** + * @name Private functions + * @internal Private error message function - used internally + */ +/*@{*/ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +typedef enum { + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_events.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_events.h new file mode 100644 index 00000000..c94a30c9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_events.h @@ -0,0 +1,356 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_events.h + * Include file for SDL event handling + */ + +#ifndef _SDL_events_h +#define _SDL_events_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_active.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_quit.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name General keyboard/mouse state definitions */ +/*@{*/ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 +/*@}*/ + +/** Event enumerations */ +typedef enum { + SDL_NOEVENT = 0, /**< Unused (do not remove) */ + SDL_ACTIVEEVENT, /**< Application loses/gains visibility */ + SDL_KEYDOWN, /**< Keys pressed */ + SDL_KEYUP, /**< Keys released */ + SDL_MOUSEMOTION, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_JOYAXISMOTION, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_QUIT, /**< User-requested quit */ + SDL_SYSWMEVENT, /**< System specific event */ + SDL_EVENT_RESERVEDA, /**< Reserved for future use.. */ + SDL_EVENT_RESERVEDB, /**< Reserved for future use.. */ + SDL_VIDEORESIZE, /**< User resized video mode */ + SDL_VIDEOEXPOSE, /**< Screen needs to be redrawn */ + SDL_EVENT_RESERVED2, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED3, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED4, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED5, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED6, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED7, /**< Reserved for future use.. */ + /** Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ + SDL_USEREVENT = 24, + /** This last event is only for bounding internal arrays + * It is the number of bits in the event mask datatype -- Uint32 + */ + SDL_NUMEVENTS = 32 +} SDL_EventType; + +/** @name Predefined event masks */ +/*@{*/ +#define SDL_EVENTMASK(X) (1<<(X)) +typedef enum { + SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), + SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), + SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), + SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| + SDL_EVENTMASK(SDL_KEYUP), + SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), + SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), + SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| + SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| + SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), + SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), + SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), + SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), + SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| + SDL_EVENTMASK(SDL_JOYBALLMOTION)| + SDL_EVENTMASK(SDL_JOYHATMOTION)| + SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| + SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), + SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), + SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), + SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) +} SDL_EventMask ; +#define SDL_ALLEVENTS 0xFFFFFFFF +/*@}*/ + +/** Application visibility event structure */ +typedef struct SDL_ActiveEvent { + Uint8 type; /**< SDL_ACTIVEEVENT */ + Uint8 gain; /**< Whether given states were gained or lost (1/0) */ + Uint8 state; /**< A mask of the focus states */ +} SDL_ActiveEvent; + +/** Keyboard event structure */ +typedef struct SDL_KeyboardEvent { + Uint8 type; /**< SDL_KEYDOWN or SDL_KEYUP */ + Uint8 which; /**< The keyboard device index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + SDL_keysym keysym; +} SDL_KeyboardEvent; + +/** Mouse motion event structure */ +typedef struct SDL_MouseMotionEvent { + Uint8 type; /**< SDL_MOUSEMOTION */ + Uint8 which; /**< The mouse device index */ + Uint8 state; /**< The current button state */ + Uint16 x, y; /**< The X/Y coordinates of the mouse */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** Mouse button event structure */ +typedef struct SDL_MouseButtonEvent { + Uint8 type; /**< SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ + Uint8 which; /**< The mouse device index */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + Uint16 x, y; /**< The X/Y coordinates of the mouse at press time */ +} SDL_MouseButtonEvent; + +/** Joystick axis motion event structure */ +typedef struct SDL_JoyAxisEvent { + Uint8 type; /**< SDL_JOYAXISMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 axis; /**< The joystick axis index */ + Sint16 value; /**< The axis value (range: -32768 to 32767) */ +} SDL_JoyAxisEvent; + +/** Joystick trackball motion event structure */ +typedef struct SDL_JoyBallEvent { + Uint8 type; /**< SDL_JOYBALLMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 ball; /**< The joystick trackball index */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** Joystick hat position change event structure */ +typedef struct SDL_JoyHatEvent { + Uint8 type; /**< SDL_JOYHATMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value: + * SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP + * SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT + * SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN + * Note that zero means the POV is centered. + */ +} SDL_JoyHatEvent; + +/** Joystick button event structure */ +typedef struct SDL_JoyButtonEvent { + Uint8 type; /**< SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ + Uint8 which; /**< The joystick device index */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ +} SDL_JoyButtonEvent; + +/** The "window resized" event + * When you get this event, you are responsible for setting a new video + * mode with the new width and height. + */ +typedef struct SDL_ResizeEvent { + Uint8 type; /**< SDL_VIDEORESIZE */ + int w; /**< New width */ + int h; /**< New height */ +} SDL_ResizeEvent; + +/** The "screen redraw" event */ +typedef struct SDL_ExposeEvent { + Uint8 type; /**< SDL_VIDEOEXPOSE */ +} SDL_ExposeEvent; + +/** The "quit requested" event */ +typedef struct SDL_QuitEvent { + Uint8 type; /**< SDL_QUIT */ +} SDL_QuitEvent; + +/** A user-defined event type */ +typedef struct SDL_UserEvent { + Uint8 type; /**< SDL_USEREVENT through SDL_NUMEVENTS-1 */ + int code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + +/** If you want to use this event, you should include SDL_syswm.h */ +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; +typedef struct SDL_SysWMEvent { + Uint8 type; + SDL_SysWMmsg *msg; +} SDL_SysWMEvent; + +/** General event structure */ +typedef union SDL_Event { + Uint8 type; + SDL_ActiveEvent active; + SDL_KeyboardEvent key; + SDL_MouseMotionEvent motion; + SDL_MouseButtonEvent button; + SDL_JoyAxisEvent jaxis; + SDL_JoyBallEvent jball; + SDL_JoyHatEvent jhat; + SDL_JoyButtonEvent jbutton; + SDL_ResizeEvent resize; + SDL_ExposeEvent expose; + SDL_QuitEvent quit; + SDL_UserEvent user; + SDL_SysWMEvent syswm; +} SDL_Event; + + +/* Function prototypes */ + +/** Pumps the event loop, gathering events from the input devices. + * This function updates the event queue and internal input device state. + * This should only be run in the thread that sets the video mode. + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +typedef enum { + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Checks the event queue for messages and optionally returns them. + * + * If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to + * the back of the event queue. + * If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will not + * be removed from the queue. + * If 'action' is SDL_GETEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will be + * removed from the queue. + * + * @return + * This function returns the number of events actually stored, or -1 + * if there was an error. + * + * This function is thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, + SDL_eventaction action, Uint32 mask); + +/** Polls for currently pending events, and returns 1 if there are any pending + * events, or 0 if there are none available. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); + +/** Waits indefinitely for the next available event, returning 1, or 0 if there + * was an error while waiting for events. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); + +/** Add an event to the event queue. + * This function returns 0 on success, or -1 if the event queue was full + * or there was some other error. + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); + +/** @name Event Filtering */ +/*@{*/ +typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); +/** + * This function sets up a filter to process all events before they + * change internal state and are posted to the internal event queue. + * + * The filter is protypted as: + * @code typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); @endcode + * + * If the filter returns 1, then the event will be added to the internal queue. + * If it returns 0, then the event will be dropped from the queue, but the + * internal state will still be updated. This allows selective filtering of + * dynamically arriving events. + * + * @warning Be very careful of what you do in the event filter function, as + * it may run in a different thread! + * + * There is one caveat when dealing with the SDL_QUITEVENT event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will + * be closed, otherwise the window will remain open if possible. + * If the quit event is generated by an interrupt signal, it will bypass the + * internal queue and be delivered to the application at the next event poll. + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); + +/** + * Return the current event filter - can be used to "chain" filters. + * If there is no event filter set, this function returns NULL. + */ +extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); +/*@}*/ + +/** @name Event State */ +/*@{*/ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 +/*@}*/ + +/** +* This function allows you to set the state of processing certain events. +* If 'state' is set to SDL_IGNORE, that event will be automatically dropped +* from the event queue and will not event be filtered. +* If 'state' is set to SDL_ENABLE, that event will be processed normally. +* If 'state' is set to SDL_QUERY, SDL_EventState() will return the +* current processing state of the specified event. +*/ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_events_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_getenv.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_getenv.h new file mode 100644 index 00000000..253ad88c --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_getenv.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_getenv.h + * @deprecated Use SDL_stdinc.h instead + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_joystick.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_joystick.h new file mode 100644 index 00000000..d5135c3d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_joystick.h @@ -0,0 +1,187 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_joystick.h + * Include file for SDL joystick event handling + */ + +#ifndef _SDL_joystick_h +#define _SDL_joystick_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_joystick.h + * @note In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + */ + +/** The joystick structure used to identify an SDL joystick */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* Function prototypes */ +/** + * Count the number of joysticks attached to the system + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char * SDLCALL SDL_JoystickName(int device_index); + +/** + * Open a joystick for use. + * + * @param[in] device_index + * The index passed as an argument refers to + * the N'th joystick on the system. This index is the value which will + * identify this joystick in future joystick events. + * + * @return This function returns a joystick identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_Joystick * SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Returns 1 if the joystick has been opened, or 0 if it has not. + */ +extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); + +/** + * Get the device index of an opened joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick *joystick); + +/** + * Get the number of general axis controls on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); + +/** + * Get the number of trackballs on a joystick + * + * Joystick trackballs have only relative motion events associated + * with them and their state cannot be polled. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); + +/** + * Get the number of POV hats on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); + +/** + * Get the number of buttons on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and check the state of the joystick when you want joystick + * information. + * + * @param[in] state The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +/** + * Get the current state of an axis control on a joystick + * + * @param[in] axis The axis indices start at index 0. + * + * @return The state is a value ranging from -32768 to 32767. + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); + +/** + * @name Hat Positions + * The return value of SDL_JoystickGetHat() is one of the following positions: + */ +/*@{*/ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/*@}*/ + +/** + * Get the current state of a POV hat on a joystick + * + * @param[in] hat The hat indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); + +/** + * Get the ball axis change since the last poll + * + * @param[in] ball The ball indices start at index 0. + * + * @return This returns 0, or -1 if you passed it invalid parameters. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick + * + * @param[in] button The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, int button); + +/** + * Close a joystick previously opened with SDL_JoystickOpen() + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_joystick_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keyboard.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keyboard.h new file mode 100644 index 00000000..7b59d24e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keyboard.h @@ -0,0 +1,135 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_keyboard.h + * Include file for SDL keyboard event handling + */ + +#ifndef _SDL_keyboard_h +#define _SDL_keyboard_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keysym.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Keysym structure + * + * - The scancode is hardware dependent, and should not be used by general + * applications. If no hardware scancode is available, it will be 0. + * + * - The 'unicode' translated character is only available when character + * translation is enabled by the SDL_EnableUNICODE() API. If non-zero, + * this is a UNICODE character corresponding to the keypress. If the + * high 9 bits of the character are 0, then this maps to the equivalent + * ASCII character: + * @code + * char ch; + * if ( (keysym.unicode & 0xFF80) == 0 ) { + * ch = keysym.unicode & 0x7F; + * } else { + * An international character.. + * } + * @endcode + */ +typedef struct SDL_keysym { + Uint8 scancode; /**< hardware specific scancode */ + SDLKey sym; /**< SDL virtual keysym */ + SDLMod mod; /**< current key modifiers */ + Uint16 unicode; /**< translated character */ +} SDL_keysym; + +/** This is the mask which refers to all hotkey bindings */ +#define SDL_ALL_HOTKEYS 0xFFFFFFFF + +/* Function prototypes */ +/** + * Enable/Disable UNICODE translation of keyboard input. + * + * This translation has some overhead, so translation defaults off. + * + * @param[in] enable + * If 'enable' is 1, translation is enabled. + * If 'enable' is 0, translation is disabled. + * If 'enable' is -1, the translation state is not changed. + * + * @return It returns the previous state of keyboard translation. + */ +extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); + +#define SDL_DEFAULT_REPEAT_DELAY 500 +#define SDL_DEFAULT_REPEAT_INTERVAL 30 +/** + * Enable/Disable keyboard repeat. Keyboard repeat defaults to off. + * + * @param[in] delay + * 'delay' is the initial delay in ms between the time when a key is + * pressed, and keyboard repeat begins. + * + * @param[in] interval + * 'interval' is the time in ms between keyboard repeat events. + * + * If 'delay' is set to 0, keyboard repeat is disabled. + */ +extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); +extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); + +/** + * Get a snapshot of the current state of the keyboard. + * Returns an array of keystates, indexed by the SDLK_* syms. + * Usage: + * @code + * Uint8 *keystate = SDL_GetKeyState(NULL); + * if ( keystate[SDLK_RETURN] ) //... \ is pressed. + * @endcode + */ +extern DECLSPEC Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); + +/** + * Get the current key modifier state + */ +extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); + +/** + * Set the current key modifier state. + * This does not change the keyboard state, only the key modifier flags. + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); + +/** + * Get the name of an SDL virtual keysym + */ +extern DECLSPEC char * SDLCALL SDL_GetKeyName(SDLKey key); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_keyboard_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keysym.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keysym.h new file mode 100644 index 00000000..90101286 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_keysym.h @@ -0,0 +1,326 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_keysym_h +#define _SDL_keysym_h + +/** What we really want is a mapping of every raw key on the keyboard. + * To support international keyboards, we use the range 0xA1 - 0xFF + * as international virtual keycodes. We'll follow in the footsteps of X11... + * @brief The names of the keys + */ +typedef enum { + /** @name ASCII mapped keysyms + * The keyboard syms have been cleverly chosen to map to ASCII + */ + /*@{*/ + SDLK_UNKNOWN = 0, + SDLK_FIRST = 0, + SDLK_BACKSPACE = 8, + SDLK_TAB = 9, + SDLK_CLEAR = 12, + SDLK_RETURN = 13, + SDLK_PAUSE = 19, + SDLK_ESCAPE = 27, + SDLK_SPACE = 32, + SDLK_EXCLAIM = 33, + SDLK_QUOTEDBL = 34, + SDLK_HASH = 35, + SDLK_DOLLAR = 36, + SDLK_AMPERSAND = 38, + SDLK_QUOTE = 39, + SDLK_LEFTPAREN = 40, + SDLK_RIGHTPAREN = 41, + SDLK_ASTERISK = 42, + SDLK_PLUS = 43, + SDLK_COMMA = 44, + SDLK_MINUS = 45, + SDLK_PERIOD = 46, + SDLK_SLASH = 47, + SDLK_0 = 48, + SDLK_1 = 49, + SDLK_2 = 50, + SDLK_3 = 51, + SDLK_4 = 52, + SDLK_5 = 53, + SDLK_6 = 54, + SDLK_7 = 55, + SDLK_8 = 56, + SDLK_9 = 57, + SDLK_COLON = 58, + SDLK_SEMICOLON = 59, + SDLK_LESS = 60, + SDLK_EQUALS = 61, + SDLK_GREATER = 62, + SDLK_QUESTION = 63, + SDLK_AT = 64, + /* + Skip uppercase letters + */ + SDLK_LEFTBRACKET = 91, + SDLK_BACKSLASH = 92, + SDLK_RIGHTBRACKET = 93, + SDLK_CARET = 94, + SDLK_UNDERSCORE = 95, + SDLK_BACKQUOTE = 96, + SDLK_a = 97, + SDLK_b = 98, + SDLK_c = 99, + SDLK_d = 100, + SDLK_e = 101, + SDLK_f = 102, + SDLK_g = 103, + SDLK_h = 104, + SDLK_i = 105, + SDLK_j = 106, + SDLK_k = 107, + SDLK_l = 108, + SDLK_m = 109, + SDLK_n = 110, + SDLK_o = 111, + SDLK_p = 112, + SDLK_q = 113, + SDLK_r = 114, + SDLK_s = 115, + SDLK_t = 116, + SDLK_u = 117, + SDLK_v = 118, + SDLK_w = 119, + SDLK_x = 120, + SDLK_y = 121, + SDLK_z = 122, + SDLK_DELETE = 127, + /* End of ASCII mapped keysyms */ + /*@}*/ + + /** @name International keyboard syms */ + /*@{*/ + SDLK_WORLD_0 = 160, /* 0xA0 */ + SDLK_WORLD_1 = 161, + SDLK_WORLD_2 = 162, + SDLK_WORLD_3 = 163, + SDLK_WORLD_4 = 164, + SDLK_WORLD_5 = 165, + SDLK_WORLD_6 = 166, + SDLK_WORLD_7 = 167, + SDLK_WORLD_8 = 168, + SDLK_WORLD_9 = 169, + SDLK_WORLD_10 = 170, + SDLK_WORLD_11 = 171, + SDLK_WORLD_12 = 172, + SDLK_WORLD_13 = 173, + SDLK_WORLD_14 = 174, + SDLK_WORLD_15 = 175, + SDLK_WORLD_16 = 176, + SDLK_WORLD_17 = 177, + SDLK_WORLD_18 = 178, + SDLK_WORLD_19 = 179, + SDLK_WORLD_20 = 180, + SDLK_WORLD_21 = 181, + SDLK_WORLD_22 = 182, + SDLK_WORLD_23 = 183, + SDLK_WORLD_24 = 184, + SDLK_WORLD_25 = 185, + SDLK_WORLD_26 = 186, + SDLK_WORLD_27 = 187, + SDLK_WORLD_28 = 188, + SDLK_WORLD_29 = 189, + SDLK_WORLD_30 = 190, + SDLK_WORLD_31 = 191, + SDLK_WORLD_32 = 192, + SDLK_WORLD_33 = 193, + SDLK_WORLD_34 = 194, + SDLK_WORLD_35 = 195, + SDLK_WORLD_36 = 196, + SDLK_WORLD_37 = 197, + SDLK_WORLD_38 = 198, + SDLK_WORLD_39 = 199, + SDLK_WORLD_40 = 200, + SDLK_WORLD_41 = 201, + SDLK_WORLD_42 = 202, + SDLK_WORLD_43 = 203, + SDLK_WORLD_44 = 204, + SDLK_WORLD_45 = 205, + SDLK_WORLD_46 = 206, + SDLK_WORLD_47 = 207, + SDLK_WORLD_48 = 208, + SDLK_WORLD_49 = 209, + SDLK_WORLD_50 = 210, + SDLK_WORLD_51 = 211, + SDLK_WORLD_52 = 212, + SDLK_WORLD_53 = 213, + SDLK_WORLD_54 = 214, + SDLK_WORLD_55 = 215, + SDLK_WORLD_56 = 216, + SDLK_WORLD_57 = 217, + SDLK_WORLD_58 = 218, + SDLK_WORLD_59 = 219, + SDLK_WORLD_60 = 220, + SDLK_WORLD_61 = 221, + SDLK_WORLD_62 = 222, + SDLK_WORLD_63 = 223, + SDLK_WORLD_64 = 224, + SDLK_WORLD_65 = 225, + SDLK_WORLD_66 = 226, + SDLK_WORLD_67 = 227, + SDLK_WORLD_68 = 228, + SDLK_WORLD_69 = 229, + SDLK_WORLD_70 = 230, + SDLK_WORLD_71 = 231, + SDLK_WORLD_72 = 232, + SDLK_WORLD_73 = 233, + SDLK_WORLD_74 = 234, + SDLK_WORLD_75 = 235, + SDLK_WORLD_76 = 236, + SDLK_WORLD_77 = 237, + SDLK_WORLD_78 = 238, + SDLK_WORLD_79 = 239, + SDLK_WORLD_80 = 240, + SDLK_WORLD_81 = 241, + SDLK_WORLD_82 = 242, + SDLK_WORLD_83 = 243, + SDLK_WORLD_84 = 244, + SDLK_WORLD_85 = 245, + SDLK_WORLD_86 = 246, + SDLK_WORLD_87 = 247, + SDLK_WORLD_88 = 248, + SDLK_WORLD_89 = 249, + SDLK_WORLD_90 = 250, + SDLK_WORLD_91 = 251, + SDLK_WORLD_92 = 252, + SDLK_WORLD_93 = 253, + SDLK_WORLD_94 = 254, + SDLK_WORLD_95 = 255, /* 0xFF */ + /*@}*/ + + /** @name Numeric keypad */ + /*@{*/ + SDLK_KP0 = 256, + SDLK_KP1 = 257, + SDLK_KP2 = 258, + SDLK_KP3 = 259, + SDLK_KP4 = 260, + SDLK_KP5 = 261, + SDLK_KP6 = 262, + SDLK_KP7 = 263, + SDLK_KP8 = 264, + SDLK_KP9 = 265, + SDLK_KP_PERIOD = 266, + SDLK_KP_DIVIDE = 267, + SDLK_KP_MULTIPLY = 268, + SDLK_KP_MINUS = 269, + SDLK_KP_PLUS = 270, + SDLK_KP_ENTER = 271, + SDLK_KP_EQUALS = 272, + /*@}*/ + + /** @name Arrows + Home/End pad */ + /*@{*/ + SDLK_UP = 273, + SDLK_DOWN = 274, + SDLK_RIGHT = 275, + SDLK_LEFT = 276, + SDLK_INSERT = 277, + SDLK_HOME = 278, + SDLK_END = 279, + SDLK_PAGEUP = 280, + SDLK_PAGEDOWN = 281, + /*@}*/ + + /** @name Function keys */ + /*@{*/ + SDLK_F1 = 282, + SDLK_F2 = 283, + SDLK_F3 = 284, + SDLK_F4 = 285, + SDLK_F5 = 286, + SDLK_F6 = 287, + SDLK_F7 = 288, + SDLK_F8 = 289, + SDLK_F9 = 290, + SDLK_F10 = 291, + SDLK_F11 = 292, + SDLK_F12 = 293, + SDLK_F13 = 294, + SDLK_F14 = 295, + SDLK_F15 = 296, + /*@}*/ + + /** @name Key state modifier keys */ + /*@{*/ + SDLK_NUMLOCK = 300, + SDLK_CAPSLOCK = 301, + SDLK_SCROLLOCK = 302, + SDLK_RSHIFT = 303, + SDLK_LSHIFT = 304, + SDLK_RCTRL = 305, + SDLK_LCTRL = 306, + SDLK_RALT = 307, + SDLK_LALT = 308, + SDLK_RMETA = 309, + SDLK_LMETA = 310, + SDLK_LSUPER = 311, /**< Left "Windows" key */ + SDLK_RSUPER = 312, /**< Right "Windows" key */ + SDLK_MODE = 313, /**< "Alt Gr" key */ + SDLK_COMPOSE = 314, /**< Multi-key compose key */ + /*@}*/ + + /** @name Miscellaneous function keys */ + /*@{*/ + SDLK_HELP = 315, + SDLK_PRINT = 316, + SDLK_SYSREQ = 317, + SDLK_BREAK = 318, + SDLK_MENU = 319, + SDLK_POWER = 320, /**< Power Macintosh power key */ + SDLK_EURO = 321, /**< Some european keyboards */ + SDLK_UNDO = 322, /**< Atari keyboard has Undo */ + /*@}*/ + + /* Add any other keys here */ + + SDLK_LAST +} SDLKey; + +/** Enumeration of valid key mods (possibly OR'd together) */ +typedef enum { + KMOD_NONE = 0x0000, + KMOD_LSHIFT= 0x0001, + KMOD_RSHIFT= 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LMETA = 0x0400, + KMOD_RMETA = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDLMod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_META (KMOD_LMETA|KMOD_RMETA) + +#endif /* _SDL_keysym_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_loadso.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_loadso.h new file mode 100644 index 00000000..45a17f9f --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_loadso.h @@ -0,0 +1,78 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_loadso.h + * System dependent library loading routines + */ + +/** @file SDL_loadso.h + * Some things to keep in mind: + * - These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * - Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * - Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + + +#ifndef _SDL_loadso_h +#define _SDL_loadso_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This function dynamically loads a shared object and returns a pointer + * to the object handle (or NULL if there was an error). + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Given an object handle, this function looks up the address of the + * named function in the shared object and returns it. This address + * is no longer valid after calling SDL_UnloadObject(). + */ +extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); + +/** Unload a shared object from memory */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_loadso_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_main.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_main.h new file mode 100644 index 00000000..b7f6b2c8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_main.h @@ -0,0 +1,106 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_main_h +#define _SDL_main_h + +#include "SDL_stdinc.h" + +/** @file SDL_main.h + * Redefine main() on Win32 and MacOS so that it is called by winmain.c + */ + +#if defined(__WIN32__) || \ + (defined(__MWERKS__) && !defined(__BEOS__)) || \ + defined(__MACOS__) || defined(__MACOSX__) || \ + defined(__SYMBIAN32__) || defined(QWS) + +#ifdef __cplusplus +#define C_LINKAGE "C" +#else +#define C_LINKAGE +#endif /* __cplusplus */ + +/** The application's main() function must be called with C linkage, + * and should be declared like this: + * @code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * @endcode + */ +#define main SDL_main + +/** The prototype for the application's main() function */ +extern C_LINKAGE int SDL_main(int argc, char *argv[]); + + +/** @name From the SDL library code -- needed for registering the app on Win32 */ +/*@{*/ +#ifdef __WIN32__ + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** This should be called from your WinMain() function, if any */ +extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); +/** This can also be called, but is no longer necessary */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); +/** This can also be called, but is no longer necessary (SDL_Quit calls it) */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +/** @name From the SDL library code -- needed for registering QuickDraw on MacOS */ +/*@{*/ +#if defined(__MACOS__) + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** Forward declaration so we don't need to include QuickDraw.h */ +struct QDGlobals; + +/** This should be called from your main() function, if any */ +extern DECLSPEC void SDLCALL SDL_InitQuickDraw(struct QDGlobals *the_qd); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +#endif /* Need to redefine main()? */ + +#endif /* _SDL_main_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mouse.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mouse.h new file mode 100644 index 00000000..a573f04e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mouse.h @@ -0,0 +1,143 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_mouse.h + * Include file for SDL mouse event handling + */ + +#ifndef _SDL_mouse_h +#define _SDL_mouse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct WMcursor WMcursor; /**< Implementation dependent */ +typedef struct SDL_Cursor { + SDL_Rect area; /**< The area of the mouse cursor */ + Sint16 hot_x, hot_y; /**< The "tip" of the cursor */ + Uint8 *data; /**< B/W cursor data */ + Uint8 *mask; /**< B/W cursor mask */ + Uint8 *save[2]; /**< Place to save cursor area */ + WMcursor *wm_cursor; /**< Window-manager cursor */ +} SDL_Cursor; + +/* Function prototypes */ +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * current mouse cursor position. You can pass NULL for either x or y. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState(). + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * Set the position of the mouse cursor (generates a mouse motion event) + */ +extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); + +/** + * Create a cursor using the specified data and mask (in MSB format). + * The cursor width must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * data mask resulting pixel on screen + * 0 1 White + * 1 1 Black + * 0 0 Transparent + * 1 0 Inverted color if possible, black if not. + * + * Cursors created with this function must be freed with SDL_FreeCursor(). + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor + (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); + +/** + * Set the currently active cursor to the specified one. + * If the cursor is currently visible, the change will be immediately + * represented on the display. + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor *cursor); + +/** + * Returns the currently active cursor. + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); + +/** + * Deallocates a cursor created with SDL_CreateCursor(). + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor *cursor); + +/** + * Toggle whether or not the cursor is shown on the screen. + * The cursor start off displayed, but can be turned off. + * SDL_ShowCursor() returns 1 if the cursor was being displayed + * before the call, or 0 if it was not. You can query the current + * state by passing a 'toggle' value of -1. + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/*@{*/ +/** Used as a mask when testing buttons in buttonstate + * Button 1: Left mouse button + * Button 2: Middle mouse button + * Button 3: Right mouse button + * Button 4: Mouse wheel up (may also be a real button) + * Button 5: Mouse wheel down (may also be a real button) + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_WHEELUP 4 +#define SDL_BUTTON_WHEELDOWN 5 +#define SDL_BUTTON_X1 6 +#define SDL_BUTTON_X2 7 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mouse_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mutex.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mutex.h new file mode 100644 index 00000000..920971df --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_mutex.h @@ -0,0 +1,177 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_mutex_h +#define _SDL_mutex_h + +/** @file SDL_mutex.h + * Functions to provide thread synchronization primitives + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** This is the timeout value which corresponds to never time out */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Mutex functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL mutex structure, defined in SDL_mutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** Create a mutex, initialized unlocked */ +extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void); + +#define SDL_LockMutex(m) SDL_mutexP(m) +/** Lock the mutex + * @return 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex); + +#define SDL_UnlockMutex(m) SDL_mutexV(m) +/** Unlock the mutex + * @return 0, or -1 on error + * + * It is an error to unlock a mutex that has not been locked by + * the current thread, and doing so results in undefined behavior. + */ +extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex); + +/** Destroy a mutex */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Semaphore functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL semaphore structure, defined in SDL_sem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** Create a semaphore, initialized with value, returns NULL on failure. */ +extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** Destroy a semaphore */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem); + +/** + * This function suspends the calling thread until the semaphore pointed + * to by sem has a positive count. It then atomically decreases the semaphore + * count. + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem); + +/** Non-blocking variant of SDL_SemWait(). + * @return 0 if the wait succeeds, + * SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem); + +/** Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if + * the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in + * the allotted time, and -1 on error. + * + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms); + +/** Atomically increases the semaphore's count (not blocking). + * @return 0, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem); + +/** Returns the current count of the semaphore */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Condition_variable_functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*@{*/ +/** The SDL condition variable structure, defined in SDL_cond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; +/*@}*/ + +/** Create a condition variable */ +extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void); + +/** Destroy a condition variable */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond); + +/** Restart one of the threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond); + +/** Restart all threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond); + +/** Wait on the condition variable, unlocking the provided mutex. + * The mutex must be locked before entering this function! + * The mutex is re-locked once the condition variable is signaled. + * @return 0 when it is signaled, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); + +/** Waits for at most 'ms' milliseconds, and returns 0 if the condition + * variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not + * signaled in the allotted time, and -1 on error. + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mutex_h */ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_name.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_name.h new file mode 100644 index 00000000..511619af --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_name.h @@ -0,0 +1,11 @@ + +#ifndef _SDLname_h_ +#define _SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* _SDLname_h_ */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_opengl.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_opengl.h new file mode 100644 index 00000000..1ccad320 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_opengl.h @@ -0,0 +1,6570 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_opengl.h + * This is a simple file to encapsulate the OpenGL API headers + */ + +#include "SDL_config.h" + +#ifdef __WIN32__ +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +#define NOMINMAX /* Don't defined min() and max() */ +#endif +#include +#endif +#ifndef NO_SDL_GLEXT +#define __glext_h_ /* Don't let gl.h include glext.h */ +#endif +#if defined(__MACOSX__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#elif defined(__MACOS__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#else +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#endif +#ifndef NO_SDL_GLEXT +#undef __glext_h_ +#endif + +/** @name GLext.h + * This file taken from "GLext.h" from the Jeff Molofee OpenGL tutorials. + * It is included here because glext.h is not available on some systems. + * If you don't want this version included, simply define "NO_SDL_GLEXT" + */ +/*@{*/ +#ifndef NO_SDL_GLEXT +#if !defined(__glext_h_) && !defined(GL_GLEXT_LEGACY) +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2005/06/20 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 29 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; /* native character */ +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptr; +typedef long GLsizeiptr; +#else +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptrARB; +typedef long GLsizeiptrARB; +#else +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and program/shader text */ +typedef char GLcharARB; /* native character */ +#if defined(__APPLE__) +typedef void *GLhandleARB; /* shader object handle */ +#else +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif +#endif + +/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendEquation (GLenum); +GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogram (GLenum); +GLAPI void APIENTRY glResetMinmax (GLenum); +GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum); +GLAPI void APIENTRY glClientActiveTexture (GLenum); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glFogCoordf (GLfloat); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *); +GLAPI void APIENTRY glFogCoordd (GLdouble); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameteri (GLenum, GLint); +GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos2i (GLint, GLint); +GLAPI void APIENTRY glWindowPos2iv (const GLint *); +GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *); +GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3iv (const GLint *); +GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQuery (GLuint); +GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void APIENTRY glEndQuery (GLenum); +GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint); +GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); +GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); +GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); +GLAPI void APIENTRY glAttachShader (GLuint, GLuint); +GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); +GLAPI void APIENTRY glCompileShader (GLuint); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum); +GLAPI void APIENTRY glDeleteProgram (GLuint); +GLAPI void APIENTRY glDeleteShader (GLuint); +GLAPI void APIENTRY glDetachShader (GLuint, GLuint); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); +GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgram (GLuint); +GLAPI GLboolean APIENTRY glIsShader (GLuint); +GLAPI void APIENTRY glLinkProgram (GLuint); +GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); +GLAPI void APIENTRY glUseProgram (GLuint); +GLAPI void APIENTRY glUniform1f (GLint, GLfloat); +GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1i (GLint, GLint); +GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glValidateProgram (GLuint); +GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); +GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); +GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void APIENTRY glEndQueryARB (GLenum); +GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1iARB (GLint, GLint); +GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogramEXT (GLenum); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint); +GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void APIENTRY glDeformSGIX (GLbitfield); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum); +GLAPI void APIENTRY glTextureLightEXT (GLenum); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *); +GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); +GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFinishFenceNV (GLuint); +GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); +GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif +#endif /* NO_SDL_GLEXT */ +/*@}*/ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_platform.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_platform.h new file mode 100644 index 00000000..11d86736 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_platform.h @@ -0,0 +1,110 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_platform.h + * Try to get a standard set of platform defines + */ + +#ifndef _SDL_platform_h +#define _SDL_platform_h + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__BEOS__) +#undef __BEOS__ +#define __BEOS__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(__APPLE__) +#undef __MACOSX__ +#define __MACOSX__ 1 +#elif defined(macintosh) +#undef __MACOS__ +#define __MACOS__ 1 +#endif +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif +#if defined(WIN32) || defined(_WIN32) +#undef __WIN32__ +#define __WIN32__ 1 +#endif + +#endif /* _SDL_platform_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_quit.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_quit.h new file mode 100644 index 00000000..6d82e7e0 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_quit.h @@ -0,0 +1,55 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_quit.h + * Include file for SDL quit event handling + */ + +#ifndef _SDL_quit_h +#define _SDL_quit_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** @file SDL_quit.h + * An SDL_QUITEVENT is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate SDL_QUITEVENT events as well. There is no way + * to determine the cause of an SDL_QUITEVENT, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + */ + +/** @file SDL_quit.h + * There are no functions directly affecting the quit event + */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) + +#endif /* _SDL_quit_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_rwops.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_rwops.h new file mode 100644 index 00000000..a450119f --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_rwops.h @@ -0,0 +1,155 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_rwops.h + * This file provides a general interface for SDL to read and write + * data sources. It can easily be extended to files, memory, etc. + */ + +#ifndef _SDL_rwops_h +#define _SDL_rwops_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the read/write operation structure -- very basic */ + +typedef struct SDL_RWops { + /** Seek to 'offset' relative to whence, one of stdio's whence values: + * SEEK_SET, SEEK_CUR, SEEK_END + * Returns the final offset in the data source. + */ + int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence); + + /** Read up to 'maxnum' objects each of size 'size' from the data + * source to the area pointed at by 'ptr'. + * Returns the number of objects read, or -1 if the read failed. + */ + int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); + + /** Write exactly 'num' objects each of size 'objsize' from the area + * pointed at by 'ptr' to data source. + * Returns 'num', or -1 if the write failed. + */ + int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num); + + /** Close and free an allocated SDL_FSops structure */ + int (SDLCALL *close)(struct SDL_RWops *context); + + Uint32 type; + union { +#if defined(__WIN32__) && !defined(__SYMBIAN32__) + struct { + int append; + void *h; + struct { + void *data; + int size; + int left; + } buffer; + } win32io; +#endif +#ifdef HAVE_STDIO_H + struct { + int autoclose; + FILE *fp; + } stdio; +#endif + struct { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct { + void *data1; + } unknown; + } hidden; + +} SDL_RWops; + + +/** @name Functions to create SDL_RWops structures from various data sources */ +/*@{*/ + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); + +#ifdef HAVE_STDIO_H +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); +#endif + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); + +extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); + +/*@}*/ + +/** @name Seek Reference Points */ +/*@{*/ +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ +/*@}*/ + +/** @name Macros to easily read and write from an SDL_RWops structure */ +/*@{*/ +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) +/*@}*/ + +/** @name Read an item of the specified endianness and return in native format */ +/*@{*/ +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); +/*@}*/ + +/** @name Write an item of native format to the specified endianness */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); +extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rwops_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_stdinc.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_stdinc.h new file mode 100644 index 00000000..e1f85fb7 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_stdinc.h @@ -0,0 +1,620 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_stdinc.h + * This is a general header that includes C language support + */ + +#ifndef _SDL_stdinc_h +#define _SDL_stdinc_h + +#include "SDL_config.h" + + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +# include +#endif + +/** The number of elements in an array */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/* Use proper C++ casts when compiled as C++ to be compatible with the option + -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above. */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#endif + +/** @name Basic data types */ +/*@{*/ +typedef enum { + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; + +typedef int8_t Sint8; +typedef uint8_t Uint8; +typedef int16_t Sint16; +typedef uint16_t Uint16; +typedef int32_t Sint32; +typedef uint32_t Uint32; + +#ifdef SDL_HAS_64BIT_TYPE +typedef int64_t Sint64; +#ifndef SYMBIAN32_GCCE +typedef uint64_t Uint64; +#endif +#else +/* This is really just a hack to prevent the compiler from complaining */ +typedef struct { + Uint32 hi; + Uint32 lo; +} Uint64, Sint64; +#endif + +/*@}*/ + +/** @name Make sure the types really have the right sizes */ +/*@{*/ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] + +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +/*@}*/ + +/** @name Enum Size Check + * Check to make sure enums are the size of ints, for structure packing. + * For both Watcom C/C++ and Borland C/C++ the compiler option that makes + * enums having the size of an int must be enabled. + * This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). + */ +/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ +#ifdef __MWERKS__ +#pragma enumsalwaysint on +#endif + +typedef enum { + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +#ifndef __NDS__ +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +/*@}*/ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_MALLOC +#define SDL_malloc malloc +#else +extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); +#endif + +#ifdef HAVE_CALLOC +#define SDL_calloc calloc +#else +extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); +#endif + +#ifdef HAVE_REALLOC +#define SDL_realloc realloc +#else +extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); +#endif + +#ifdef HAVE_FREE +#define SDL_free free +#else +extern DECLSPEC void SDLCALL SDL_free(void *mem); +#endif + +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) + #pragma alloca +# elif defined(__MRC__) + void *alloca (unsigned); +# else + char *alloca (); +# endif +#endif +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +#ifdef HAVE_GETENV +#define SDL_getenv getenv +#else +extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); +#endif + +#ifdef HAVE_PUTENV +#define SDL_putenv putenv +#else +extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); +#endif + +#ifdef HAVE_QSORT +#define SDL_qsort qsort +#else +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, + int (*compare)(const void *, const void *)); +#endif + +#ifdef HAVE_ABS +#define SDL_abs abs +#else +#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) +#endif + +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +#ifdef HAVE_CTYPE_H +#define SDL_isdigit(X) isdigit(X) +#define SDL_isspace(X) isspace(X) +#define SDL_toupper(X) toupper(X) +#define SDL_tolower(X) tolower(X) +#else +#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) +#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) +#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) +#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) +#endif + +#ifdef HAVE_MEMSET +#define SDL_memset memset +#else +extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_memset4(dst, val, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; stosl\n\t" \ + : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memset4 +#define SDL_memset4(dst, val, len) \ +do { \ + unsigned _count = (len); \ + unsigned _n = (_count + 3) / 4; \ + Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ + Uint32 _val = (val); \ + if (len == 0) break; \ + switch (_count % 4) { \ + case 0: do { *_p++ = _val; \ + case 3: *_p++ = _val; \ + case 2: *_p++ = _val; \ + case 1: *_p++ = _val; \ + } while ( --_n ); \ + } \ +} while(0) +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl\n\t" \ + "testb $2,%b4\n\t" \ + "je 1f\n\t" \ + "movsw\n" \ + "1:\ttestb $1,%b4\n\t" \ + "je 2f\n\t" \ + "movsb\n" \ + "2:" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy +#ifdef HAVE_MEMCPY +#define SDL_memcpy memcpy +#elif defined(HAVE_BCOPY) +#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) +#else +extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); +#endif +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy4(dst, src, len) \ +do { \ + int ecx, edi, esi; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl" \ + : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ + : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy4 +#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_revcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + char *dstp = SDL_static_cast(char *, dst); \ + char *srcp = SDL_static_cast(char *, src); \ + int n = (len); \ + if ( n >= 4 ) { \ + __asm__ __volatile__ ( \ + "std\n\t" \ + "rep ; movsl\n\t" \ + "cld\n\t" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (n >> 2), \ + "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ + : "memory" ); \ + } \ + switch (n & 3) { \ + case 3: dstp[2] = srcp[2]; \ + case 2: dstp[1] = srcp[1]; \ + case 1: dstp[0] = srcp[0]; \ + break; \ + default: \ + break; \ + } \ +} while(0) +#endif +#ifndef SDL_revcpy +extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); +#endif + +#ifdef HAVE_MEMMOVE +#define SDL_memmove memmove +#elif defined(HAVE_BCOPY) +#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) +#else +#define SDL_memmove(dst, src, len) \ +do { \ + if ( dst < src ) { \ + SDL_memcpy(dst, src, len); \ + } else { \ + SDL_revcpy(dst, src, len); \ + } \ +} while(0) +#endif + +#ifdef HAVE_MEMCMP +#define SDL_memcmp memcmp +#else +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); +#endif + +#ifdef HAVE_STRLEN +#define SDL_strlen strlen +#else +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); +#endif + +#ifdef HAVE_STRLCPY +#define SDL_strlcpy strlcpy +#else +extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRLCAT +#define SDL_strlcat strlcat +#else +extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRDUP +#define SDL_strdup strdup +#else +extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); +#endif + +#ifdef HAVE__STRREV +#define SDL_strrev _strrev +#else +extern DECLSPEC char * SDLCALL SDL_strrev(char *string); +#endif + +#ifdef HAVE__STRUPR +#define SDL_strupr _strupr +#else +extern DECLSPEC char * SDLCALL SDL_strupr(char *string); +#endif + +#ifdef HAVE__STRLWR +#define SDL_strlwr _strlwr +#else +extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); +#endif + +#ifdef HAVE_STRCHR +#define SDL_strchr strchr +#elif defined(HAVE_INDEX) +#define SDL_strchr index +#else +extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); +#endif + +#ifdef HAVE_STRRCHR +#define SDL_strrchr strrchr +#elif defined(HAVE_RINDEX) +#define SDL_strrchr rindex +#else +extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); +#endif + +#ifdef HAVE_STRSTR +#define SDL_strstr strstr +#else +extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); +#endif + +#ifdef HAVE_ITOA +#define SDL_itoa itoa +#else +#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) +#endif + +#ifdef HAVE__LTOA +#define SDL_ltoa _ltoa +#else +extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); +#endif + +#ifdef HAVE__UITOA +#define SDL_uitoa _uitoa +#else +#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) +#endif + +#ifdef HAVE__ULTOA +#define SDL_ultoa _ultoa +#else +extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOL +#define SDL_strtol strtol +#else +extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOUL +#define SDL_strtoul strtoul +#else +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); +#endif + +#ifdef SDL_HAS_64BIT_TYPE + +#ifdef HAVE__I64TOA +#define SDL_lltoa _i64toa +#else +extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); +#endif + +#ifdef HAVE__UI64TOA +#define SDL_ulltoa _ui64toa +#else +extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOLL +#define SDL_strtoll strtoll +#else +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOULL +#define SDL_strtoull strtoull +#else +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); +#endif + +#endif /* SDL_HAS_64BIT_TYPE */ + +#ifdef HAVE_STRTOD +#define SDL_strtod strtod +#else +extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); +#endif + +#ifdef HAVE_ATOI +#define SDL_atoi atoi +#else +#define SDL_atoi(X) SDL_strtol(X, NULL, 0) +#endif + +#ifdef HAVE_ATOF +#define SDL_atof atof +#else +#define SDL_atof(X) SDL_strtod(X, NULL) +#endif + +#ifdef HAVE_STRCMP +#define SDL_strcmp strcmp +#else +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCMP +#define SDL_strncmp strncmp +#else +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_STRCASECMP +#define SDL_strcasecmp strcasecmp +#elif defined(HAVE__STRICMP) +#define SDL_strcasecmp _stricmp +#else +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCASECMP +#define SDL_strncasecmp strncasecmp +#elif defined(HAVE__STRNICMP) +#define SDL_strncasecmp _strnicmp +#else +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_SSCANF +#define SDL_sscanf sscanf +#else +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +#endif + +#ifdef HAVE_SNPRINTF +#define SDL_snprintf snprintf +#else +extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); +#endif + +#ifdef HAVE_VSNPRINTF +#define SDL_vsnprintf vsnprintf +#else +extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); +#endif + +/** @name SDL_ICONV Error Codes + * The SDL implementation of iconv() returns these error codes + */ +/*@{*/ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 +/*@}*/ + +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +#define SDL_iconv_t iconv_t +#define SDL_iconv_open iconv_open +#define SDL_iconv_close iconv_close +#else +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +#endif +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +/** This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + */ +extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_stdinc_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_syswm.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_syswm.h new file mode 100644 index 00000000..1da97fa3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_syswm.h @@ -0,0 +1,226 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_syswm.h + * Include file for SDL custom system window manager hooks + */ + +#ifndef _SDL_syswm_h +#define _SDL_syswm_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_syswm.h + * Your application has access to a special type of event 'SDL_SYSWMEVENT', + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState() + */ +#ifdef SDL_PROTOTYPES_ONLY +struct SDL_SysWMinfo; +typedef struct SDL_SysWMinfo SDL_SysWMinfo; +#else + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +/** These are the various supported subsystems under UNIX */ +typedef enum { + SDL_SYSWM_X11 +} SDL_SYSWM_TYPE; + +/** The UNIX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + XEvent xevent; + } event; +}; + +/** The UNIX custom window manager information structure. + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +typedef struct SDL_SysWMinfo { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + struct { + Display *display; /**< The X11 display */ + Window window; /**< The X11 display window */ + /** These locking functions should be called around + * any X11 functions using the display variable, + * but not the gfxdisplay variable. + * They lock the event thread, so should not be + * called around event functions or from event filters. + */ + /*@{*/ + void (*lock_func)(void); + void (*unlock_func)(void); + /*@}*/ + + /** @name Introduced in SDL 1.0.2 */ + /*@{*/ + Window fswindow; /**< The X11 fullscreen window */ + Window wmwindow; /**< The X11 managed input window */ + /*@}*/ + + /** @name Introduced in SDL 1.2.12 */ + /*@{*/ + Display *gfxdisplay; /**< The X11 display to which rendering is done */ + /*@}*/ + } x11; + } info; +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_NANOX) +#include + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version ; + GR_WINDOW_ID window ; /* The display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || defined(SDL_VIDEO_DRIVER_GAPI) +#define WIN32_LEAN_AND_MEAN +#include + +/** The windows custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + HWND window; /**< The Win32 display window */ + HGLRC hglrc; /**< The OpenGL context, if any */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_RISCOS) + +/** RISC OS custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int eventCode; /**< The window for the message */ + int pollBlock[64]; +}; + +/** The RISC OS custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int wimpVersion; /**< Wimp version running under */ + int taskHandle; /**< The RISC OS task handle */ + int window; /**< The RISC OS display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_PHOTON) +#include +#include + +/** The QNX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The QNX custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#else + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The generic custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#endif /* video driver type */ + +#endif /* SDL_PROTOTYPES_ONLY */ + +/* Function prototypes */ +/** + * This function gives you custom hooks into the window manager information. + * It fills the structure pointed to by 'info' with custom information and + * returns 0 if the function is not implemented, 1 if the function is + * implemented and no error occurred, and -1 if the version member of + * the 'info' structure is not filled in or not supported. + * + * You typically use this function like this: + * @code + * SDL_SysWMinfo info; + * SDL_VERSION(&info.version); + * if ( SDL_GetWMInfo(&info) ) { ... } + * @endcode + */ +extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_syswm_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_thread.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_thread.h new file mode 100644 index 00000000..dec71376 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_thread.h @@ -0,0 +1,115 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_thread_h +#define _SDL_thread_h + +/** @file SDL_thread.h + * Header for the SDL thread management routines + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/** Create a thread */ +#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__) +/** + * We compile SDL into a DLL on OS/2. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL.DLL will + * be initialized for those threads, and not the RTL of the calling application! + * To solve this, we make a little hack here. + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL.DLL which uses this API, + * then the RTL of SDL.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD +#ifndef _WIN32_WCE +#include /* This has _beginthread() and _endthread() defined! */ +#endif + +#ifdef __OS2__ +typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); +typedef void (*pfnSDL_CurrentEndThread)(void); +#else +typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, + unsigned (__stdcall *func)(void *), void *arg, + unsigned, unsigned *threadID); +typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); +#endif + +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread); + +#ifdef __OS2__ +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) +#elif defined(_WIN32_WCE) +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) +#else +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) +#endif +#else +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data); +#endif + +/** Get the 32-bit thread identifier for the current thread */ +extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); + +/** Get the 32-bit thread identifier for the specified thread, + * equivalent to SDL_ThreadID() if the specified thread is NULL. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread); + +/** Wait for a thread to finish. + * The return code for the thread function is placed in the area + * pointed to by 'status', if 'status' is not NULL. + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); + +/** Forcefully kill a thread without worrying about its state */ +extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_thread_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_timer.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_timer.h new file mode 100644 index 00000000..d7cd0246 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_timer.h @@ -0,0 +1,125 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_timer_h +#define _SDL_timer_h + +/** @file SDL_timer.h + * Header for the SDL time management routines + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the OS scheduler timeslice, in milliseconds */ +#define SDL_TIMESLICE 10 + +/** This is the maximum resolution of the SDL timer on all platforms */ +#define TIMER_RESOLUTION 10 /**< Experimentally determined */ + +/** + * Get the number of milliseconds since the SDL library initialization. + * Note that this value wraps if the program runs for more than ~49 days. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** Wait a specified number of milliseconds before returning */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** Function prototype for the timer callback function */ +typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval); + +/** + * Set a callback to run after the specified number of milliseconds has + * elapsed. The callback function is passed the current timer interval + * and returns the next timer interval. If the returned value is the + * same as the one passed in, the periodic alarm continues, otherwise a + * new alarm is scheduled. If the callback returns 0, the periodic alarm + * is cancelled. + * + * To cancel a currently running timer, call SDL_SetTimer(0, NULL); + * + * The timer callback function may run in a different thread than your + * main code, and so shouldn't call any functions from within itself. + * + * The maximum resolution of this timer is 10 ms, which means that if + * you request a 16 ms timer, your callback will run approximately 20 ms + * later on an unloaded system. If you wanted to set a flag signaling + * a frame update at 30 frames per second (every 33 ms), you might set a + * timer for 30 ms: + * @code SDL_SetTimer((33/10)*10, flag_update); @endcode + * + * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). + * + * Under UNIX, you should not use raise or use SIGALRM and this function + * in the same program, as it is implemented using setitimer(). You also + * should not use this function in multi-threaded applications as signals + * to multi-threaded apps have undefined behavior in some implementations. + * + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback); + +/** @name New timer API + * New timer API, supports multiple timers + * Written by Stephane Peter + */ +/*@{*/ + +/** + * Function prototype for the new timer callback function. + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param); + +/** Definition of the timer ID type */ +typedef struct _SDL_TimerID *SDL_TimerID; + +/** Add a new timer to the pool of timers already running. + * Returns a timer ID, or NULL when an error occurs. + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); + +/** + * Remove one of the multiple timers knowing its ID. + * Returns a boolean value indicating success. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_timer_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_types.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_types.h new file mode 100644 index 00000000..cfa35236 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_types.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_types.h + * @deprecated Use SDL_stdinc.h instead. + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_version.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_version.h new file mode 100644 index 00000000..fa02c3f6 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_version.h @@ -0,0 +1,91 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_version.h + * This header defines the current SDL version + */ + +#ifndef _SDL_version_h +#define _SDL_version_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Version Number + * Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL + */ +/*@{*/ +#define SDL_MAJOR_VERSION 1 +#define SDL_MINOR_VERSION 2 +#define SDL_PATCHLEVEL 14 +/*@}*/ + +typedef struct SDL_version { + Uint8 major; + Uint8 minor; + Uint8 patch; +} SDL_version; + +/** + * This macro can be used to fill a version structure with the compile-time + * version of the SDL library. + */ +#define SDL_VERSION(X) \ +{ \ + (X)->major = SDL_MAJOR_VERSION; \ + (X)->minor = SDL_MINOR_VERSION; \ + (X)->patch = SDL_PATCHLEVEL; \ +} + +/** This macro turns the version numbers into a numeric value: + * (1,2,3) -> (1203) + * This assumes that there will never be more than 100 patchlevels + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** This is the version number macro for the current SDL version */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) + +/** This macro will evaluate to true if compiled with SDL at least X.Y.Z */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) + +/** This function gets the version of the dynamically linked SDL library. + * it should NOT be used to fill a version structure, instead you should + * use the SDL_Version() macro. + */ +extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_version_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_video.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_video.h new file mode 100644 index 00000000..8f7f3052 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/SDL_video.h @@ -0,0 +1,951 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_video.h + * Header file for access to the SDL raw framebuffer window + */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Transparency definitions + * These define alpha as the opacity of a surface + */ +/*@{*/ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/*@}*/ + +/** @name Useful data types */ +/*@{*/ +typedef struct SDL_Rect { + Sint16 x, y; + Uint16 w, h; +} SDL_Rect; + +typedef struct SDL_Color { + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 unused; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette { + int ncolors; + SDL_Color *colors; +} SDL_Palette; +/*@}*/ + +/** Everything in the pixel format structure is read-only */ +typedef struct SDL_PixelFormat { + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + + /** RGB color key information */ + Uint32 colorkey; + /** Alpha value information (per-surface alpha) */ + Uint8 alpha; +} SDL_PixelFormat; + +/** This structure should be treated as read-only, except for 'pixels', + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface { + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + Uint16 pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + int offset; /**< Private */ + + /** Hardware-specific surface info */ + struct private_hwdata *hwdata; + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + Uint32 unused1; /**< for binary compatibility */ + + /** Allow recursive locks */ + Uint32 locked; /**< Private */ + + /** info for fast blit mapping to other surfaces */ + struct SDL_BlitMap *map; /**< Private */ + + /** format version, bumped at every change to invalidate blit maps */ + unsigned int format_version; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** @name SDL_Surface Flags + * These are the currently supported flags for the SDL_surface + */ +/*@{*/ + +/** Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ +/*@{*/ +#define SDL_SWSURFACE 0x00000000 /**< Surface is in system memory */ +#define SDL_HWSURFACE 0x00000001 /**< Surface is in video memory */ +#define SDL_ASYNCBLIT 0x00000004 /**< Use asynchronous blits if possible */ +/*@}*/ + +/** Available for SDL_SetVideoMode() */ +/*@{*/ +#define SDL_ANYFORMAT 0x10000000 /**< Allow any video depth/pixel-format */ +#define SDL_HWPALETTE 0x20000000 /**< Surface has exclusive palette */ +#define SDL_DOUBLEBUF 0x40000000 /**< Set up double-buffered video mode */ +#define SDL_FULLSCREEN 0x80000000 /**< Surface is a full screen display */ +#define SDL_OPENGL 0x00000002 /**< Create an OpenGL rendering context */ +#define SDL_OPENGLBLIT 0x0000000A /**< Create an OpenGL rendering context and use it for blitting */ +#define SDL_RESIZABLE 0x00000010 /**< This video mode may be resized */ +#define SDL_NOFRAME 0x00000020 /**< No window caption or edge frame */ +/*@}*/ + +/** Used internally (read-only) */ +/*@{*/ +#define SDL_HWACCEL 0x00000100 /**< Blit uses hardware acceleration */ +#define SDL_SRCCOLORKEY 0x00001000 /**< Blit uses a source color key */ +#define SDL_RLEACCELOK 0x00002000 /**< Private flag */ +#define SDL_RLEACCEL 0x00004000 /**< Surface is RLE encoded */ +#define SDL_SRCALPHA 0x00010000 /**< Blit uses source alpha blending */ +#define SDL_PREALLOC 0x01000000 /**< Surface uses preallocated memory */ +/*@}*/ + +/*@}*/ + +/** Evaluates to true if the surface needs to be locked before access */ +#define SDL_MUSTLOCK(surface) \ + (surface->offset || \ + ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) + +/** typedef for private surface blitting functions */ +typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, + struct SDL_Surface *dst, SDL_Rect *dstrect); + + +/** Useful for determining the video hardware capabilities */ +typedef struct SDL_VideoInfo { + Uint32 hw_available :1; /**< Flag: Can you create hardware surfaces? */ + Uint32 wm_available :1; /**< Flag: Can you talk to a window manager? */ + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; /**< Flag: Accelerated blits HW --> HW */ + Uint32 blit_hw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_hw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_sw :1; /**< Flag: Accelerated blits SW --> HW */ + Uint32 blit_sw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_sw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_fill :1; /**< Flag: Accelerated color fill */ + Uint32 UnusedBits3 :16; + Uint32 video_mem; /**< The total amount of video memory (in K) */ + SDL_PixelFormat *vfmt; /**< Value: The format of the video surface */ + int current_w; /**< Value: The current video mode width */ + int current_h; /**< Value: The current video mode height */ +} SDL_VideoInfo; + + +/** @name Overlay Formats + * The most common video overlay formats. + * For an explanation of these pixel formats, see: + * http://www.webartz.com/fourcc/indexyuv.htm + * + * For information on the relationship between color spaces, see: + * http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html + */ +/*@{*/ +#define SDL_YV12_OVERLAY 0x32315659 /**< Planar mode: Y + V + U (3 planes) */ +#define SDL_IYUV_OVERLAY 0x56555949 /**< Planar mode: Y + U + V (3 planes) */ +#define SDL_YUY2_OVERLAY 0x32595559 /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ +#define SDL_UYVY_OVERLAY 0x59565955 /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ +#define SDL_YVYU_OVERLAY 0x55595659 /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ +/*@}*/ + +/** The YUV hardware video overlay */ +typedef struct SDL_Overlay { + Uint32 format; /**< Read-only */ + int w, h; /**< Read-only */ + int planes; /**< Read-only */ + Uint16 *pitches; /**< Read-only */ + Uint8 **pixels; /**< Read-write */ + + /** @name Hardware-specific surface info */ + /*@{*/ + struct private_yuvhwfuncs *hwfuncs; + struct private_yuvhwdata *hwdata; + /*@{*/ + + /** @name Special flags */ + /*@{*/ + Uint32 hw_overlay :1; /**< Flag: This overlay hardware accelerated? */ + Uint32 UnusedBits :31; + /*@}*/ +} SDL_Overlay; + + +/** Public enumeration for setting the OpenGL window attributes. */ +typedef enum { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_SWAP_CONTROL +} SDL_GLattr; + +/** @name flags for SDL_SetPalette() */ +/*@{*/ +#define SDL_LOGPAL 0x01 +#define SDL_PHYSPAL 0x02 +/*@}*/ + +/* Function prototypes */ + +/** + * @name Video Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the video driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +/** + * Initializes the video subsystem. Sets up a connection + * to the window manager, etc, and determines the current video mode and + * pixel format, but does not initialize a window or graphics mode. + * Note that event handling is activated by this routine. + * + * If you use both sound and video in your application, you need to call + * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, + * you won't be able to set full-screen display modes. + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, Uint32 flags); +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * video driver, and returns a pointer to it if the video driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); + +/** + * This function returns a pointer to the current display surface. + * If SDL is doing format conversion on the display surface, this + * function returns the publicly visible surface, not the real video + * surface. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void); + +/** + * This function returns a read-only pointer to information about the + * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' + * member of the returned structure will contain the pixel format of the + * "best" video mode. + */ +extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); + +/** + * Check to see if a particular video mode is supported. + * It returns 0 if the requested mode is not supported under any bit depth, + * or returns the bits-per-pixel of the closest available mode with the + * given width and height. If this bits-per-pixel is different from the + * one used when setting the video mode, SDL_SetVideoMode() will succeed, + * but will emulate the requested bits-per-pixel with a shadow surface. + * + * The arguments to SDL_VideoModeOK() are the same ones you would pass to + * SDL_SetVideoMode() + */ +extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); + +/** + * Return a pointer to an array of available screen dimensions for the + * given format and video flags, sorted largest to smallest. Returns + * NULL if there are no dimensions available for a particular format, + * or (SDL_Rect **)-1 if any dimension is okay for the given format. + * + * If 'format' is NULL, the mode list will be for the format given + * by SDL_GetVideoInfo()->vfmt + */ +extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); + +/** + * Set up a video mode with the specified width, height and bits-per-pixel. + * + * If 'bpp' is 0, it is treated as the current display bits per pixel. + * + * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the + * requested bits-per-pixel, but will return whatever video pixel format is + * available. The default is to emulate the requested pixel format if it + * is not natively available. + * + * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in + * video memory, if possible, and you may have to call SDL_LockSurface() + * in order to access the raw framebuffer. Otherwise, the video surface + * will be created in system memory. + * + * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle + * updates asynchronously, but you must always lock before accessing pixels. + * SDL will wait for updates to complete before returning from the lock. + * + * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee + * that the colors set by SDL_SetColors() will be the colors you get. + * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all + * of the colors exactly the way they are requested, and you should look + * at the video surface structure to determine the actual palette. + * If SDL cannot guarantee that the colors you request can be set, + * i.e. if the colormap is shared, then the video surface may be created + * under emulation in system memory, overriding the SDL_HWSURFACE flag. + * + * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set + * a fullscreen video mode. The default is to create a windowed mode + * if the current graphics system has a window manager. + * If the SDL library is able to set a fullscreen video mode, this flag + * will be set in the surface that is returned. + * + * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up + * two surfaces in video memory and swap between them when you call + * SDL_Flip(). This is usually slower than the normal single-buffering + * scheme, but prevents "tearing" artifacts caused by modifying video + * memory while the monitor is refreshing. It should only be used by + * applications that redraw the entire screen on every update. + * + * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the + * window manager, if any, to resize the window at runtime. When this + * occurs, SDL will send a SDL_VIDEORESIZE event to you application, + * and you must respond to the event by re-calling SDL_SetVideoMode() + * with the requested size (or another size that suits the application). + * + * If SDL_NOFRAME is set in 'flags', the SDL library will create a window + * without any title bar or frame decoration. Fullscreen video modes have + * this flag set automatically. + * + * This function returns the video framebuffer surface, or NULL if it fails. + * + * If you rely on functionality provided by certain video flags, check the + * flags of the returned surface to make sure that functionality is available. + * SDL will fall back to reduced functionality if the exact flags you wanted + * are not available. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode + (int width, int height, int bpp, Uint32 flags); + +/** @name SDL_Update Functions + * These functions should not be called while 'screen' is locked. + */ +/*@{*/ +/** + * Makes sure the given list of rectangles is updated on the given screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRects + (SDL_Surface *screen, int numrects, SDL_Rect *rects); +/** + * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire + * screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRect + (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); +/*@}*/ + +/** + * On hardware that supports double-buffering, this function sets up a flip + * and returns. The hardware will wait for vertical retrace, and then swap + * video buffers before the next video surface blit or lock will return. + * On hardware that doesn not support double-buffering, this is equivalent + * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); + * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when + * setting the video mode for this function to perform hardware flipping. + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface *screen); + +/** + * Set the gamma correction for each of the color channels. + * The gamma values range (approximately) between 0.1 and 10.0 + * + * If this function isn't supported directly by the hardware, it will + * be emulated using gamma ramps, if available. If successful, this + * function returns 0, otherwise it returns -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); + +/** + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * You may pass NULL for any of the channels to leave it unchanged. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue); + +/** + * Retrieve the current values of the gamma translation tables. + * + * You must pass in valid pointers to arrays of 256 16-bit quantities. + * Any of the pointers may be NULL to ignore that channel. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); + +/** + * Sets a portion of the colormap for the given 8-bit surface. If 'surface' + * is not a palettized surface, this function does nothing, returning 0. + * If all of the colors were set as passed to SDL_SetColors(), it will + * return 1. If not all the color entries were set exactly as given, + * it will return 0, and you should look at the surface palette to + * determine the actual color palette. + * + * When 'surface' is the surface associated with the current display, the + * display colormap will be updated with the requested colors. If + * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() + * will always return 1, and the palette is guaranteed to be set the way + * you desire, even if the window colormap has to be warped or run under + * emulation. + */ +extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, + SDL_Color *colors, int firstcolor, int ncolors); + +/** + * Sets a portion of the colormap for a given 8-bit surface. + * 'flags' is one or both of: + * SDL_LOGPAL -- set logical palette, which controls how blits are mapped + * to/from the surface, + * SDL_PHYSPAL -- set physical palette, which controls how pixels look on + * the screen + * Only screens have physical palettes. Separate change of physical/logical + * palettes is only possible if the screen has SDL_HWPALETTE set. + * + * The return value is 1 if all colours could be set as requested, and 0 + * otherwise. + * + * SDL_SetColors() is equivalent to calling this function with + * flags = (SDL_LOGPAL|SDL_PHYSPAL). + */ +extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, + SDL_Color *colors, int firstcolor, + int ncolors); + +/** + * Maps an RGB triple to an opaque pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b); + +/** + * Maps an RGBA quadruple to a pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a); + +/** + * Maps a pixel value into the RGB components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b); + +/** + * Maps a pixel value into the RGBA components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); + +/** @sa SDL_CreateRGBSurface */ +#define SDL_AllocSurface SDL_CreateRGBSurface +/** + * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * If the function runs out of memory, it will return NULL. + * + * The 'flags' tell what kind of surface to create. + * SDL_SWSURFACE means that the surface should be created in system memory. + * SDL_HWSURFACE means that the surface should be created in video memory, + * with the same format as the display surface. This is useful for surfaces + * that will not change much, to take advantage of hardware acceleration + * when being blitted to the display surface. + * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with + * this surface, but you must always lock it before accessing the pixels. + * SDL will wait for current blits to finish before returning from the lock. + * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. + * If the hardware supports acceleration of colorkey blits between + * two surfaces in video memory, SDL will try to place the surface in + * video memory. If this isn't possible or if there is no hardware + * acceleration available, the surface will be placed in system memory. + * SDL_SRCALPHA means that the surface will be used for alpha blits and + * if the hardware supports hardware acceleration of alpha blits between + * two surfaces in video memory, to place the surface in video memory + * if possible, otherwise it will be placed in system memory. + * If the surface is created in video memory, blits will be _much_ faster, + * but the surface format must be identical to the video surface format, + * and the only way to access the pixels member of the surface is to use + * the SDL_LockSurface() and SDL_UnlockSurface() calls. + * If the requested surface actually resides in video memory, SDL_HWSURFACE + * will be set in the flags member of the returned surface. If for some + * reason the surface could not be placed in video memory, it will not have + * the SDL_HWSURFACE flag set, and will be created in system memory instead. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +/** @sa SDL_CreateRGBSurface */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, int height, int depth, int pitch, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface *surface); + +/** + * SDL_LockSurface() sets up a surface for directly accessing the pixels. + * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write + * to and read from 'surface->pixels', using the pixel format stored in + * 'surface->format'. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. In particular, if the + * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you + * will not need to lock the display surface before accessing it. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface *surface); +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); + +/** + * Load a surface from a seekable SDL data source (memory or file.) + * If 'freesrc' is non-zero, the source will be closed after being read. + * Returns the new surface, or NULL if there was an error. + * The new surface should be freed with SDL_FreeSurface(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); + +/** Convenience macro -- load a surface from a file */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data source (memory or file.) + * If 'freedst' is non-zero, the source will be closed after being written. + * Returns 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface *surface, SDL_RWops *dst, int freedst); + +/** Convenience macro -- save a surface to a file */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * Sets the color key (transparent pixel) in a blittable surface. + * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), + * 'key' will be the transparent pixel in the source image of a blit. + * SDL_RLEACCEL requests RLE acceleration for the surface if present, + * and removes RLE acceleration if absent. + * If 'flag' is 0, this function clears any current color key. + * This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey + (SDL_Surface *surface, Uint32 flag, Uint32 key); + +/** + * This function sets the alpha value for the entire surface, as opposed to + * using the alpha component of each pixel. This value measures the range + * of transparency of the surface, 0 being completely transparent to 255 + * being completely opaque. An 'alpha' value of 255 causes blits to be + * opaque, the source pixels copied to the destination (the default). Note + * that per-surface alpha can be combined with colorkey transparency. + * + * If 'flag' is 0, alpha blending is disabled for the surface. + * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. + * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the + * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. + * + * The 'alpha' parameter is ignored for surfaces that have an alpha channel. + */ +extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); + +/** + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); + +/** + * Gets the clipping rectangle for the destination surface in a blit. + * 'rect' must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); + +/** + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + * + * This function is used internally by SDL_DisplayFormat(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface + (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); + +/** + * This performs a fast blit from the source surface to the destination + * surface. It assumes that the source and destination rectangles are + * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire + * surface (src or dst) is copied. The final blit rectangles are saved + * in 'srcrect' and 'dstrect' after all clipping is performed. + * If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without alpha and colorkey + * are defined as follows: + * + * RGBA->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using alpha-channel). + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy RGB. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value); + * set destination alpha to opaque. + * SDL_SRCALPHA not set: + * copy RGB, set destination alpha to source per-surface alpha value. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * RGBA->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source alpha channel) the RGB values; + * leave destination alpha untouched. [Note: is this correct?] + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy all of RGBA to the destination. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value). + * SDL_SRCALPHA not set: + * copy RGB. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * If either of the surfaces were in video memory, and the blit returns -2, + * the video memory was lost, so it should be reloaded with artwork and + * re-blitted: + * @code + * while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { + * while ( SDL_LockSurface(image) < 0 ) + * Sleep(10); + * -- Write image pixels to image->pixels -- + * SDL_UnlockSurface(image); + * } + * @endcode + * + * This happens under DirectX 5.0 when the system switches away from your + * fullscreen application. The lock will also fail until you have access + * to the video memory again. + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** This is the public blit function, SDL_BlitSurface(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlit() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); +/** This is a semi-private blit function and it performs low-level surface + * blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/** + * This function performs a fast fill of the given rectangle with 'color' + * The given rectangle is clipped to the destination surface clip area + * and the final fill rectangle is saved in the passed in pointer. + * If 'dstrect' is NULL, the whole surface will be filled with 'color' + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer, suitable for fast + * blitting onto the display surface. It calls SDL_ConvertSurface() + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormat(SDL_Surface *surface); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer (if possible), + * suitable for fast alpha blitting onto the display surface. + * The new surface will always have an alpha channel. + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormatAlpha(SDL_Surface *surface); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name YUV video surface overlay functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** This function creates a video output overlay + * Calling the returned surface an overlay is something of a misnomer because + * the contents of the display surface underneath the area where the overlay + * is shown is undefined - it may be overwritten with the converted YUV data. + */ +extern DECLSPEC SDL_Overlay * SDLCALL SDL_CreateYUVOverlay(int width, int height, + Uint32 format, SDL_Surface *display); + +/** Lock an overlay for direct access, and unlock it when you are done */ +extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay *overlay); +extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay); + +/** Blit a video overlay to the display surface. + * The contents of the video surface underneath the blit destination are + * not defined. + * The width and height of the destination rectangle may be different from + * that of the overlay, but currently only 2x scaling is supported. + */ +extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); + +/** Free a video overlay */ +extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay *overlay); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name OpenGL support functions. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Dynamically load an OpenGL library, or the default one if path is NULL + * + * If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * Get the address of a GL function + */ +extern DECLSPEC void * SDLCALL SDL_GL_GetProcAddress(const char* proc); + +/** + * Set an attribute of the OpenGL subsystem before intialization. + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * Get an attribute of the OpenGL subsystem from the windowing + * interface, such as glX. This is of course different from getting + * the values from SDL's internal OpenGL subsystem, which only + * stores the values you request before initialization. + * + * Developers should track the values they pass into SDL_GL_SetAttribute + * themselves if they want to retrieve these values. + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); + +/** + * Swap the OpenGL buffers, if double-buffering is supported. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); + +/** @name OpenGL Internal Functions + * Internal functions that should not be called unless you have read + * and understood the source code for these functions. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); +extern DECLSPEC void SDLCALL SDL_GL_Lock(void); +extern DECLSPEC void SDLCALL SDL_GL_Unlock(void); +/*@}*/ + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Window Manager Functions */ +/** These functions allow interaction with the window manager, if any. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Sets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); +/** + * Gets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon); + +/** + * Sets the icon for the display window. + * This function must be called before the first call to SDL_SetVideoMode(). + * It takes an icon surface, and a mask in MSB format. + * If 'mask' is NULL, the entire icon surface will be used as the icon. + */ +extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); + +/** + * This function iconifies the window, and returns 1 if it succeeded. + * If the function succeeds, it generates an SDL_APPACTIVE loss event. + * This function is a noop and returns 0 in non-windowed environments. + */ +extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); + +/** + * Toggle fullscreen mode without changing the contents of the screen. + * If the display surface does not require locking before accessing + * the pixel information, then the memory pointers will not change. + * + * If this function was able to toggle fullscreen mode (change from + * running in a window to fullscreen, or vice-versa), it will return 1. + * If it is not implemented, or fails, it returns 0. + * + * The next call to SDL_SetVideoMode() will set the mode fullscreen + * attribute based on the flags parameter - if SDL_FULLSCREEN is not + * set, then the display will be windowed by default where supported. + * + * This is currently only implemented in the X11 video driver. + */ +extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface *surface); + +typedef enum { + SDL_GRAB_QUERY = -1, + SDL_GRAB_OFF = 0, + SDL_GRAB_ON = 1, + SDL_GRAB_FULLSCREEN /**< Used internally */ +} SDL_GrabMode; +/** + * This function allows you to set and query the input grab state of + * the application. It returns the new input grab state. + * + * Grabbing means that the mouse is confined to the application window, + * and nearly all keyboard input is passed directly to the application, + * and not interpreted by a window manager, if any. + */ +extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); + +/*@}*/ + +/** @internal Not in public API at the moment - do not use! */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/begin_code.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/begin_code.h new file mode 100644 index 00000000..2208a88b --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-gnu/SDL/begin_code.h @@ -0,0 +1,191 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file begin_code.h + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/** + * @file begin_code.h + * This shouldn't be nested -- included it around code only. + */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +/** + * @def DECLSPEC + * Some compilers use a special export keyword + */ +#ifndef DECLSPEC +# if defined(__BEOS__) || defined(__HAIKU__) +# if defined(__GNUC__) +# define DECLSPEC +# else +# define DECLSPEC __declspec(export) +# endif +# elif defined(__WIN32__) +# ifdef __BORLANDC__ +# ifdef BUILD_SDL +# define DECLSPEC +# else +# define DECLSPEC __declspec(dllimport) +# endif +# else +# define DECLSPEC __declspec(dllexport) +# endif +# elif defined(__OS2__) +# ifdef __WATCOMC__ +# ifdef BUILD_SDL +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# elif defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX = 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# else +# define DECLSPEC +# endif +# endif +#endif + +/** + * @def SDLCALL + * By default SDL uses the C calling convention + */ +#ifndef SDLCALL +# if defined(__WIN32__) && !defined(__GNUC__) +# define SDLCALL __cdecl +# elif defined(__OS2__) +# if defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX freq' should be the desired audio frequency in samples-per-second. + * - 'desired->format' should be the desired audio format. + * - 'desired->samples' is the desired size of the audio buffer, in samples. + * This number should be a power of two, and may be adjusted by the audio + * driver to a value more suitable for the hardware. Good values seem to + * range between 512 and 8096 inclusive, depending on the application and + * CPU speed. Smaller values yield faster response time, but can lead + * to underflow if the application is doing heavy processing and cannot + * fill the audio buffer in time. A stereo sample consists of both right + * and left channels in LR ordering. + * Note that the number of samples is directly related to time by the + * following formula: ms = (samples*1000)/freq + * - 'desired->size' is the size in bytes of the audio buffer, and is + * calculated by SDL_OpenAudio(). + * - 'desired->silence' is the value used to set the buffer to silence, + * and is calculated by SDL_OpenAudio(). + * - 'desired->callback' should be set to a function that will be called + * when the audio device is ready for more data. It is passed a pointer + * to the audio buffer, and the length in bytes of the audio buffer. + * This function usually runs in a separate thread, and so you should + * protect data structures that it accesses by calling SDL_LockAudio() + * and SDL_UnlockAudio() in your code. + * - 'desired->userdata' is passed as the first parameter to your callback + * function. + * + * @note The calculated values in this structure are calculated by SDL_OpenAudio() + * + */ +typedef struct SDL_AudioSpec { + int freq; /**< DSP frequency -- samples per second */ + Uint16 format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in samples (power of 2) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + /** + * This function is called when the audio device needs more data. + * + * @param[out] stream A pointer to the audio data buffer + * @param[in] len The length of the audio buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + */ + void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); + void *userdata; +} SDL_AudioSpec; + +/** + * @name Audio format flags + * defaults to LSB byte order + */ +/*@{*/ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB + +/** + * @name Native audio byte ordering + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#endif +/*@}*/ + +/*@}*/ + + +/** A structure to hold a set of audio conversion filters and buffers */ +typedef struct SDL_AudioCVT { + int needed; /**< Set to 1 if conversion possible */ + Uint16 src_format; /**< Source audio format */ + Uint16 dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + void (SDLCALL *filters[10])(struct SDL_AudioCVT *cvt, Uint16 format); + int filter_index; /**< Current audio conversion function */ +} SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * @name Audio Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the audio driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * current audio driver, and returns a pointer to it if the audio driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); + +/** + * This function opens the audio device with the desired parameters, and + * returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio + * data passed to the callback function will be guaranteed to be in the + * requested format, and will be automatically converted to the hardware + * audio format if necessary. This function returns -1 if it failed + * to open the audio device, or couldn't set up the audio thread. + * + * The audio device starts out playing silence when it's opened, and should + * be enabled for playing by calling SDL_PauseAudio(0) when you are ready + * for your audio callback function to be called. Since the audio driver + * may modify the requested size of the audio buffer, you should allocate + * any local mixing buffers after you open the audio device. + * + * @sa SDL_AudioSpec + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); + +typedef enum { + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_audiostatus; + +/** Get the current audio state */ +extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); + +/** + * This function pauses and unpauses the audio callback processing. + * It should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); + +/** + * This function loads a WAVE from the data source, automatically freeing + * that source if 'freesrc' is non-zero. For example, to load a WAVE file, + * you could do: + * @code SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); @endcode + * + * If this function succeeds, it returns the given SDL_AudioSpec, + * filled with the audio data format of the wave data, and sets + * 'audio_buf' to a malloc()'d buffer containing the audio data, + * and sets 'audio_len' to the length of that audio buffer, in bytes. + * You need to free the audio buffer with SDL_FreeWAV() when you are + * done with it. + * + * This function returns NULL and sets the SDL error message if the + * wave file cannot be opened, uses an unknown data format, or is + * corrupt. Currently raw and MS-ADPCM WAVE files are supported. + */ +extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); + +/** Compatibility convenience function -- loads a WAV from a file */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * This function frees data previously allocated with SDL_LoadWAV_RW() + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 *audio_buf); + +/** + * This function takes a source format and rate and a destination format + * and rate, and initializes the 'cvt' structure with information needed + * by SDL_ConvertAudio() to convert a buffer of audio data from one format + * to the other. + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, + Uint16 src_format, Uint8 src_channels, int src_rate, + Uint16 dst_format, Uint8 dst_channels, int dst_rate); + +/** + * Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), + * created an audio buffer cvt->buf, and filled it with cvt->len bytes of + * audio data in the source format, this function will convert it in-place + * to the desired format. + * The data conversion may expand the size of the audio data, so the buffer + * cvt->buf should be allocated after the cvt structure is initialized by + * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt); + + +#define SDL_MIX_MAXVOLUME 128 +/** + * This takes two audio buffers of the playing audio format and mixes + * them, performing addition, volume adjustment, and overflow clipping. + * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume. Note this does not change hardware volume. + * This is provided for convenience -- you can mix your own audio data. + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume); + +/** + * @name Audio Locks + * The lock manipulated by these functions protects the callback function. + * During a LockAudio/UnlockAudio pair, you can be guaranteed that the + * callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); +/*@}*/ + +/** + * This function shuts down audio processing and closes the audio device. + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_audio_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_byteorder.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_byteorder.h new file mode 100644 index 00000000..47332c3d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_byteorder.h @@ -0,0 +1,29 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_byteorder.h + * @deprecated Use SDL_endian.h instead + */ + +/* DEPRECATED */ +#include "SDL_endian.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cdrom.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cdrom.h new file mode 100644 index 00000000..febb19dc --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cdrom.h @@ -0,0 +1,202 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cdrom.h + * This is the CD-audio control API for Simple DirectMedia Layer + */ + +#ifndef _SDL_cdrom_h +#define _SDL_cdrom_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file SDL_cdrom.h + * In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_CDROM flag. This causes SDL to scan the system + * for CD-ROM drives, and load appropriate drivers. + */ + +/** The maximum number of CD-ROM tracks on a disk */ +#define SDL_MAX_TRACKS 99 + +/** @name Track Types + * The types of CD-ROM track possible + */ +/*@{*/ +#define SDL_AUDIO_TRACK 0x00 +#define SDL_DATA_TRACK 0x04 +/*@}*/ + +/** The possible states which a CD-ROM drive can be in. */ +typedef enum { + CD_TRAYEMPTY, + CD_STOPPED, + CD_PLAYING, + CD_PAUSED, + CD_ERROR = -1 +} CDstatus; + +/** Given a status, returns true if there's a disk in the drive */ +#define CD_INDRIVE(status) ((int)(status) > 0) + +typedef struct SDL_CDtrack { + Uint8 id; /**< Track number */ + Uint8 type; /**< Data or audio track */ + Uint16 unused; + Uint32 length; /**< Length, in frames, of this track */ + Uint32 offset; /**< Offset, in frames, from start of disk */ +} SDL_CDtrack; + +/** This structure is only current as of the last call to SDL_CDStatus() */ +typedef struct SDL_CD { + int id; /**< Private drive identifier */ + CDstatus status; /**< Current drive status */ + + /** The rest of this structure is only valid if there's a CD in drive */ + /*@{*/ + int numtracks; /**< Number of tracks on disk */ + int cur_track; /**< Current track position */ + int cur_frame; /**< Current frame offset within current track */ + SDL_CDtrack track[SDL_MAX_TRACKS+1]; + /*@}*/ +} SDL_CD; + +/** @name Frames / MSF Conversion Functions + * Conversion functions from frames to Minute/Second/Frames and vice versa + */ +/*@{*/ +#define CD_FPS 75 +#define FRAMES_TO_MSF(f, M,S,F) { \ + int value = f; \ + *(F) = value%CD_FPS; \ + value /= CD_FPS; \ + *(S) = value%60; \ + value /= 60; \ + *(M) = value; \ +} +#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) +/*@}*/ + +/* CD-audio API functions: */ + +/** + * Returns the number of CD-ROM drives on the system, or -1 if + * SDL_Init() has not been called with the SDL_INIT_CDROM flag. + */ +extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); + +/** + * Returns a human-readable, system-dependent identifier for the CD-ROM. + * Example: + * - "/dev/cdrom" + * - "E:" + * - "/dev/disk/ide/1/master" + */ +extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); + +/** + * Opens a CD-ROM drive for access. It returns a drive handle on success, + * or NULL if the drive was invalid or busy. This newly opened CD-ROM + * becomes the default CD used when other CD functions are passed a NULL + * CD-ROM handle. + * Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. + */ +extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); + +/** + * This function returns the current status of the given drive. + * If the drive has a CD in it, the table of contents of the CD and current + * play position of the CD will be stored in the SDL_CD structure. + */ +extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); + +/** + * Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' + * tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play + * until the end of the CD. This function will skip data tracks. + * This function should only be called after calling SDL_CDStatus() to + * get track information about the CD. + * For example: + * @code + * // Play entire CD: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); + * // Play last track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { + * SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); + * } + * // Play first and second track and 10 seconds of third track: + * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) + * SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); + * @endcode + * + * @return This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, + int start_track, int start_frame, int ntracks, int nframes); + +/** + * Play the given CD starting at 'start' frame for 'length' frames. + * @return It returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); + +/** Pause play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); + +/** Resume play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); + +/** Stop play + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); + +/** Eject CD-ROM + * @return returns 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); + +/** Closes the handle for the CD-ROM drive */ +extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config.h new file mode 100644 index 00000000..09ba38a7 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config.h @@ -0,0 +1,45 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_h +#define _SDL_config_h + +#include "SDL_platform.h" + +/* Add any platform that doesn't build using the configure system */ +#if defined(__DREAMCAST__) +#include "SDL_config_dreamcast.h" +#elif defined(__MACOS__) +#include "SDL_config_macos.h" +#elif defined(__MACOSX__) +#include "SDL_config_macosx.h" +#elif defined(__SYMBIAN32__) +#include "SDL_config_symbian.h" /* must be before win32! */ +#elif defined(__WIN32__) +#include "SDL_config_win32.h" +#elif defined(__OS2__) +#include "SDL_config_os2.h" +#else +#include "SDL_config_minimal.h" +#endif /* platform config */ + +#endif /* _SDL_config_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_dreamcast.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_dreamcast.h new file mode 100644 index 00000000..fb03098e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_dreamcast.h @@ -0,0 +1,106 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_dreamcast_h +#define _SDL_config_dreamcast_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +typedef unsigned long uintptr_t; +#define SDL_HAS_64BIT_TYPE 1 + +/* Useful headers */ +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRDUP 1 +#define HAVE_INDEX 1 +#define HAVE_RINDEX 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRICMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_DC 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#define SDL_CDROM_DC 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DC 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_DUMMY 1 + +/* Enable various threading systems */ +#define SDL_THREAD_DC 1 + +/* Enable various timer systems */ +#define SDL_TIMER_DC 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DC 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#endif /* _SDL_config_dreamcast_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macos.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macos.h new file mode 100644 index 00000000..4fe1715a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macos.h @@ -0,0 +1,112 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_macos_h +#define _SDL_config_macos_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#include + +typedef SInt8 int8_t; +typedef UInt8 uint8_t; +typedef SInt16 int16_t; +typedef UInt16 uint16_t; +typedef SInt32 int32_t; +typedef UInt32 uint32_t; +typedef SInt64 int64_t; +typedef UInt64 uint64_t; +typedef unsigned long uintptr_t; + +#define SDL_HAS_64BIT_TYPE 1 + +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_SSCANF 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_SNDMGR 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#if TARGET_API_MAC_CARBON +#define SDL_CDROM_DUMMY 1 +#else +#define SDL_CDROM_MACOS 1 +#endif + +/* Enable various input drivers */ +#if TARGET_API_MAC_CARBON +#define SDL_JOYSTICK_DUMMY 1 +#else +#define SDL_JOYSTICK_MACOS 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_MACOS 1 + +/* Enable various threading systems */ +#define SDL_THREADS_DISABLED 1 + +/* Enable various timer systems */ +#define SDL_TIMER_MACOS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_DRAWSPROCKET 1 +#define SDL_VIDEO_DRIVER_TOOLBOX 1 + +/* Enable OpenGL support */ +#define SDL_VIDEO_OPENGL 1 + +#endif /* _SDL_config_macos_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macosx.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macosx.h new file mode 100644 index 00000000..84be6177 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_macosx.h @@ -0,0 +1,150 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_macosx_h +#define _SDL_config_macosx_h + +#include "SDL_platform.h" + +/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ +#include + +/* This is a set of defines to configure the SDL features */ + +#define SDL_HAS_64BIT_TYPE 1 + +/* Useful headers */ +/* If we specified an SDK or have a post-PowerPC chip, then alloca.h exists. */ +#if ( (MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (!defined(__POWERPC__)) ) +#define HAVE_ALLOCA_H 1 +#endif +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_COREAUDIO 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#define SDL_CDROM_MACOSX 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_IOKIT 1 + +/* Enable various shared object loading systems */ +#ifdef __ppc__ +/* For Mac OS X 10.2 compatibility */ +#define SDL_LOADSO_DLCOMPAT 1 +#else +#define SDL_LOADSO_DLOPEN 1 +#endif + +/* Enable various threading systems */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 + +/* Enable various timer systems */ +#define SDL_TIMER_UNIX 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#if ((defined TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON)) +#define SDL_VIDEO_DRIVER_TOOLBOX 1 +#else +#define SDL_VIDEO_DRIVER_QUARTZ 1 +#endif +#define SDL_VIDEO_DRIVER_DGA 1 +#define SDL_VIDEO_DRIVER_X11 1 +#define SDL_VIDEO_DRIVER_X11_DGAMOUSE 1 +#define SDL_VIDEO_DRIVER_X11_DYNAMIC "/usr/X11R6/lib/libX11.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "/usr/X11R6/lib/libXext.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "/usr/X11R6/lib/libXrandr.2.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER "/usr/X11R6/lib/libXrender.1.dylib" +#define SDL_VIDEO_DRIVER_X11_VIDMODE 1 +#define SDL_VIDEO_DRIVER_X11_XINERAMA 1 +#define SDL_VIDEO_DRIVER_X11_XME 1 +#define SDL_VIDEO_DRIVER_X11_XRANDR 1 +#define SDL_VIDEO_DRIVER_X11_XV 1 + +/* Enable OpenGL support */ +#define SDL_VIDEO_OPENGL 1 +#define SDL_VIDEO_OPENGL_GLX 1 + +/* Disable screensaver */ +#define SDL_VIDEO_DISABLE_SCREENSAVER 1 + +/* Enable assembly routines */ +#define SDL_ASSEMBLY_ROUTINES 1 +#ifdef __ppc__ +#define SDL_ALTIVEC_BLITTERS 1 +#endif + +#endif /* _SDL_config_macosx_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_minimal.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_minimal.h new file mode 100644 index 00000000..d10db7c6 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_minimal.h @@ -0,0 +1,62 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_minimal_h +#define _SDL_config_minimal_h + +#include "SDL_platform.h" + +/* This is the minimal configuration that can be used to build SDL */ + +#include + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef unsigned int size_t; +typedef unsigned long uintptr_t; + +/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ +#define SDL_CDROM_DISABLED 1 + +/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ +#define SDL_JOYSTICK_DISABLED 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +/* Enable the stub thread support (src/thread/generic/\*.c) */ +#define SDL_THREADS_DISABLED 1 + +/* Enable the stub timer support (src/timer/dummy/\*.c) */ +#define SDL_TIMERS_DISABLED 1 + +/* Enable the dummy video driver (src/video/dummy/\*.c) */ +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#endif /* _SDL_config_minimal_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_nds.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_nds.h new file mode 100644 index 00000000..cb4d61f6 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_nds.h @@ -0,0 +1,115 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_nds_h +#define _SDL_config_nds_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* C datatypes */ +#define SDL_HAS_64BIT_TYPE 1 + +/* Endianness */ +#define SDL_BYTEORDER 1234 + +/* Useful headers */ +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_SETJMP 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_NDS 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ +#define SDL_CDROM_DISABLED 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_NDS 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +/* Enable the stub thread support (src/thread/generic/\*.c) */ +#define SDL_THREADS_DISABLED 1 + +/* Enable various timer systems */ +#define SDL_TIMER_NDS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_NDS 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#endif /* _SDL_config_nds_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_os2.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_os2.h new file mode 100644 index 00000000..42edd20e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_os2.h @@ -0,0 +1,141 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_os2_h +#define _SDL_config_os2_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef unsigned int size_t; +typedef unsigned long uintptr_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +#define SDL_HAS_64BIT_TYPE 1 + +/* Use Watcom's LIBC */ +#define HAVE_LIBC 1 + +/* Useful headers */ +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_INDEX 1 +#define HAVE_RINDEX 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE__LTOA 1 +#define HAVE__UITOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE__I64TOA 1 +#define HAVE__UI64TOA 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRICMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_SSCANF 1 +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_SETJMP 1 +#define HAVE_CLOCK_GETTIME 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_DART 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#define SDL_CDROM_OS2 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_OS2 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_OS2 1 + +/* Enable various threading systems */ +#define SDL_THREAD_OS2 1 + +/* Enable various timer systems */ +#define SDL_TIMER_OS2 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_OS2FS 1 + +/* Enable OpenGL support */ +/* Nothing here yet for OS/2... :( */ + +/* Enable assembly routines where available */ +#define SDL_ASSEMBLY_ROUTINES 1 + +#endif /* _SDL_config_os2_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_symbian.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_symbian.h new file mode 100644 index 00000000..e917ac6e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_symbian.h @@ -0,0 +1,146 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* + +Symbian version Markus Mertama + +*/ + + +#ifndef _SDL_CONFIG_SYMBIAN_H +#define _SDL_CONFIG_SYMBIAN_H + +#include "SDL_platform.h" + +/* This is the minimal configuration that can be used to build SDL */ + + +#include +#include + + +#ifdef __GCCE__ +#define SYMBIAN32_GCCE +#endif + +#ifndef _SIZE_T_DEFINED +typedef unsigned int size_t; +#endif + +#ifndef _INTPTR_T_DECLARED +typedef unsigned int uintptr_t; +#endif + +#ifndef _INT8_T_DECLARED +typedef signed char int8_t; +#endif + +#ifndef _UINT8_T_DECLARED +typedef unsigned char uint8_t; +#endif + +#ifndef _INT16_T_DECLARED +typedef signed short int16_t; +#endif + +#ifndef _UINT16_T_DECLARED +typedef unsigned short uint16_t; +#endif + +#ifndef _INT32_T_DECLARED +typedef signed int int32_t; +#endif + +#ifndef _UINT32_T_DECLARED +typedef unsigned int uint32_t; +#endif + +#ifndef _INT64_T_DECLARED +typedef signed long long int64_t; +#endif + +#ifndef _UINT64_T_DECLARED +typedef unsigned long long uint64_t; +#endif + +#define SDL_AUDIO_DRIVER_EPOCAUDIO 1 + + +/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ +#define SDL_CDROM_DISABLED 1 + +/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ +#define SDL_JOYSTICK_DISABLED 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +#define SDL_THREAD_SYMBIAN 1 + +#define SDL_VIDEO_DRIVER_EPOC 1 + +#define SDL_VIDEO_OPENGL 0 + +#define SDL_HAS_64BIT_TYPE 1 + +#define HAVE_LIBC 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 + +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +/*#define HAVE_ALLOCA 1*/ +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRUPR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +/*#define HAVE__STRICMP 1*/ +#define HAVE__STRNICMP 1 +#define HAVE_SSCANF 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 + + + +#endif /* _SDL_CONFIG_SYMBIAN_H */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_win32.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_win32.h new file mode 100644 index 00000000..da2c15dd --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_config_win32.h @@ -0,0 +1,183 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_config_win32_h +#define _SDL_config_win32_h + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#if defined(__GNUC__) || defined(__DMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#define SDL_HAS_64BIT_TYPE 1 + +/* Enabled for SDL 1.2 (binary compatibility) */ +#define HAVE_LIBC 1 +#ifdef HAVE_LIBC +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#ifndef _WIN32_WCE +#define HAVE_SIGNAL_H 1 +#endif + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_ITOA 1 +#define HAVE__LTOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_SSCANF 1 +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#ifndef _WIN32_WCE +#define SDL_AUDIO_DRIVER_DSOUND 1 +#endif +#define SDL_AUDIO_DRIVER_WAVEOUT 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various cdrom drivers */ +#ifdef _WIN32_WCE +#define SDL_CDROM_DISABLED 1 +#else +#define SDL_CDROM_WIN32 1 +#endif + +/* Enable various input drivers */ +#ifdef _WIN32_WCE +#define SDL_JOYSTICK_DISABLED 1 +#else +#define SDL_JOYSTICK_WINMM 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WIN32 1 + +/* Enable various threading systems */ +#define SDL_THREAD_WIN32 1 + +/* Enable various timer systems */ +#ifdef _WIN32_WCE +#define SDL_TIMER_WINCE 1 +#else +#define SDL_TIMER_WIN32 1 +#endif + +/* Enable various video drivers */ +#ifdef _WIN32_WCE +#define SDL_VIDEO_DRIVER_GAPI 1 +#endif +#ifndef _WIN32_WCE +#define SDL_VIDEO_DRIVER_DDRAW 1 +#endif +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDIB 1 + +/* Enable OpenGL support */ +#ifndef _WIN32_WCE +#define SDL_VIDEO_OPENGL 1 +#define SDL_VIDEO_OPENGL_WGL 1 +#endif + +/* Disable screensaver */ +#define SDL_VIDEO_DISABLE_SCREENSAVER 1 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* _SDL_config_win32_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_copying.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_copying.h new file mode 100644 index 00000000..b5b64f29 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_copying.h @@ -0,0 +1,22 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cpuinfo.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cpuinfo.h new file mode 100644 index 00000000..4200d6d1 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_cpuinfo.h @@ -0,0 +1,69 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_cpuinfo.h + * CPU feature detection for SDL + */ + +#ifndef _SDL_cpuinfo_h +#define _SDL_cpuinfo_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This function returns true if the CPU has the RDTSC instruction */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** This function returns true if the CPU has MMX features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** This function returns true if the CPU has MMX Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); + +/** This function returns true if the CPU has 3DNow features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** This function returns true if the CPU has 3DNow! Ext. features */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); + +/** This function returns true if the CPU has SSE features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** This function returns true if the CPU has SSE2 features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** This function returns true if the CPU has AltiVec features */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_cpuinfo_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_endian.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_endian.h new file mode 100644 index 00000000..fd9fc867 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_endian.h @@ -0,0 +1,214 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_endian.h + * Functions for reading and writing endian-specific values + */ + +#ifndef _SDL_endian_h +#define _SDL_endian_h + +#include "SDL_stdinc.h" + +/** @name SDL_ENDIANs + * The two types of endianness + */ +/*@{*/ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/*@}*/ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#else /* __linux __ */ +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux __ */ +#endif /* !SDL_BYTEORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name SDL_Swap Functions + * Use inline functions for compilers that support them, and static + * functions for those that do not. Because these functions become + * static for compilers that do not support inline functions, this + * header should only be included in files that actually use them. + */ +/*@{*/ +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + Uint16 result; + + __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint16 SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint16 SDL_Swap16(Uint16 x) { + return SDL_static_cast(Uint16, ((x<<8)|(x>>8))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0" : "=r" (x) : "0" (x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); + __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); + __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); + return result; +} +#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) +static __inline__ Uint32 SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); + return x; +} +#else +static __inline__ Uint32 SDL_Swap32(Uint32 x) { + return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24))); +} +#endif + +#ifdef SDL_HAS_64BIT_TYPE +#if defined(__GNUC__) && defined(__i386__) && \ + !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + union { + struct { Uint32 a,b; } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" + : "=r" (v.s.a), "=r" (v.s.b) + : "0" (v.s.a), "1" (v.s.b)); + return v.u; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0" : "=r" (x) : "0" (x)); + return x; +} +#else +static __inline__ Uint64 SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif +#else +/* This is mainly to keep compilers from complaining in SDL code. + * If there is no real 64-bit datatype, then compilers will complain about + * the fake 64-bit datatype that SDL provides when it compiles user code. + */ +#define SDL_Swap64(X) (X) +#endif /* SDL_HAS_64BIT_TYPE */ +/*@}*/ + +/** + * @name SDL_SwapLE and SDL_SwapBE Functions + * Byteswap item from the specified endianness to the native endianness + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#endif +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_endian_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_error.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_error.h new file mode 100644 index 00000000..4e1cce3b --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_error.h @@ -0,0 +1,72 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_error.h + * Simple error message routines for SDL + */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name Public functions + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC char * SDLCALL SDL_GetError(void); +extern DECLSPEC void SDLCALL SDL_ClearError(void); +/*@}*/ + +/** + * @name Private functions + * @internal Private error message function - used internally + */ +/*@{*/ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +typedef enum { + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_events.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_events.h new file mode 100644 index 00000000..94b42025 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_events.h @@ -0,0 +1,356 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file SDL_events.h + * Include file for SDL event handling + */ + +#ifndef _SDL_events_h +#define _SDL_events_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_active.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_quit.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name General keyboard/mouse state definitions */ +/*@{*/ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 +/*@}*/ + +/** Event enumerations */ +typedef enum { + SDL_NOEVENT = 0, /**< Unused (do not remove) */ + SDL_ACTIVEEVENT, /**< Application loses/gains visibility */ + SDL_KEYDOWN, /**< Keys pressed */ + SDL_KEYUP, /**< Keys released */ + SDL_MOUSEMOTION, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_JOYAXISMOTION, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_QUIT, /**< User-requested quit */ + SDL_SYSWMEVENT, /**< System specific event */ + SDL_EVENT_RESERVEDA, /**< Reserved for future use.. */ + SDL_EVENT_RESERVEDB, /**< Reserved for future use.. */ + SDL_VIDEORESIZE, /**< User resized video mode */ + SDL_VIDEOEXPOSE, /**< Screen needs to be redrawn */ + SDL_EVENT_RESERVED2, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED3, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED4, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED5, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED6, /**< Reserved for future use.. */ + SDL_EVENT_RESERVED7, /**< Reserved for future use.. */ + /** Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ + SDL_USEREVENT = 24, + /** This last event is only for bounding internal arrays + * It is the number of bits in the event mask datatype -- Uint32 + */ + SDL_NUMEVENTS = 32 +} SDL_EventType; + +/** @name Predefined event masks */ +/*@{*/ +#define SDL_EVENTMASK(X) (1<<(X)) +typedef enum { + SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), + SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), + SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), + SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| + SDL_EVENTMASK(SDL_KEYUP), + SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), + SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), + SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| + SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| + SDL_EVENTMASK(SDL_MOUSEBUTTONUP), + SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), + SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), + SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), + SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), + SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| + SDL_EVENTMASK(SDL_JOYBALLMOTION)| + SDL_EVENTMASK(SDL_JOYHATMOTION)| + SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| + SDL_EVENTMASK(SDL_JOYBUTTONUP), + SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), + SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), + SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), + SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) +} SDL_EventMask ; +#define SDL_ALLEVENTS 0xFFFFFFFF +/*@}*/ + +/** Application visibility event structure */ +typedef struct SDL_ActiveEvent { + Uint8 type; /**< SDL_ACTIVEEVENT */ + Uint8 gain; /**< Whether given states were gained or lost (1/0) */ + Uint8 state; /**< A mask of the focus states */ +} SDL_ActiveEvent; + +/** Keyboard event structure */ +typedef struct SDL_KeyboardEvent { + Uint8 type; /**< SDL_KEYDOWN or SDL_KEYUP */ + Uint8 which; /**< The keyboard device index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + SDL_keysym keysym; +} SDL_KeyboardEvent; + +/** Mouse motion event structure */ +typedef struct SDL_MouseMotionEvent { + Uint8 type; /**< SDL_MOUSEMOTION */ + Uint8 which; /**< The mouse device index */ + Uint8 state; /**< The current button state */ + Uint16 x, y; /**< The X/Y coordinates of the mouse */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** Mouse button event structure */ +typedef struct SDL_MouseButtonEvent { + Uint8 type; /**< SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ + Uint8 which; /**< The mouse device index */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ + Uint16 x, y; /**< The X/Y coordinates of the mouse at press time */ +} SDL_MouseButtonEvent; + +/** Joystick axis motion event structure */ +typedef struct SDL_JoyAxisEvent { + Uint8 type; /**< SDL_JOYAXISMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 axis; /**< The joystick axis index */ + Sint16 value; /**< The axis value (range: -32768 to 32767) */ +} SDL_JoyAxisEvent; + +/** Joystick trackball motion event structure */ +typedef struct SDL_JoyBallEvent { + Uint8 type; /**< SDL_JOYBALLMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 ball; /**< The joystick trackball index */ + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** Joystick hat position change event structure */ +typedef struct SDL_JoyHatEvent { + Uint8 type; /**< SDL_JOYHATMOTION */ + Uint8 which; /**< The joystick device index */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value: + * SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP + * SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT + * SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN + * Note that zero means the POV is centered. + */ +} SDL_JoyHatEvent; + +/** Joystick button event structure */ +typedef struct SDL_JoyButtonEvent { + Uint8 type; /**< SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ + Uint8 which; /**< The joystick device index */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ +} SDL_JoyButtonEvent; + +/** The "window resized" event + * When you get this event, you are responsible for setting a new video + * mode with the new width and height. + */ +typedef struct SDL_ResizeEvent { + Uint8 type; /**< SDL_VIDEORESIZE */ + int w; /**< New width */ + int h; /**< New height */ +} SDL_ResizeEvent; + +/** The "screen redraw" event */ +typedef struct SDL_ExposeEvent { + Uint8 type; /**< SDL_VIDEOEXPOSE */ +} SDL_ExposeEvent; + +/** The "quit requested" event */ +typedef struct SDL_QuitEvent { + Uint8 type; /**< SDL_QUIT */ +} SDL_QuitEvent; + +/** A user-defined event type */ +typedef struct SDL_UserEvent { + Uint8 type; /**< SDL_USEREVENT through SDL_NUMEVENTS-1 */ + int code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + +/** If you want to use this event, you should include SDL_syswm.h */ +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; +typedef struct SDL_SysWMEvent { + Uint8 type; + SDL_SysWMmsg *msg; +} SDL_SysWMEvent; + +/** General event structure */ +typedef union SDL_Event { + Uint8 type; + SDL_ActiveEvent active; + SDL_KeyboardEvent key; + SDL_MouseMotionEvent motion; + SDL_MouseButtonEvent button; + SDL_JoyAxisEvent jaxis; + SDL_JoyBallEvent jball; + SDL_JoyHatEvent jhat; + SDL_JoyButtonEvent jbutton; + SDL_ResizeEvent resize; + SDL_ExposeEvent expose; + SDL_QuitEvent quit; + SDL_UserEvent user; + SDL_SysWMEvent syswm; +} SDL_Event; + + +/* Function prototypes */ + +/** Pumps the event loop, gathering events from the input devices. + * This function updates the event queue and internal input device state. + * This should only be run in the thread that sets the video mode. + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +typedef enum { + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Checks the event queue for messages and optionally returns them. + * + * If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to + * the back of the event queue. + * If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will not + * be removed from the queue. + * If 'action' is SDL_GETEVENT, up to 'numevents' events at the front + * of the event queue, matching 'mask', will be returned and will be + * removed from the queue. + * + * @return + * This function returns the number of events actually stored, or -1 + * if there was an error. + * + * This function is thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, + SDL_eventaction action, Uint32 mask); + +/** Polls for currently pending events, and returns 1 if there are any pending + * events, or 0 if there are none available. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); + +/** Waits indefinitely for the next available event, returning 1, or 0 if there + * was an error while waiting for events. If 'event' is not NULL, the next + * event is removed from the queue and stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); + +/** Add an event to the event queue. + * This function returns 0 on success, or -1 if the event queue was full + * or there was some other error. + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); + +/** @name Event Filtering */ +/*@{*/ +typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); +/** + * This function sets up a filter to process all events before they + * change internal state and are posted to the internal event queue. + * + * The filter is protypted as: + * @code typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); @endcode + * + * If the filter returns 1, then the event will be added to the internal queue. + * If it returns 0, then the event will be dropped from the queue, but the + * internal state will still be updated. This allows selective filtering of + * dynamically arriving events. + * + * @warning Be very careful of what you do in the event filter function, as + * it may run in a different thread! + * + * There is one caveat when dealing with the SDL_QUITEVENT event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will + * be closed, otherwise the window will remain open if possible. + * If the quit event is generated by an interrupt signal, it will bypass the + * internal queue and be delivered to the application at the next event poll. + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); + +/** + * Return the current event filter - can be used to "chain" filters. + * If there is no event filter set, this function returns NULL. + */ +extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); +/*@}*/ + +/** @name Event State */ +/*@{*/ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 +/*@}*/ + +/** +* This function allows you to set the state of processing certain events. +* If 'state' is set to SDL_IGNORE, that event will be automatically dropped +* from the event queue and will not event be filtered. +* If 'state' is set to SDL_ENABLE, that event will be processed normally. +* If 'state' is set to SDL_QUERY, SDL_EventState() will return the +* current processing state of the specified event. +*/ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_events_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_getenv.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_getenv.h new file mode 100644 index 00000000..bea63007 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_getenv.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_getenv.h + * @deprecated Use SDL_stdinc.h instead + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_joystick.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_joystick.h new file mode 100644 index 00000000..708d1a9f --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_joystick.h @@ -0,0 +1,187 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_joystick.h + * Include file for SDL joystick event handling + */ + +#ifndef _SDL_joystick_h +#define _SDL_joystick_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_joystick.h + * @note In order to use these functions, SDL_Init() must have been called + * with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + */ + +/** The joystick structure used to identify an SDL joystick */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* Function prototypes */ +/** + * Count the number of joysticks attached to the system + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char * SDLCALL SDL_JoystickName(int device_index); + +/** + * Open a joystick for use. + * + * @param[in] device_index + * The index passed as an argument refers to + * the N'th joystick on the system. This index is the value which will + * identify this joystick in future joystick events. + * + * @return This function returns a joystick identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_Joystick * SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Returns 1 if the joystick has been opened, or 0 if it has not. + */ +extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); + +/** + * Get the device index of an opened joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick *joystick); + +/** + * Get the number of general axis controls on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); + +/** + * Get the number of trackballs on a joystick + * + * Joystick trackballs have only relative motion events associated + * with them and their state cannot be polled. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); + +/** + * Get the number of POV hats on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); + +/** + * Get the number of buttons on a joystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and check the state of the joystick when you want joystick + * information. + * + * @param[in] state The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +/** + * Get the current state of an axis control on a joystick + * + * @param[in] axis The axis indices start at index 0. + * + * @return The state is a value ranging from -32768 to 32767. + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); + +/** + * @name Hat Positions + * The return value of SDL_JoystickGetHat() is one of the following positions: + */ +/*@{*/ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/*@}*/ + +/** + * Get the current state of a POV hat on a joystick + * + * @param[in] hat The hat indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); + +/** + * Get the ball axis change since the last poll + * + * @param[in] ball The ball indices start at index 0. + * + * @return This returns 0, or -1 if you passed it invalid parameters. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick + * + * @param[in] button The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, int button); + +/** + * Close a joystick previously opened with SDL_JoystickOpen() + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_joystick_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keyboard.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keyboard.h new file mode 100644 index 00000000..9d7129c5 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keyboard.h @@ -0,0 +1,135 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_keyboard.h + * Include file for SDL keyboard event handling + */ + +#ifndef _SDL_keyboard_h +#define _SDL_keyboard_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keysym.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Keysym structure + * + * - The scancode is hardware dependent, and should not be used by general + * applications. If no hardware scancode is available, it will be 0. + * + * - The 'unicode' translated character is only available when character + * translation is enabled by the SDL_EnableUNICODE() API. If non-zero, + * this is a UNICODE character corresponding to the keypress. If the + * high 9 bits of the character are 0, then this maps to the equivalent + * ASCII character: + * @code + * char ch; + * if ( (keysym.unicode & 0xFF80) == 0 ) { + * ch = keysym.unicode & 0x7F; + * } else { + * An international character.. + * } + * @endcode + */ +typedef struct SDL_keysym { + Uint8 scancode; /**< hardware specific scancode */ + SDLKey sym; /**< SDL virtual keysym */ + SDLMod mod; /**< current key modifiers */ + Uint16 unicode; /**< translated character */ +} SDL_keysym; + +/** This is the mask which refers to all hotkey bindings */ +#define SDL_ALL_HOTKEYS 0xFFFFFFFF + +/* Function prototypes */ +/** + * Enable/Disable UNICODE translation of keyboard input. + * + * This translation has some overhead, so translation defaults off. + * + * @param[in] enable + * If 'enable' is 1, translation is enabled. + * If 'enable' is 0, translation is disabled. + * If 'enable' is -1, the translation state is not changed. + * + * @return It returns the previous state of keyboard translation. + */ +extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); + +#define SDL_DEFAULT_REPEAT_DELAY 500 +#define SDL_DEFAULT_REPEAT_INTERVAL 30 +/** + * Enable/Disable keyboard repeat. Keyboard repeat defaults to off. + * + * @param[in] delay + * 'delay' is the initial delay in ms between the time when a key is + * pressed, and keyboard repeat begins. + * + * @param[in] interval + * 'interval' is the time in ms between keyboard repeat events. + * + * If 'delay' is set to 0, keyboard repeat is disabled. + */ +extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); +extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); + +/** + * Get a snapshot of the current state of the keyboard. + * Returns an array of keystates, indexed by the SDLK_* syms. + * Usage: + * @code + * Uint8 *keystate = SDL_GetKeyState(NULL); + * if ( keystate[SDLK_RETURN] ) //... \ is pressed. + * @endcode + */ +extern DECLSPEC Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); + +/** + * Get the current key modifier state + */ +extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); + +/** + * Set the current key modifier state. + * This does not change the keyboard state, only the key modifier flags. + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); + +/** + * Get the name of an SDL virtual keysym + */ +extern DECLSPEC char * SDLCALL SDL_GetKeyName(SDLKey key); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_keyboard_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keysym.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keysym.h new file mode 100644 index 00000000..f2ad12b8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_keysym.h @@ -0,0 +1,326 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_keysym_h +#define _SDL_keysym_h + +/** What we really want is a mapping of every raw key on the keyboard. + * To support international keyboards, we use the range 0xA1 - 0xFF + * as international virtual keycodes. We'll follow in the footsteps of X11... + * @brief The names of the keys + */ +typedef enum { + /** @name ASCII mapped keysyms + * The keyboard syms have been cleverly chosen to map to ASCII + */ + /*@{*/ + SDLK_UNKNOWN = 0, + SDLK_FIRST = 0, + SDLK_BACKSPACE = 8, + SDLK_TAB = 9, + SDLK_CLEAR = 12, + SDLK_RETURN = 13, + SDLK_PAUSE = 19, + SDLK_ESCAPE = 27, + SDLK_SPACE = 32, + SDLK_EXCLAIM = 33, + SDLK_QUOTEDBL = 34, + SDLK_HASH = 35, + SDLK_DOLLAR = 36, + SDLK_AMPERSAND = 38, + SDLK_QUOTE = 39, + SDLK_LEFTPAREN = 40, + SDLK_RIGHTPAREN = 41, + SDLK_ASTERISK = 42, + SDLK_PLUS = 43, + SDLK_COMMA = 44, + SDLK_MINUS = 45, + SDLK_PERIOD = 46, + SDLK_SLASH = 47, + SDLK_0 = 48, + SDLK_1 = 49, + SDLK_2 = 50, + SDLK_3 = 51, + SDLK_4 = 52, + SDLK_5 = 53, + SDLK_6 = 54, + SDLK_7 = 55, + SDLK_8 = 56, + SDLK_9 = 57, + SDLK_COLON = 58, + SDLK_SEMICOLON = 59, + SDLK_LESS = 60, + SDLK_EQUALS = 61, + SDLK_GREATER = 62, + SDLK_QUESTION = 63, + SDLK_AT = 64, + /* + Skip uppercase letters + */ + SDLK_LEFTBRACKET = 91, + SDLK_BACKSLASH = 92, + SDLK_RIGHTBRACKET = 93, + SDLK_CARET = 94, + SDLK_UNDERSCORE = 95, + SDLK_BACKQUOTE = 96, + SDLK_a = 97, + SDLK_b = 98, + SDLK_c = 99, + SDLK_d = 100, + SDLK_e = 101, + SDLK_f = 102, + SDLK_g = 103, + SDLK_h = 104, + SDLK_i = 105, + SDLK_j = 106, + SDLK_k = 107, + SDLK_l = 108, + SDLK_m = 109, + SDLK_n = 110, + SDLK_o = 111, + SDLK_p = 112, + SDLK_q = 113, + SDLK_r = 114, + SDLK_s = 115, + SDLK_t = 116, + SDLK_u = 117, + SDLK_v = 118, + SDLK_w = 119, + SDLK_x = 120, + SDLK_y = 121, + SDLK_z = 122, + SDLK_DELETE = 127, + /* End of ASCII mapped keysyms */ + /*@}*/ + + /** @name International keyboard syms */ + /*@{*/ + SDLK_WORLD_0 = 160, /* 0xA0 */ + SDLK_WORLD_1 = 161, + SDLK_WORLD_2 = 162, + SDLK_WORLD_3 = 163, + SDLK_WORLD_4 = 164, + SDLK_WORLD_5 = 165, + SDLK_WORLD_6 = 166, + SDLK_WORLD_7 = 167, + SDLK_WORLD_8 = 168, + SDLK_WORLD_9 = 169, + SDLK_WORLD_10 = 170, + SDLK_WORLD_11 = 171, + SDLK_WORLD_12 = 172, + SDLK_WORLD_13 = 173, + SDLK_WORLD_14 = 174, + SDLK_WORLD_15 = 175, + SDLK_WORLD_16 = 176, + SDLK_WORLD_17 = 177, + SDLK_WORLD_18 = 178, + SDLK_WORLD_19 = 179, + SDLK_WORLD_20 = 180, + SDLK_WORLD_21 = 181, + SDLK_WORLD_22 = 182, + SDLK_WORLD_23 = 183, + SDLK_WORLD_24 = 184, + SDLK_WORLD_25 = 185, + SDLK_WORLD_26 = 186, + SDLK_WORLD_27 = 187, + SDLK_WORLD_28 = 188, + SDLK_WORLD_29 = 189, + SDLK_WORLD_30 = 190, + SDLK_WORLD_31 = 191, + SDLK_WORLD_32 = 192, + SDLK_WORLD_33 = 193, + SDLK_WORLD_34 = 194, + SDLK_WORLD_35 = 195, + SDLK_WORLD_36 = 196, + SDLK_WORLD_37 = 197, + SDLK_WORLD_38 = 198, + SDLK_WORLD_39 = 199, + SDLK_WORLD_40 = 200, + SDLK_WORLD_41 = 201, + SDLK_WORLD_42 = 202, + SDLK_WORLD_43 = 203, + SDLK_WORLD_44 = 204, + SDLK_WORLD_45 = 205, + SDLK_WORLD_46 = 206, + SDLK_WORLD_47 = 207, + SDLK_WORLD_48 = 208, + SDLK_WORLD_49 = 209, + SDLK_WORLD_50 = 210, + SDLK_WORLD_51 = 211, + SDLK_WORLD_52 = 212, + SDLK_WORLD_53 = 213, + SDLK_WORLD_54 = 214, + SDLK_WORLD_55 = 215, + SDLK_WORLD_56 = 216, + SDLK_WORLD_57 = 217, + SDLK_WORLD_58 = 218, + SDLK_WORLD_59 = 219, + SDLK_WORLD_60 = 220, + SDLK_WORLD_61 = 221, + SDLK_WORLD_62 = 222, + SDLK_WORLD_63 = 223, + SDLK_WORLD_64 = 224, + SDLK_WORLD_65 = 225, + SDLK_WORLD_66 = 226, + SDLK_WORLD_67 = 227, + SDLK_WORLD_68 = 228, + SDLK_WORLD_69 = 229, + SDLK_WORLD_70 = 230, + SDLK_WORLD_71 = 231, + SDLK_WORLD_72 = 232, + SDLK_WORLD_73 = 233, + SDLK_WORLD_74 = 234, + SDLK_WORLD_75 = 235, + SDLK_WORLD_76 = 236, + SDLK_WORLD_77 = 237, + SDLK_WORLD_78 = 238, + SDLK_WORLD_79 = 239, + SDLK_WORLD_80 = 240, + SDLK_WORLD_81 = 241, + SDLK_WORLD_82 = 242, + SDLK_WORLD_83 = 243, + SDLK_WORLD_84 = 244, + SDLK_WORLD_85 = 245, + SDLK_WORLD_86 = 246, + SDLK_WORLD_87 = 247, + SDLK_WORLD_88 = 248, + SDLK_WORLD_89 = 249, + SDLK_WORLD_90 = 250, + SDLK_WORLD_91 = 251, + SDLK_WORLD_92 = 252, + SDLK_WORLD_93 = 253, + SDLK_WORLD_94 = 254, + SDLK_WORLD_95 = 255, /* 0xFF */ + /*@}*/ + + /** @name Numeric keypad */ + /*@{*/ + SDLK_KP0 = 256, + SDLK_KP1 = 257, + SDLK_KP2 = 258, + SDLK_KP3 = 259, + SDLK_KP4 = 260, + SDLK_KP5 = 261, + SDLK_KP6 = 262, + SDLK_KP7 = 263, + SDLK_KP8 = 264, + SDLK_KP9 = 265, + SDLK_KP_PERIOD = 266, + SDLK_KP_DIVIDE = 267, + SDLK_KP_MULTIPLY = 268, + SDLK_KP_MINUS = 269, + SDLK_KP_PLUS = 270, + SDLK_KP_ENTER = 271, + SDLK_KP_EQUALS = 272, + /*@}*/ + + /** @name Arrows + Home/End pad */ + /*@{*/ + SDLK_UP = 273, + SDLK_DOWN = 274, + SDLK_RIGHT = 275, + SDLK_LEFT = 276, + SDLK_INSERT = 277, + SDLK_HOME = 278, + SDLK_END = 279, + SDLK_PAGEUP = 280, + SDLK_PAGEDOWN = 281, + /*@}*/ + + /** @name Function keys */ + /*@{*/ + SDLK_F1 = 282, + SDLK_F2 = 283, + SDLK_F3 = 284, + SDLK_F4 = 285, + SDLK_F5 = 286, + SDLK_F6 = 287, + SDLK_F7 = 288, + SDLK_F8 = 289, + SDLK_F9 = 290, + SDLK_F10 = 291, + SDLK_F11 = 292, + SDLK_F12 = 293, + SDLK_F13 = 294, + SDLK_F14 = 295, + SDLK_F15 = 296, + /*@}*/ + + /** @name Key state modifier keys */ + /*@{*/ + SDLK_NUMLOCK = 300, + SDLK_CAPSLOCK = 301, + SDLK_SCROLLOCK = 302, + SDLK_RSHIFT = 303, + SDLK_LSHIFT = 304, + SDLK_RCTRL = 305, + SDLK_LCTRL = 306, + SDLK_RALT = 307, + SDLK_LALT = 308, + SDLK_RMETA = 309, + SDLK_LMETA = 310, + SDLK_LSUPER = 311, /**< Left "Windows" key */ + SDLK_RSUPER = 312, /**< Right "Windows" key */ + SDLK_MODE = 313, /**< "Alt Gr" key */ + SDLK_COMPOSE = 314, /**< Multi-key compose key */ + /*@}*/ + + /** @name Miscellaneous function keys */ + /*@{*/ + SDLK_HELP = 315, + SDLK_PRINT = 316, + SDLK_SYSREQ = 317, + SDLK_BREAK = 318, + SDLK_MENU = 319, + SDLK_POWER = 320, /**< Power Macintosh power key */ + SDLK_EURO = 321, /**< Some european keyboards */ + SDLK_UNDO = 322, /**< Atari keyboard has Undo */ + /*@}*/ + + /* Add any other keys here */ + + SDLK_LAST +} SDLKey; + +/** Enumeration of valid key mods (possibly OR'd together) */ +typedef enum { + KMOD_NONE = 0x0000, + KMOD_LSHIFT= 0x0001, + KMOD_RSHIFT= 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LMETA = 0x0400, + KMOD_RMETA = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDLMod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_META (KMOD_LMETA|KMOD_RMETA) + +#endif /* _SDL_keysym_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_loadso.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_loadso.h new file mode 100644 index 00000000..0c5e5362 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_loadso.h @@ -0,0 +1,78 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_loadso.h + * System dependent library loading routines + */ + +/** @file SDL_loadso.h + * Some things to keep in mind: + * - These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * - Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * - Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + + +#ifndef _SDL_loadso_h +#define _SDL_loadso_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This function dynamically loads a shared object and returns a pointer + * to the object handle (or NULL if there was an error). + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Given an object handle, this function looks up the address of the + * named function in the shared object and returns it. This address + * is no longer valid after calling SDL_UnloadObject(). + */ +extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); + +/** Unload a shared object from memory */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_loadso_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_main.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_main.h new file mode 100644 index 00000000..ab50ef1e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_main.h @@ -0,0 +1,106 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_main_h +#define _SDL_main_h + +#include "SDL_stdinc.h" + +/** @file SDL_main.h + * Redefine main() on Win32 and MacOS so that it is called by winmain.c + */ + +#if defined(__WIN32__) || \ + (defined(__MWERKS__) && !defined(__BEOS__)) || \ + defined(__MACOS__) || defined(__MACOSX__) || \ + defined(__SYMBIAN32__) || defined(QWS) + +#ifdef __cplusplus +#define C_LINKAGE "C" +#else +#define C_LINKAGE +#endif /* __cplusplus */ + +/** The application's main() function must be called with C linkage, + * and should be declared like this: + * @code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * @endcode + */ +#define main SDL_main + +/** The prototype for the application's main() function */ +extern C_LINKAGE int SDL_main(int argc, char *argv[]); + + +/** @name From the SDL library code -- needed for registering the app on Win32 */ +/*@{*/ +#ifdef __WIN32__ + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** This should be called from your WinMain() function, if any */ +extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); +/** This can also be called, but is no longer necessary */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); +/** This can also be called, but is no longer necessary (SDL_Quit calls it) */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +/** @name From the SDL library code -- needed for registering QuickDraw on MacOS */ +/*@{*/ +#if defined(__MACOS__) + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** Forward declaration so we don't need to include QuickDraw.h */ +struct QDGlobals; + +/** This should be called from your main() function, if any */ +extern DECLSPEC void SDLCALL SDL_InitQuickDraw(struct QDGlobals *the_qd); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" +#endif +/*@}*/ + +#endif /* Need to redefine main()? */ + +#endif /* _SDL_main_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mouse.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mouse.h new file mode 100644 index 00000000..7c563b94 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mouse.h @@ -0,0 +1,143 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_mouse.h + * Include file for SDL mouse event handling + */ + +#ifndef _SDL_mouse_h +#define _SDL_mouse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct WMcursor WMcursor; /**< Implementation dependent */ +typedef struct SDL_Cursor { + SDL_Rect area; /**< The area of the mouse cursor */ + Sint16 hot_x, hot_y; /**< The "tip" of the cursor */ + Uint8 *data; /**< B/W cursor data */ + Uint8 *mask; /**< B/W cursor mask */ + Uint8 *save[2]; /**< Place to save cursor area */ + WMcursor *wm_cursor; /**< Window-manager cursor */ +} SDL_Cursor; + +/* Function prototypes */ +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * current mouse cursor position. You can pass NULL for either x or y. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * Retrieve the current state of the mouse. + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState(). + */ +extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * Set the position of the mouse cursor (generates a mouse motion event) + */ +extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); + +/** + * Create a cursor using the specified data and mask (in MSB format). + * The cursor width must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * data mask resulting pixel on screen + * 0 1 White + * 1 1 Black + * 0 0 Transparent + * 1 0 Inverted color if possible, black if not. + * + * Cursors created with this function must be freed with SDL_FreeCursor(). + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor + (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); + +/** + * Set the currently active cursor to the specified one. + * If the cursor is currently visible, the change will be immediately + * represented on the display. + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor *cursor); + +/** + * Returns the currently active cursor. + */ +extern DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); + +/** + * Deallocates a cursor created with SDL_CreateCursor(). + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor *cursor); + +/** + * Toggle whether or not the cursor is shown on the screen. + * The cursor start off displayed, but can be turned off. + * SDL_ShowCursor() returns 1 if the cursor was being displayed + * before the call, or 0 if it was not. You can query the current + * state by passing a 'toggle' value of -1. + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/*@{*/ +/** Used as a mask when testing buttons in buttonstate + * Button 1: Left mouse button + * Button 2: Middle mouse button + * Button 3: Right mouse button + * Button 4: Mouse wheel up (may also be a real button) + * Button 5: Mouse wheel down (may also be a real button) + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_WHEELUP 4 +#define SDL_BUTTON_WHEELDOWN 5 +#define SDL_BUTTON_X1 6 +#define SDL_BUTTON_X2 7 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mouse_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mutex.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mutex.h new file mode 100644 index 00000000..c8da9b1a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_mutex.h @@ -0,0 +1,177 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_mutex_h +#define _SDL_mutex_h + +/** @file SDL_mutex.h + * Functions to provide thread synchronization primitives + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** This is the timeout value which corresponds to never time out */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Mutex functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL mutex structure, defined in SDL_mutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** Create a mutex, initialized unlocked */ +extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void); + +#define SDL_LockMutex(m) SDL_mutexP(m) +/** Lock the mutex + * @return 0, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex); + +#define SDL_UnlockMutex(m) SDL_mutexV(m) +/** Unlock the mutex + * @return 0, or -1 on error + * + * It is an error to unlock a mutex that has not been locked by + * the current thread, and doing so results in undefined behavior. + */ +extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex); + +/** Destroy a mutex */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Semaphore functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** The SDL semaphore structure, defined in SDL_sem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** Create a semaphore, initialized with value, returns NULL on failure. */ +extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** Destroy a semaphore */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem); + +/** + * This function suspends the calling thread until the semaphore pointed + * to by sem has a positive count. It then atomically decreases the semaphore + * count. + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem); + +/** Non-blocking variant of SDL_SemWait(). + * @return 0 if the wait succeeds, + * SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem); + +/** Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if + * the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in + * the allotted time, and -1 on error. + * + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms); + +/** Atomically increases the semaphore's count (not blocking). + * @return 0, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem); + +/** Returns the current count of the semaphore */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Condition_variable_functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*@{*/ +/** The SDL condition variable structure, defined in SDL_cond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; +/*@}*/ + +/** Create a condition variable */ +extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void); + +/** Destroy a condition variable */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond); + +/** Restart one of the threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond); + +/** Restart all threads that are waiting on the condition variable, + * @return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond); + +/** Wait on the condition variable, unlocking the provided mutex. + * The mutex must be locked before entering this function! + * The mutex is re-locked once the condition variable is signaled. + * @return 0 when it is signaled, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); + +/** Waits for at most 'ms' milliseconds, and returns 0 if the condition + * variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not + * signaled in the allotted time, and -1 on error. + * On some platforms this function is implemented by looping with a delay + * of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mutex_h */ + diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_name.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_name.h new file mode 100644 index 00000000..511619af --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_name.h @@ -0,0 +1,11 @@ + +#ifndef _SDLname_h_ +#define _SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* _SDLname_h_ */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_opengl.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_opengl.h new file mode 100644 index 00000000..3d791d69 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_opengl.h @@ -0,0 +1,6570 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_opengl.h + * This is a simple file to encapsulate the OpenGL API headers + */ + +#include "SDL_config.h" + +#ifdef __WIN32__ +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +#define NOMINMAX /* Don't defined min() and max() */ +#endif +#include +#endif +#ifndef NO_SDL_GLEXT +#define __glext_h_ /* Don't let gl.h include glext.h */ +#endif +#if defined(__MACOSX__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#elif defined(__MACOS__) +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#else +#include /* Header File For The OpenGL Library */ +#include /* Header File For The GLU Library */ +#endif +#ifndef NO_SDL_GLEXT +#undef __glext_h_ +#endif + +/** @name GLext.h + * This file taken from "GLext.h" from the Jeff Molofee OpenGL tutorials. + * It is included here because glext.h is not available on some systems. + * If you don't want this version included, simply define "NO_SDL_GLEXT" + */ +/*@{*/ +#ifndef NO_SDL_GLEXT +#if !defined(__glext_h_) && !defined(GL_GLEXT_LEGACY) +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2005/06/20 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 29 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; /* native character */ +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptr; +typedef long GLsizeiptr; +#else +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +#ifdef __APPLE__ +typedef long GLintptrARB; +typedef long GLsizeiptrARB; +#else +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and program/shader text */ +typedef char GLcharARB; /* native character */ +#if defined(__APPLE__) +typedef void *GLhandleARB; /* shader object handle */ +#else +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif +#endif + +/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendEquation (GLenum); +GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogram (GLenum); +GLAPI void APIENTRY glResetMinmax (GLenum); +GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum); +GLAPI void APIENTRY glClientActiveTexture (GLenum); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glFogCoordf (GLfloat); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *); +GLAPI void APIENTRY glFogCoordd (GLdouble); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameteri (GLenum, GLint); +GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos2i (GLint, GLint); +GLAPI void APIENTRY glWindowPos2iv (const GLint *); +GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *); +GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3iv (const GLint *); +GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQuery (GLuint); +GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void APIENTRY glEndQuery (GLenum); +GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint); +GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); +GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); +GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); +GLAPI void APIENTRY glAttachShader (GLuint, GLuint); +GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); +GLAPI void APIENTRY glCompileShader (GLuint); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum); +GLAPI void APIENTRY glDeleteProgram (GLuint); +GLAPI void APIENTRY glDeleteShader (GLuint); +GLAPI void APIENTRY glDetachShader (GLuint, GLuint); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); +GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgram (GLuint); +GLAPI GLboolean APIENTRY glIsShader (GLuint); +GLAPI void APIENTRY glLinkProgram (GLuint); +GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); +GLAPI void APIENTRY glUseProgram (GLuint); +GLAPI void APIENTRY glUniform1f (GLint, GLfloat); +GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1i (GLint, GLint); +GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glValidateProgram (GLuint); +GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); +GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); +GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void APIENTRY glEndQueryARB (GLenum); +GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1iARB (GLint, GLint); +GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogramEXT (GLenum); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint); +GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void APIENTRY glDeformSGIX (GLbitfield); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum); +GLAPI void APIENTRY glTextureLightEXT (GLenum); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *); +GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); +GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFinishFenceNV (GLuint); +GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); +GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif +#endif /* NO_SDL_GLEXT */ +/*@}*/ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_platform.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_platform.h new file mode 100644 index 00000000..48540a85 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_platform.h @@ -0,0 +1,110 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_platform.h + * Try to get a standard set of platform defines + */ + +#ifndef _SDL_platform_h +#define _SDL_platform_h + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__BEOS__) +#undef __BEOS__ +#define __BEOS__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(__APPLE__) +#undef __MACOSX__ +#define __MACOSX__ 1 +#elif defined(macintosh) +#undef __MACOS__ +#define __MACOS__ 1 +#endif +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif +#if defined(WIN32) || defined(_WIN32) +#undef __WIN32__ +#define __WIN32__ 1 +#endif + +#endif /* _SDL_platform_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_quit.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_quit.h new file mode 100644 index 00000000..abd2ec6c --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_quit.h @@ -0,0 +1,55 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_quit.h + * Include file for SDL quit event handling + */ + +#ifndef _SDL_quit_h +#define _SDL_quit_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** @file SDL_quit.h + * An SDL_QUITEVENT is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate SDL_QUITEVENT events as well. There is no way + * to determine the cause of an SDL_QUITEVENT, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + */ + +/** @file SDL_quit.h + * There are no functions directly affecting the quit event + */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) + +#endif /* _SDL_quit_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_rwops.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_rwops.h new file mode 100644 index 00000000..98361d7e --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_rwops.h @@ -0,0 +1,155 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_rwops.h + * This file provides a general interface for SDL to read and write + * data sources. It can easily be extended to files, memory, etc. + */ + +#ifndef _SDL_rwops_h +#define _SDL_rwops_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the read/write operation structure -- very basic */ + +typedef struct SDL_RWops { + /** Seek to 'offset' relative to whence, one of stdio's whence values: + * SEEK_SET, SEEK_CUR, SEEK_END + * Returns the final offset in the data source. + */ + int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence); + + /** Read up to 'maxnum' objects each of size 'size' from the data + * source to the area pointed at by 'ptr'. + * Returns the number of objects read, or -1 if the read failed. + */ + int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); + + /** Write exactly 'num' objects each of size 'objsize' from the area + * pointed at by 'ptr' to data source. + * Returns 'num', or -1 if the write failed. + */ + int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num); + + /** Close and free an allocated SDL_FSops structure */ + int (SDLCALL *close)(struct SDL_RWops *context); + + Uint32 type; + union { +#if defined(__WIN32__) && !defined(__SYMBIAN32__) + struct { + int append; + void *h; + struct { + void *data; + int size; + int left; + } buffer; + } win32io; +#endif +#ifdef HAVE_STDIO_H + struct { + int autoclose; + FILE *fp; + } stdio; +#endif + struct { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct { + void *data1; + } unknown; + } hidden; + +} SDL_RWops; + + +/** @name Functions to create SDL_RWops structures from various data sources */ +/*@{*/ + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); + +#ifdef HAVE_STDIO_H +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); +#endif + +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); + +extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); + +/*@}*/ + +/** @name Seek Reference Points */ +/*@{*/ +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ +/*@}*/ + +/** @name Macros to easily read and write from an SDL_RWops structure */ +/*@{*/ +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) +/*@}*/ + +/** @name Read an item of the specified endianness and return in native format */ +/*@{*/ +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); +/*@}*/ + +/** @name Write an item of native format to the specified endianness */ +/*@{*/ +extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); +extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); +extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); +extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rwops_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_stdinc.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_stdinc.h new file mode 100644 index 00000000..35a4fdde --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_stdinc.h @@ -0,0 +1,620 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_stdinc.h + * This is a general header that includes C language support + */ + +#ifndef _SDL_stdinc_h +#define _SDL_stdinc_h + +#include "SDL_config.h" + + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +# include +#endif + +/** The number of elements in an array */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/* Use proper C++ casts when compiled as C++ to be compatible with the option + -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above. */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#endif + +/** @name Basic data types */ +/*@{*/ +typedef enum { + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; + +typedef int8_t Sint8; +typedef uint8_t Uint8; +typedef int16_t Sint16; +typedef uint16_t Uint16; +typedef int32_t Sint32; +typedef uint32_t Uint32; + +#ifdef SDL_HAS_64BIT_TYPE +typedef int64_t Sint64; +#ifndef SYMBIAN32_GCCE +typedef uint64_t Uint64; +#endif +#else +/* This is really just a hack to prevent the compiler from complaining */ +typedef struct { + Uint32 hi; + Uint32 lo; +} Uint64, Sint64; +#endif + +/*@}*/ + +/** @name Make sure the types really have the right sizes */ +/*@{*/ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] + +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +/*@}*/ + +/** @name Enum Size Check + * Check to make sure enums are the size of ints, for structure packing. + * For both Watcom C/C++ and Borland C/C++ the compiler option that makes + * enums having the size of an int must be enabled. + * This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). + */ +/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ +#ifdef __MWERKS__ +#pragma enumsalwaysint on +#endif + +typedef enum { + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +#ifndef __NDS__ +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +/*@}*/ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_MALLOC +#define SDL_malloc malloc +#else +extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); +#endif + +#ifdef HAVE_CALLOC +#define SDL_calloc calloc +#else +extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); +#endif + +#ifdef HAVE_REALLOC +#define SDL_realloc realloc +#else +extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); +#endif + +#ifdef HAVE_FREE +#define SDL_free free +#else +extern DECLSPEC void SDLCALL SDL_free(void *mem); +#endif + +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) + #pragma alloca +# elif defined(__MRC__) + void *alloca (unsigned); +# else + char *alloca (); +# endif +#endif +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +#ifdef HAVE_GETENV +#define SDL_getenv getenv +#else +extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); +#endif + +#ifdef HAVE_PUTENV +#define SDL_putenv putenv +#else +extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); +#endif + +#ifdef HAVE_QSORT +#define SDL_qsort qsort +#else +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, + int (*compare)(const void *, const void *)); +#endif + +#ifdef HAVE_ABS +#define SDL_abs abs +#else +#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) +#endif + +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +#ifdef HAVE_CTYPE_H +#define SDL_isdigit(X) isdigit(X) +#define SDL_isspace(X) isspace(X) +#define SDL_toupper(X) toupper(X) +#define SDL_tolower(X) tolower(X) +#else +#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) +#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) +#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) +#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) +#endif + +#ifdef HAVE_MEMSET +#define SDL_memset memset +#else +extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_memset4(dst, val, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; stosl\n\t" \ + : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memset4 +#define SDL_memset4(dst, val, len) \ +do { \ + unsigned _count = (len); \ + unsigned _n = (_count + 3) / 4; \ + Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ + Uint32 _val = (val); \ + if (len == 0) break; \ + switch (_count % 4) { \ + case 0: do { *_p++ = _val; \ + case 3: *_p++ = _val; \ + case 2: *_p++ = _val; \ + case 1: *_p++ = _val; \ + } while ( --_n ); \ + } \ +} while(0) +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl\n\t" \ + "testb $2,%b4\n\t" \ + "je 1f\n\t" \ + "movsw\n" \ + "1:\ttestb $1,%b4\n\t" \ + "je 2f\n\t" \ + "movsb\n" \ + "2:" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy +#ifdef HAVE_MEMCPY +#define SDL_memcpy memcpy +#elif defined(HAVE_BCOPY) +#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) +#else +extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); +#endif +#endif + +/* We can count on memcpy existing on Mac OS X and being well-tuned. */ +#if defined(__MACH__) && defined(__APPLE__) +#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) +#elif defined(__GNUC__) && defined(i386) +#define SDL_memcpy4(dst, src, len) \ +do { \ + int ecx, edi, esi; \ + __asm__ __volatile__ ( \ + "cld\n\t" \ + "rep ; movsl" \ + : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ + : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ + : "memory" ); \ +} while(0) +#endif +#ifndef SDL_memcpy4 +#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) +#endif + +#if defined(__GNUC__) && defined(i386) +#define SDL_revcpy(dst, src, len) \ +do { \ + int u0, u1, u2; \ + char *dstp = SDL_static_cast(char *, dst); \ + char *srcp = SDL_static_cast(char *, src); \ + int n = (len); \ + if ( n >= 4 ) { \ + __asm__ __volatile__ ( \ + "std\n\t" \ + "rep ; movsl\n\t" \ + "cld\n\t" \ + : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ + : "0" (n >> 2), \ + "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ + : "memory" ); \ + } \ + switch (n & 3) { \ + case 3: dstp[2] = srcp[2]; \ + case 2: dstp[1] = srcp[1]; \ + case 1: dstp[0] = srcp[0]; \ + break; \ + default: \ + break; \ + } \ +} while(0) +#endif +#ifndef SDL_revcpy +extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); +#endif + +#ifdef HAVE_MEMMOVE +#define SDL_memmove memmove +#elif defined(HAVE_BCOPY) +#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) +#else +#define SDL_memmove(dst, src, len) \ +do { \ + if ( dst < src ) { \ + SDL_memcpy(dst, src, len); \ + } else { \ + SDL_revcpy(dst, src, len); \ + } \ +} while(0) +#endif + +#ifdef HAVE_MEMCMP +#define SDL_memcmp memcmp +#else +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); +#endif + +#ifdef HAVE_STRLEN +#define SDL_strlen strlen +#else +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); +#endif + +#ifdef HAVE_STRLCPY +#define SDL_strlcpy strlcpy +#else +extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRLCAT +#define SDL_strlcat strlcat +#else +extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +#endif + +#ifdef HAVE_STRDUP +#define SDL_strdup strdup +#else +extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); +#endif + +#ifdef HAVE__STRREV +#define SDL_strrev _strrev +#else +extern DECLSPEC char * SDLCALL SDL_strrev(char *string); +#endif + +#ifdef HAVE__STRUPR +#define SDL_strupr _strupr +#else +extern DECLSPEC char * SDLCALL SDL_strupr(char *string); +#endif + +#ifdef HAVE__STRLWR +#define SDL_strlwr _strlwr +#else +extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); +#endif + +#ifdef HAVE_STRCHR +#define SDL_strchr strchr +#elif defined(HAVE_INDEX) +#define SDL_strchr index +#else +extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); +#endif + +#ifdef HAVE_STRRCHR +#define SDL_strrchr strrchr +#elif defined(HAVE_RINDEX) +#define SDL_strrchr rindex +#else +extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); +#endif + +#ifdef HAVE_STRSTR +#define SDL_strstr strstr +#else +extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); +#endif + +#ifdef HAVE_ITOA +#define SDL_itoa itoa +#else +#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) +#endif + +#ifdef HAVE__LTOA +#define SDL_ltoa _ltoa +#else +extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); +#endif + +#ifdef HAVE__UITOA +#define SDL_uitoa _uitoa +#else +#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) +#endif + +#ifdef HAVE__ULTOA +#define SDL_ultoa _ultoa +#else +extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOL +#define SDL_strtol strtol +#else +extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOUL +#define SDL_strtoul strtoul +#else +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); +#endif + +#ifdef SDL_HAS_64BIT_TYPE + +#ifdef HAVE__I64TOA +#define SDL_lltoa _i64toa +#else +extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); +#endif + +#ifdef HAVE__UI64TOA +#define SDL_ulltoa _ui64toa +#else +extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); +#endif + +#ifdef HAVE_STRTOLL +#define SDL_strtoll strtoll +#else +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); +#endif + +#ifdef HAVE_STRTOULL +#define SDL_strtoull strtoull +#else +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); +#endif + +#endif /* SDL_HAS_64BIT_TYPE */ + +#ifdef HAVE_STRTOD +#define SDL_strtod strtod +#else +extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); +#endif + +#ifdef HAVE_ATOI +#define SDL_atoi atoi +#else +#define SDL_atoi(X) SDL_strtol(X, NULL, 0) +#endif + +#ifdef HAVE_ATOF +#define SDL_atof atof +#else +#define SDL_atof(X) SDL_strtod(X, NULL) +#endif + +#ifdef HAVE_STRCMP +#define SDL_strcmp strcmp +#else +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCMP +#define SDL_strncmp strncmp +#else +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_STRCASECMP +#define SDL_strcasecmp strcasecmp +#elif defined(HAVE__STRICMP) +#define SDL_strcasecmp _stricmp +#else +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +#endif + +#ifdef HAVE_STRNCASECMP +#define SDL_strncasecmp strncasecmp +#elif defined(HAVE__STRNICMP) +#define SDL_strncasecmp _strnicmp +#else +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); +#endif + +#ifdef HAVE_SSCANF +#define SDL_sscanf sscanf +#else +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +#endif + +#ifdef HAVE_SNPRINTF +#define SDL_snprintf snprintf +#else +extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); +#endif + +#ifdef HAVE_VSNPRINTF +#define SDL_vsnprintf vsnprintf +#else +extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); +#endif + +/** @name SDL_ICONV Error Codes + * The SDL implementation of iconv() returns these error codes + */ +/*@{*/ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 +/*@}*/ + +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +#define SDL_iconv_t iconv_t +#define SDL_iconv_open iconv_open +#define SDL_iconv_close iconv_close +#else +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +#endif +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +/** This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + */ +extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_stdinc_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_syswm.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_syswm.h new file mode 100644 index 00000000..78433c6a --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_syswm.h @@ -0,0 +1,226 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_syswm.h + * Include file for SDL custom system window manager hooks + */ + +#ifndef _SDL_syswm_h +#define _SDL_syswm_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @file SDL_syswm.h + * Your application has access to a special type of event 'SDL_SYSWMEVENT', + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState() + */ +#ifdef SDL_PROTOTYPES_ONLY +struct SDL_SysWMinfo; +typedef struct SDL_SysWMinfo SDL_SysWMinfo; +#else + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +/** These are the various supported subsystems under UNIX */ +typedef enum { + SDL_SYSWM_X11 +} SDL_SYSWM_TYPE; + +/** The UNIX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + XEvent xevent; + } event; +}; + +/** The UNIX custom window manager information structure. + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +typedef struct SDL_SysWMinfo { + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union { + struct { + Display *display; /**< The X11 display */ + Window window; /**< The X11 display window */ + /** These locking functions should be called around + * any X11 functions using the display variable, + * but not the gfxdisplay variable. + * They lock the event thread, so should not be + * called around event functions or from event filters. + */ + /*@{*/ + void (*lock_func)(void); + void (*unlock_func)(void); + /*@}*/ + + /** @name Introduced in SDL 1.0.2 */ + /*@{*/ + Window fswindow; /**< The X11 fullscreen window */ + Window wmwindow; /**< The X11 managed input window */ + /*@}*/ + + /** @name Introduced in SDL 1.2.12 */ + /*@{*/ + Display *gfxdisplay; /**< The X11 display to which rendering is done */ + /*@}*/ + } x11; + } info; +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_NANOX) +#include + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version ; + GR_WINDOW_ID window ; /* The display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || defined(SDL_VIDEO_DRIVER_GAPI) +#define WIN32_LEAN_AND_MEAN +#include + +/** The windows custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ +}; + +/** The windows custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + HWND window; /**< The Win32 display window */ + HGLRC hglrc; /**< The OpenGL context, if any */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_RISCOS) + +/** RISC OS custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int eventCode; /**< The window for the message */ + int pollBlock[64]; +}; + +/** The RISC OS custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int wimpVersion; /**< Wimp version running under */ + int taskHandle; /**< The RISC OS task handle */ + int window; /**< The RISC OS display window */ +} SDL_SysWMinfo; + +#elif defined(SDL_VIDEO_DRIVER_PHOTON) +#include +#include + +/** The QNX custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The QNX custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#else + +/** The generic custom event structure */ +struct SDL_SysWMmsg { + SDL_version version; + int data; +}; + +/** The generic custom window manager information structure */ +typedef struct SDL_SysWMinfo { + SDL_version version; + int data; +} SDL_SysWMinfo; + +#endif /* video driver type */ + +#endif /* SDL_PROTOTYPES_ONLY */ + +/* Function prototypes */ +/** + * This function gives you custom hooks into the window manager information. + * It fills the structure pointed to by 'info' with custom information and + * returns 0 if the function is not implemented, 1 if the function is + * implemented and no error occurred, and -1 if the version member of + * the 'info' structure is not filled in or not supported. + * + * You typically use this function like this: + * @code + * SDL_SysWMinfo info; + * SDL_VERSION(&info.version); + * if ( SDL_GetWMInfo(&info) ) { ... } + * @endcode + */ +extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_syswm_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_thread.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_thread.h new file mode 100644 index 00000000..9ebe00ed --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_thread.h @@ -0,0 +1,115 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_thread_h +#define _SDL_thread_h + +/** @file SDL_thread.h + * Header for the SDL thread management routines + * + * @note These are independent of the other SDL routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/** Create a thread */ +#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__) +/** + * We compile SDL into a DLL on OS/2. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL.DLL will + * be initialized for those threads, and not the RTL of the calling application! + * To solve this, we make a little hack here. + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL.DLL which uses this API, + * then the RTL of SDL.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD +#ifndef _WIN32_WCE +#include /* This has _beginthread() and _endthread() defined! */ +#endif + +#ifdef __OS2__ +typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); +typedef void (*pfnSDL_CurrentEndThread)(void); +#else +typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, + unsigned (__stdcall *func)(void *), void *arg, + unsigned, unsigned *threadID); +typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); +#endif + +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread); + +#ifdef __OS2__ +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) +#elif defined(_WIN32_WCE) +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) +#else +#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) +#endif +#else +extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data); +#endif + +/** Get the 32-bit thread identifier for the current thread */ +extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); + +/** Get the 32-bit thread identifier for the specified thread, + * equivalent to SDL_ThreadID() if the specified thread is NULL. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread); + +/** Wait for a thread to finish. + * The return code for the thread function is placed in the area + * pointed to by 'status', if 'status' is not NULL. + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); + +/** Forcefully kill a thread without worrying about its state */ +extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_thread_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_timer.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_timer.h new file mode 100644 index 00000000..d764d5f3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_timer.h @@ -0,0 +1,125 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +#ifndef _SDL_timer_h +#define _SDL_timer_h + +/** @file SDL_timer.h + * Header for the SDL time management routines + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the OS scheduler timeslice, in milliseconds */ +#define SDL_TIMESLICE 10 + +/** This is the maximum resolution of the SDL timer on all platforms */ +#define TIMER_RESOLUTION 10 /**< Experimentally determined */ + +/** + * Get the number of milliseconds since the SDL library initialization. + * Note that this value wraps if the program runs for more than ~49 days. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** Wait a specified number of milliseconds before returning */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** Function prototype for the timer callback function */ +typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval); + +/** + * Set a callback to run after the specified number of milliseconds has + * elapsed. The callback function is passed the current timer interval + * and returns the next timer interval. If the returned value is the + * same as the one passed in, the periodic alarm continues, otherwise a + * new alarm is scheduled. If the callback returns 0, the periodic alarm + * is cancelled. + * + * To cancel a currently running timer, call SDL_SetTimer(0, NULL); + * + * The timer callback function may run in a different thread than your + * main code, and so shouldn't call any functions from within itself. + * + * The maximum resolution of this timer is 10 ms, which means that if + * you request a 16 ms timer, your callback will run approximately 20 ms + * later on an unloaded system. If you wanted to set a flag signaling + * a frame update at 30 frames per second (every 33 ms), you might set a + * timer for 30 ms: + * @code SDL_SetTimer((33/10)*10, flag_update); @endcode + * + * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). + * + * Under UNIX, you should not use raise or use SIGALRM and this function + * in the same program, as it is implemented using setitimer(). You also + * should not use this function in multi-threaded applications as signals + * to multi-threaded apps have undefined behavior in some implementations. + * + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback); + +/** @name New timer API + * New timer API, supports multiple timers + * Written by Stephane Peter + */ +/*@{*/ + +/** + * Function prototype for the new timer callback function. + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param); + +/** Definition of the timer ID type */ +typedef struct _SDL_TimerID *SDL_TimerID; + +/** Add a new timer to the pool of timers already running. + * Returns a timer ID, or NULL when an error occurs. + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); + +/** + * Remove one of the multiple timers knowing its ID. + * Returns a boolean value indicating success. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); + +/*@}*/ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_timer_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_types.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_types.h new file mode 100644 index 00000000..79d8b28d --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_types.h @@ -0,0 +1,28 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_types.h + * @deprecated Use SDL_stdinc.h instead. + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_version.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_version.h new file mode 100644 index 00000000..fdc17c64 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_version.h @@ -0,0 +1,91 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_version.h + * This header defines the current SDL version + */ + +#ifndef _SDL_version_h +#define _SDL_version_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Version Number + * Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL + */ +/*@{*/ +#define SDL_MAJOR_VERSION 1 +#define SDL_MINOR_VERSION 2 +#define SDL_PATCHLEVEL 15 +/*@}*/ + +typedef struct SDL_version { + Uint8 major; + Uint8 minor; + Uint8 patch; +} SDL_version; + +/** + * This macro can be used to fill a version structure with the compile-time + * version of the SDL library. + */ +#define SDL_VERSION(X) \ +{ \ + (X)->major = SDL_MAJOR_VERSION; \ + (X)->minor = SDL_MINOR_VERSION; \ + (X)->patch = SDL_PATCHLEVEL; \ +} + +/** This macro turns the version numbers into a numeric value: + * (1,2,3) -> (1203) + * This assumes that there will never be more than 100 patchlevels + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** This is the version number macro for the current SDL version */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) + +/** This macro will evaluate to true if compiled with SDL at least X.Y.Z */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) + +/** This function gets the version of the dynamically linked SDL library. + * it should NOT be used to fill a version structure, instead you should + * use the SDL_Version() macro. + */ +extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_version_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_video.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_video.h new file mode 100644 index 00000000..f9c4e070 --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/SDL_video.h @@ -0,0 +1,951 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** @file SDL_video.h + * Header file for access to the SDL raw framebuffer window + */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @name Transparency definitions + * These define alpha as the opacity of a surface + */ +/*@{*/ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/*@}*/ + +/** @name Useful data types */ +/*@{*/ +typedef struct SDL_Rect { + Sint16 x, y; + Uint16 w, h; +} SDL_Rect; + +typedef struct SDL_Color { + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 unused; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette { + int ncolors; + SDL_Color *colors; +} SDL_Palette; +/*@}*/ + +/** Everything in the pixel format structure is read-only */ +typedef struct SDL_PixelFormat { + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + + /** RGB color key information */ + Uint32 colorkey; + /** Alpha value information (per-surface alpha) */ + Uint8 alpha; +} SDL_PixelFormat; + +/** This structure should be treated as read-only, except for 'pixels', + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface { + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + Uint16 pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + int offset; /**< Private */ + + /** Hardware-specific surface info */ + struct private_hwdata *hwdata; + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + Uint32 unused1; /**< for binary compatibility */ + + /** Allow recursive locks */ + Uint32 locked; /**< Private */ + + /** info for fast blit mapping to other surfaces */ + struct SDL_BlitMap *map; /**< Private */ + + /** format version, bumped at every change to invalidate blit maps */ + unsigned int format_version; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** @name SDL_Surface Flags + * These are the currently supported flags for the SDL_surface + */ +/*@{*/ + +/** Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ +/*@{*/ +#define SDL_SWSURFACE 0x00000000 /**< Surface is in system memory */ +#define SDL_HWSURFACE 0x00000001 /**< Surface is in video memory */ +#define SDL_ASYNCBLIT 0x00000004 /**< Use asynchronous blits if possible */ +/*@}*/ + +/** Available for SDL_SetVideoMode() */ +/*@{*/ +#define SDL_ANYFORMAT 0x10000000 /**< Allow any video depth/pixel-format */ +#define SDL_HWPALETTE 0x20000000 /**< Surface has exclusive palette */ +#define SDL_DOUBLEBUF 0x40000000 /**< Set up double-buffered video mode */ +#define SDL_FULLSCREEN 0x80000000 /**< Surface is a full screen display */ +#define SDL_OPENGL 0x00000002 /**< Create an OpenGL rendering context */ +#define SDL_OPENGLBLIT 0x0000000A /**< Create an OpenGL rendering context and use it for blitting */ +#define SDL_RESIZABLE 0x00000010 /**< This video mode may be resized */ +#define SDL_NOFRAME 0x00000020 /**< No window caption or edge frame */ +/*@}*/ + +/** Used internally (read-only) */ +/*@{*/ +#define SDL_HWACCEL 0x00000100 /**< Blit uses hardware acceleration */ +#define SDL_SRCCOLORKEY 0x00001000 /**< Blit uses a source color key */ +#define SDL_RLEACCELOK 0x00002000 /**< Private flag */ +#define SDL_RLEACCEL 0x00004000 /**< Surface is RLE encoded */ +#define SDL_SRCALPHA 0x00010000 /**< Blit uses source alpha blending */ +#define SDL_PREALLOC 0x01000000 /**< Surface uses preallocated memory */ +/*@}*/ + +/*@}*/ + +/** Evaluates to true if the surface needs to be locked before access */ +#define SDL_MUSTLOCK(surface) \ + (surface->offset || \ + ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) + +/** typedef for private surface blitting functions */ +typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, + struct SDL_Surface *dst, SDL_Rect *dstrect); + + +/** Useful for determining the video hardware capabilities */ +typedef struct SDL_VideoInfo { + Uint32 hw_available :1; /**< Flag: Can you create hardware surfaces? */ + Uint32 wm_available :1; /**< Flag: Can you talk to a window manager? */ + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; /**< Flag: Accelerated blits HW --> HW */ + Uint32 blit_hw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_hw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_sw :1; /**< Flag: Accelerated blits SW --> HW */ + Uint32 blit_sw_CC :1; /**< Flag: Accelerated blits with Colorkey */ + Uint32 blit_sw_A :1; /**< Flag: Accelerated blits with Alpha */ + Uint32 blit_fill :1; /**< Flag: Accelerated color fill */ + Uint32 UnusedBits3 :16; + Uint32 video_mem; /**< The total amount of video memory (in K) */ + SDL_PixelFormat *vfmt; /**< Value: The format of the video surface */ + int current_w; /**< Value: The current video mode width */ + int current_h; /**< Value: The current video mode height */ +} SDL_VideoInfo; + + +/** @name Overlay Formats + * The most common video overlay formats. + * For an explanation of these pixel formats, see: + * http://www.webartz.com/fourcc/indexyuv.htm + * + * For information on the relationship between color spaces, see: + * http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html + */ +/*@{*/ +#define SDL_YV12_OVERLAY 0x32315659 /**< Planar mode: Y + V + U (3 planes) */ +#define SDL_IYUV_OVERLAY 0x56555949 /**< Planar mode: Y + U + V (3 planes) */ +#define SDL_YUY2_OVERLAY 0x32595559 /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ +#define SDL_UYVY_OVERLAY 0x59565955 /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ +#define SDL_YVYU_OVERLAY 0x55595659 /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ +/*@}*/ + +/** The YUV hardware video overlay */ +typedef struct SDL_Overlay { + Uint32 format; /**< Read-only */ + int w, h; /**< Read-only */ + int planes; /**< Read-only */ + Uint16 *pitches; /**< Read-only */ + Uint8 **pixels; /**< Read-write */ + + /** @name Hardware-specific surface info */ + /*@{*/ + struct private_yuvhwfuncs *hwfuncs; + struct private_yuvhwdata *hwdata; + /*@{*/ + + /** @name Special flags */ + /*@{*/ + Uint32 hw_overlay :1; /**< Flag: This overlay hardware accelerated? */ + Uint32 UnusedBits :31; + /*@}*/ +} SDL_Overlay; + + +/** Public enumeration for setting the OpenGL window attributes. */ +typedef enum { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_SWAP_CONTROL +} SDL_GLattr; + +/** @name flags for SDL_SetPalette() */ +/*@{*/ +#define SDL_LOGPAL 0x01 +#define SDL_PHYSPAL 0x02 +/*@}*/ + +/* Function prototypes */ + +/** + * @name Video Init and Quit + * These functions are used internally, and should not be used unless you + * have a specific need to specify the video driver you want to use. + * You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/*@{*/ +/** + * Initializes the video subsystem. Sets up a connection + * to the window manager, etc, and determines the current video mode and + * pixel format, but does not initialize a window or graphics mode. + * Note that event handling is activated by this routine. + * + * If you use both sound and video in your application, you need to call + * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, + * you won't be able to set full-screen display modes. + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, Uint32 flags); +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); +/*@}*/ + +/** + * This function fills the given character buffer with the name of the + * video driver, and returns a pointer to it if the video driver has + * been initialized. It returns NULL if no driver has been initialized. + */ +extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); + +/** + * This function returns a pointer to the current display surface. + * If SDL is doing format conversion on the display surface, this + * function returns the publicly visible surface, not the real video + * surface. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void); + +/** + * This function returns a read-only pointer to information about the + * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' + * member of the returned structure will contain the pixel format of the + * "best" video mode. + */ +extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); + +/** + * Check to see if a particular video mode is supported. + * It returns 0 if the requested mode is not supported under any bit depth, + * or returns the bits-per-pixel of the closest available mode with the + * given width and height. If this bits-per-pixel is different from the + * one used when setting the video mode, SDL_SetVideoMode() will succeed, + * but will emulate the requested bits-per-pixel with a shadow surface. + * + * The arguments to SDL_VideoModeOK() are the same ones you would pass to + * SDL_SetVideoMode() + */ +extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); + +/** + * Return a pointer to an array of available screen dimensions for the + * given format and video flags, sorted largest to smallest. Returns + * NULL if there are no dimensions available for a particular format, + * or (SDL_Rect **)-1 if any dimension is okay for the given format. + * + * If 'format' is NULL, the mode list will be for the format given + * by SDL_GetVideoInfo()->vfmt + */ +extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); + +/** + * Set up a video mode with the specified width, height and bits-per-pixel. + * + * If 'bpp' is 0, it is treated as the current display bits per pixel. + * + * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the + * requested bits-per-pixel, but will return whatever video pixel format is + * available. The default is to emulate the requested pixel format if it + * is not natively available. + * + * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in + * video memory, if possible, and you may have to call SDL_LockSurface() + * in order to access the raw framebuffer. Otherwise, the video surface + * will be created in system memory. + * + * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle + * updates asynchronously, but you must always lock before accessing pixels. + * SDL will wait for updates to complete before returning from the lock. + * + * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee + * that the colors set by SDL_SetColors() will be the colors you get. + * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all + * of the colors exactly the way they are requested, and you should look + * at the video surface structure to determine the actual palette. + * If SDL cannot guarantee that the colors you request can be set, + * i.e. if the colormap is shared, then the video surface may be created + * under emulation in system memory, overriding the SDL_HWSURFACE flag. + * + * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set + * a fullscreen video mode. The default is to create a windowed mode + * if the current graphics system has a window manager. + * If the SDL library is able to set a fullscreen video mode, this flag + * will be set in the surface that is returned. + * + * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up + * two surfaces in video memory and swap between them when you call + * SDL_Flip(). This is usually slower than the normal single-buffering + * scheme, but prevents "tearing" artifacts caused by modifying video + * memory while the monitor is refreshing. It should only be used by + * applications that redraw the entire screen on every update. + * + * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the + * window manager, if any, to resize the window at runtime. When this + * occurs, SDL will send a SDL_VIDEORESIZE event to you application, + * and you must respond to the event by re-calling SDL_SetVideoMode() + * with the requested size (or another size that suits the application). + * + * If SDL_NOFRAME is set in 'flags', the SDL library will create a window + * without any title bar or frame decoration. Fullscreen video modes have + * this flag set automatically. + * + * This function returns the video framebuffer surface, or NULL if it fails. + * + * If you rely on functionality provided by certain video flags, check the + * flags of the returned surface to make sure that functionality is available. + * SDL will fall back to reduced functionality if the exact flags you wanted + * are not available. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode + (int width, int height, int bpp, Uint32 flags); + +/** @name SDL_Update Functions + * These functions should not be called while 'screen' is locked. + */ +/*@{*/ +/** + * Makes sure the given list of rectangles is updated on the given screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRects + (SDL_Surface *screen, int numrects, SDL_Rect *rects); +/** + * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire + * screen. + */ +extern DECLSPEC void SDLCALL SDL_UpdateRect + (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); +/*@}*/ + +/** + * On hardware that supports double-buffering, this function sets up a flip + * and returns. The hardware will wait for vertical retrace, and then swap + * video buffers before the next video surface blit or lock will return. + * On hardware that doesn not support double-buffering, this is equivalent + * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); + * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when + * setting the video mode for this function to perform hardware flipping. + * This function returns 0 if successful, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface *screen); + +/** + * Set the gamma correction for each of the color channels. + * The gamma values range (approximately) between 0.1 and 10.0 + * + * If this function isn't supported directly by the hardware, it will + * be emulated using gamma ramps, if available. If successful, this + * function returns 0, otherwise it returns -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); + +/** + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * You may pass NULL for any of the channels to leave it unchanged. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue); + +/** + * Retrieve the current values of the gamma translation tables. + * + * You must pass in valid pointers to arrays of 256 16-bit quantities. + * Any of the pointers may be NULL to ignore that channel. + * If the call succeeds, it will return 0. If the display driver or + * hardware does not support gamma translation, or otherwise fails, + * this function will return -1. + */ +extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); + +/** + * Sets a portion of the colormap for the given 8-bit surface. If 'surface' + * is not a palettized surface, this function does nothing, returning 0. + * If all of the colors were set as passed to SDL_SetColors(), it will + * return 1. If not all the color entries were set exactly as given, + * it will return 0, and you should look at the surface palette to + * determine the actual color palette. + * + * When 'surface' is the surface associated with the current display, the + * display colormap will be updated with the requested colors. If + * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() + * will always return 1, and the palette is guaranteed to be set the way + * you desire, even if the window colormap has to be warped or run under + * emulation. + */ +extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, + SDL_Color *colors, int firstcolor, int ncolors); + +/** + * Sets a portion of the colormap for a given 8-bit surface. + * 'flags' is one or both of: + * SDL_LOGPAL -- set logical palette, which controls how blits are mapped + * to/from the surface, + * SDL_PHYSPAL -- set physical palette, which controls how pixels look on + * the screen + * Only screens have physical palettes. Separate change of physical/logical + * palettes is only possible if the screen has SDL_HWPALETTE set. + * + * The return value is 1 if all colours could be set as requested, and 0 + * otherwise. + * + * SDL_SetColors() is equivalent to calling this function with + * flags = (SDL_LOGPAL|SDL_PHYSPAL). + */ +extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, + SDL_Color *colors, int firstcolor, + int ncolors); + +/** + * Maps an RGB triple to an opaque pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b); + +/** + * Maps an RGBA quadruple to a pixel value for a given pixel format + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA +(const SDL_PixelFormat * const format, + const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a); + +/** + * Maps a pixel value into the RGB components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b); + +/** + * Maps a pixel value into the RGBA components for a given pixel format + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * const fmt, + Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); + +/** @sa SDL_CreateRGBSurface */ +#define SDL_AllocSurface SDL_CreateRGBSurface +/** + * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * If the function runs out of memory, it will return NULL. + * + * The 'flags' tell what kind of surface to create. + * SDL_SWSURFACE means that the surface should be created in system memory. + * SDL_HWSURFACE means that the surface should be created in video memory, + * with the same format as the display surface. This is useful for surfaces + * that will not change much, to take advantage of hardware acceleration + * when being blitted to the display surface. + * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with + * this surface, but you must always lock it before accessing the pixels. + * SDL will wait for current blits to finish before returning from the lock. + * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. + * If the hardware supports acceleration of colorkey blits between + * two surfaces in video memory, SDL will try to place the surface in + * video memory. If this isn't possible or if there is no hardware + * acceleration available, the surface will be placed in system memory. + * SDL_SRCALPHA means that the surface will be used for alpha blits and + * if the hardware supports hardware acceleration of alpha blits between + * two surfaces in video memory, to place the surface in video memory + * if possible, otherwise it will be placed in system memory. + * If the surface is created in video memory, blits will be _much_ faster, + * but the surface format must be identical to the video surface format, + * and the only way to access the pixels member of the surface is to use + * the SDL_LockSurface() and SDL_UnlockSurface() calls. + * If the requested surface actually resides in video memory, SDL_HWSURFACE + * will be set in the flags member of the returned surface. If for some + * reason the surface could not be placed in video memory, it will not have + * the SDL_HWSURFACE flag set, and will be created in system memory instead. + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +/** @sa SDL_CreateRGBSurface */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, int height, int depth, int pitch, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface *surface); + +/** + * SDL_LockSurface() sets up a surface for directly accessing the pixels. + * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write + * to and read from 'surface->pixels', using the pixel format stored in + * 'surface->format'. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. In particular, if the + * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you + * will not need to lock the display surface before accessing it. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface *surface); +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); + +/** + * Load a surface from a seekable SDL data source (memory or file.) + * If 'freesrc' is non-zero, the source will be closed after being read. + * Returns the new surface, or NULL if there was an error. + * The new surface should be freed with SDL_FreeSurface(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); + +/** Convenience macro -- load a surface from a file */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data source (memory or file.) + * If 'freedst' is non-zero, the source will be closed after being written. + * Returns 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface *surface, SDL_RWops *dst, int freedst); + +/** Convenience macro -- save a surface to a file */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * Sets the color key (transparent pixel) in a blittable surface. + * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), + * 'key' will be the transparent pixel in the source image of a blit. + * SDL_RLEACCEL requests RLE acceleration for the surface if present, + * and removes RLE acceleration if absent. + * If 'flag' is 0, this function clears any current color key. + * This function returns 0, or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey + (SDL_Surface *surface, Uint32 flag, Uint32 key); + +/** + * This function sets the alpha value for the entire surface, as opposed to + * using the alpha component of each pixel. This value measures the range + * of transparency of the surface, 0 being completely transparent to 255 + * being completely opaque. An 'alpha' value of 255 causes blits to be + * opaque, the source pixels copied to the destination (the default). Note + * that per-surface alpha can be combined with colorkey transparency. + * + * If 'flag' is 0, alpha blending is disabled for the surface. + * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. + * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the + * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. + * + * The 'alpha' parameter is ignored for surfaces that have an alpha channel. + */ +extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); + +/** + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); + +/** + * Gets the clipping rectangle for the destination surface in a blit. + * 'rect' must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); + +/** + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + * + * This function is used internally by SDL_DisplayFormat(). + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface + (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); + +/** + * This performs a fast blit from the source surface to the destination + * surface. It assumes that the source and destination rectangles are + * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire + * surface (src or dst) is copied. The final blit rectangles are saved + * in 'srcrect' and 'dstrect' after all clipping is performed. + * If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without alpha and colorkey + * are defined as follows: + * + * RGBA->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using alpha-channel). + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy RGB. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value); + * set destination alpha to opaque. + * SDL_SRCALPHA not set: + * copy RGB, set destination alpha to source per-surface alpha value. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * RGBA->RGBA: + * SDL_SRCALPHA set: + * alpha-blend (using the source alpha channel) the RGB values; + * leave destination alpha untouched. [Note: is this correct?] + * SDL_SRCCOLORKEY ignored. + * SDL_SRCALPHA not set: + * copy all of RGBA to the destination. + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * RGB values of the source colour key, ignoring alpha in the + * comparison. + * + * RGB->RGB: + * SDL_SRCALPHA set: + * alpha-blend (using the source per-surface alpha value). + * SDL_SRCALPHA not set: + * copy RGB. + * both: + * if SDL_SRCCOLORKEY set, only copy the pixels matching the + * source colour key. + * + * If either of the surfaces were in video memory, and the blit returns -2, + * the video memory was lost, so it should be reloaded with artwork and + * re-blitted: + * @code + * while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { + * while ( SDL_LockSurface(image) < 0 ) + * Sleep(10); + * -- Write image pixels to image->pixels -- + * SDL_UnlockSurface(image); + * } + * @endcode + * + * This happens under DirectX 5.0 when the system switches away from your + * fullscreen application. The lock will also fail until you have access + * to the video memory again. + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** This is the public blit function, SDL_BlitSurface(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlit() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); +/** This is a semi-private blit function and it performs low-level surface + * blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/** + * This function performs a fast fill of the given rectangle with 'color' + * The given rectangle is clipped to the destination surface clip area + * and the final fill rectangle is saved in the passed in pointer. + * If 'dstrect' is NULL, the whole surface will be filled with 'color' + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer, suitable for fast + * blitting onto the display surface. It calls SDL_ConvertSurface() + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormat(SDL_Surface *surface); + +/** + * This function takes a surface and copies it to a new surface of the + * pixel format and colors of the video framebuffer (if possible), + * suitable for fast alpha blitting onto the display surface. + * The new surface will always have an alpha channel. + * + * If you want to take advantage of hardware colorkey or alpha blit + * acceleration, you should set the colorkey and alpha value before + * calling this function. + * + * If the conversion fails or runs out of memory, it returns NULL + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormatAlpha(SDL_Surface *surface); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name YUV video surface overlay functions */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** This function creates a video output overlay + * Calling the returned surface an overlay is something of a misnomer because + * the contents of the display surface underneath the area where the overlay + * is shown is undefined - it may be overwritten with the converted YUV data. + */ +extern DECLSPEC SDL_Overlay * SDLCALL SDL_CreateYUVOverlay(int width, int height, + Uint32 format, SDL_Surface *display); + +/** Lock an overlay for direct access, and unlock it when you are done */ +extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay *overlay); +extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay); + +/** Blit a video overlay to the display surface. + * The contents of the video surface underneath the blit destination are + * not defined. + * The width and height of the destination rectangle may be different from + * that of the overlay, but currently only 2x scaling is supported. + */ +extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); + +/** Free a video overlay */ +extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay *overlay); + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name OpenGL support functions. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Dynamically load an OpenGL library, or the default one if path is NULL + * + * If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * Get the address of a GL function + */ +extern DECLSPEC void * SDLCALL SDL_GL_GetProcAddress(const char* proc); + +/** + * Set an attribute of the OpenGL subsystem before intialization. + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * Get an attribute of the OpenGL subsystem from the windowing + * interface, such as glX. This is of course different from getting + * the values from SDL's internal OpenGL subsystem, which only + * stores the values you request before initialization. + * + * Developers should track the values they pass into SDL_GL_SetAttribute + * themselves if they want to retrieve these values. + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); + +/** + * Swap the OpenGL buffers, if double-buffering is supported. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); + +/** @name OpenGL Internal Functions + * Internal functions that should not be called unless you have read + * and understood the source code for these functions. + */ +/*@{*/ +extern DECLSPEC void SDLCALL SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); +extern DECLSPEC void SDLCALL SDL_GL_Lock(void); +extern DECLSPEC void SDLCALL SDL_GL_Unlock(void); +/*@}*/ + +/*@}*/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** @name Window Manager Functions */ +/** These functions allow interaction with the window manager, if any. */ /*@{*/ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Sets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); +/** + * Gets the title and icon text of the display window (UTF-8 encoded) + */ +extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon); + +/** + * Sets the icon for the display window. + * This function must be called before the first call to SDL_SetVideoMode(). + * It takes an icon surface, and a mask in MSB format. + * If 'mask' is NULL, the entire icon surface will be used as the icon. + */ +extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); + +/** + * This function iconifies the window, and returns 1 if it succeeded. + * If the function succeeds, it generates an SDL_APPACTIVE loss event. + * This function is a noop and returns 0 in non-windowed environments. + */ +extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); + +/** + * Toggle fullscreen mode without changing the contents of the screen. + * If the display surface does not require locking before accessing + * the pixel information, then the memory pointers will not change. + * + * If this function was able to toggle fullscreen mode (change from + * running in a window to fullscreen, or vice-versa), it will return 1. + * If it is not implemented, or fails, it returns 0. + * + * The next call to SDL_SetVideoMode() will set the mode fullscreen + * attribute based on the flags parameter - if SDL_FULLSCREEN is not + * set, then the display will be windowed by default where supported. + * + * This is currently only implemented in the X11 video driver. + */ +extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface *surface); + +typedef enum { + SDL_GRAB_QUERY = -1, + SDL_GRAB_OFF = 0, + SDL_GRAB_ON = 1, + SDL_GRAB_FULLSCREEN /**< Used internally */ +} SDL_GrabMode; +/** + * This function allows you to set and query the input grab state of + * the application. It returns the new input grab state. + * + * Grabbing means that the mouse is confined to the application window, + * and nearly all keyboard input is passed directly to the application, + * and not interpreted by a window manager, if any. + */ +extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); + +/*@}*/ + +/** @internal Not in public API at the moment - do not use! */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/begin_code.h b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/begin_code.h new file mode 100644 index 00000000..27e2f7bc --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/include/x86_64-pc-windows-msvc/SDL/begin_code.h @@ -0,0 +1,196 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/** + * @file begin_code.h + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/** + * @file begin_code.h + * This shouldn't be nested -- included it around code only. + */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +/** + * @def DECLSPEC + * Some compilers use a special export keyword + */ +#ifndef DECLSPEC +# if defined(__BEOS__) || defined(__HAIKU__) +# if defined(__GNUC__) +# define DECLSPEC +# else +# define DECLSPEC __declspec(export) +# endif +# elif defined(__WIN32__) +# ifdef __BORLANDC__ +# ifdef BUILD_SDL +# define DECLSPEC +# else +# define DECLSPEC __declspec(dllimport) +# endif +# else +# define DECLSPEC __declspec(dllexport) +# endif +# elif defined(__OS2__) +# ifdef __WATCOMC__ +# ifdef BUILD_SDL +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# elif defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX = 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# else +# define DECLSPEC +# endif +# endif +#endif + +/** + * @def SDLCALL + * By default SDL uses the C calling convention + */ +#ifndef SDLCALL +# if defined(__WIN32__) && !defined(__GNUC__) +# define SDLCALL __cdecl +# elif defined(__OS2__) +# if defined (__GNUC__) && __GNUC__ < 4 +# /* Added support for GCC-EMX #p>j5&Xey}?vOnM7;s3w>zw7$lyY_sZ-Jkn;zwY;aU%T$-y7$b@p9ug1007AL zTOa@cnzrLkA^dmzzaPlkX$fqz1fW6WwMrAv^|gw3WKSlaF>cRK=*kpSd&0R4}CZ@2od|Jz}^&31k#w_SF8{U`9>=k3G)tltS0 zLqY%+3IIS23IPgt1h#ci|Koz4i~e^BSr7uC|M#c=^JKX5|DOLpulOG|J|2Gh|DA1n z`(ORq@$>&J7`=O_K8FBOAt3IR&`w;SJr0CtN2m`}2P3VdjDUX(>t4@8{| zm=^(eV`!Z;1*xg23BjH8ys=6EWC|^UY64mkVLf0tKz~K>T)?7qp#p+BBbb@KWF*}O zo;N^BrOWtktqN8`00u1C%;S_VK)Mn@2r^646ui@?RT_eMd#*=iwLMs$Ylw5jCD7xHE|g zOUUaG5OgZu*ZUp@MnkC!xECoxUnjV`a)5^)q1$7!m~oWM_eASmC|Wn=8^m;?WMboI z3W5%8{)xVVN&Z2@SalZ=5#MxrgaS@Vqj9Oy`{0)V=>qErH4O|*C9@KiM6vdcm1h~>ACxhw4RmrYg=GqN?v@( zgTE`pB-$FimR>`zvMUozD#>L4Xp4Fb8$l#6S?0FWYU4y85K&Z1s!^y-=ihwpeLC`x zL~SXt?l%BnE^4!AMS8+#GLiw-`*QjxD>Cu~5+|T8F9sl4^;8|uGjc|k>wZ0Cu1eO3 zj!@dk&jA>-cZPpY%s+nqtiGs+w!&!LGZyxnZ6!b-C>W{V^);sFk}t8<4Ou+y8|ZgG z=3MXYLZ4r?9={CD`=nZ!!19~JPF6-%K@sLP0PvE`crmTRY}iO<2-4I`MA;h8DYbe@ zU@Yul;UZ_vbRM6n?d>cp3!HrfIN6TXP4rLra3v@-W2N($_{ueC)CZn(Tvn4R4mSW# zjG`ftk53GPT6;hw1tj_NX`#rYpwc%!%tiIMpz_+pCQ@?hv_p>LM7B5$FwAFL z3L53a-;^z4_>l5&z#R;HVotq|0^I*d<$Q`gJs{tGG@>X(}v4~@hgAF@or40Yj3JpjMbi2RM04x3!oi4f?E^Mr0A>#mdEsLvbq_Bb<_oA zKAByFVb}|9y{+4qp9=u;MVORf@}FHqMZ{Av_Up-|++NZTs7}DK;HKSrB-!BcO~DOI zJmWN%woYCbNnYa5MKRK@jmGaMqBG5U+Bf+f_x>9GiPPZ$8oit85-4MNPQH`9IYijtEPMYDp1~8k1+dj%>mxbl3Sd z<&$K09hl5zo9Qdom$j2K+V^TpC<5GGLY04Ri3F=XXM(M?At9qeLT$KeSnD`8ft(a- z2-LYCM?%A_U_aNY4HM<+&pwq}A)3L!-aWgS!D1)FmXCdRmH$zSya1G+y{90oT5hSt zX$PAZ*B_vCn?L6LCSMcQvszHKDQi>hp=UIN&}xL9#di-i6MTKkswOz z)VJH$L7qM3J-?bRt(|qrpK~~I0P~$amLV{w*upo35(M0W2Nst<(!J~oUtTgHP{)5O zoR1WB@;#$$&+GgBoaYu0K}mCk1*(4K`VZRi0!3#RD^7ShjjD}4BoEc3(9;qGz4!cH z_Nz%af9XaIaRX)(n&`xc(9|bYE-B%`*Yukb=q_=DYE|W?!EdIQYDM#hV_m&aoHoNn z*S#!Fbpxk9q8;bFeHL6$`mJKfI7IoJPc!f0joWG&jb_BHWX%%C6`8AAI&Px7O&*$be}pSNptKoO$l zIgkAQ;VPbxv7%BW-4U7$x+5B2Bv zRzD;EfhH>r`=_sk(2kY6?(ITy#^Y}W1}hHoYJ7>q`S(%(fQ;jtkrLhKDLr(*D}gYH z9GAi8Gk7hFIu}SY`AX3Ko3UfFNzgNYU=qFER9j*5NP*lUjQt0Uc-T#wgs~GS>{DvB zp39gf^fdPwblu`qj8O*n6rD7*yT`$4PcU6JJKqZ^T}90aO8Vu~M@x^y`wlClrJlyM z>gCrQ2HUSBzY9sTHiWD*<&NUG1vF}tKkp;FqbwT2=T(V_;sT`kfRZTm0ZuP0mwRJc~J zwGkUEM^q)o?YE{2M}jFF0snutRk!zS$6i-SRL4u@sP2M3_mj#XjAQ(r z{@?TZxDG_bX-xFmn!uYb);#DIhNN*;zlfl*f(P7(Hc-u%CkOOYGvS&{Aj`Bv<%!jJ z*7~VvL=KbfW&7{c%yZyhBzfJ7NQC)VFH)|4H5eH1g2erG=&^;^NSd22WLa7f^-Z+| zQI$phMm=CvUjV?+OKi0&*;)SkA}`pUAWKF9u$BD0Akv;YpmD*ZQbtQB znesAlC^wmq`_L>NiA3a`G-zK5f9BiYmeE1!200^tRwJ%1Ufk+Az?p=^QzOKY$OH-6 znh8f4920cG`AYxm&K{M$tacx!FqnQ=-;_&I*o4pz;@`xyOl5y+0%T8%nZB7{`|CUw zKm*zV4jW6LiVx#iz)9piS>!O({>D-Rzz*_&Lv_kXUqee8Z$hbOAL%dZ{rmEm)6;t; z4(7MmSztJxFcr%iPmUbPm^>ylnzc090QVmsi5(vc8Wx?bLLX_EcL==h5Keb6`Cw9a zAR_ZGTsTUp`)@Zf%037l9iJk#I=7 z>9EBH?PI&#R$P~A8CL1k7%`?NjVH(G@drlcVjZY1u{SqeuD7RT?SrX-uZ-7{8$0|w z21#mkx-?(%TXru=@A@THP&ngXghrmHUzCTnT5AAtU=;_ife6dR8L_4?$5ZDCjHXB- zm0x<#g>&-k+FEf2V|?(#uZqER{0-Hg)XKZOn{j*1=+GH0Ars$LC7#n*b6z{~P1Mrr zMDOn4L^|qp<%kpwStcfQ9w?fKk)u0l#QQ%)G=J|QOab5;Vl4jDcY;1dL;^@u8+?(i zG)(08kV@@I69Llhoy$KJefW&_%&FV1>d{c5DqUPzgYqX4Jv51uV?aD1)(KtnU1M$iC(8!Rz=_SgU)MI z$kawKrFA}8(t|3k_lq@sJC;HLU7KtIi+?x96Hij7f(D5=ClU<*d_>O`Dc?w`}^O&oW#Xi#bA72Vd2LXm4H~ zg+&B#CA^DxUpzq2RIr%u!e2Cd1}5@B8F+>LQLA0>KzD6SWE3_4{6Jf0f6*~NAki-+ zI8t-`rwH{hkSd7+#gN+Q2U5?3QbBSWSnaVNS^6>Q&PZA}`x_S6UE04jx!E{otHonB zr&|MuFxCtVwts_)d6=9k0Gck5=Ck|am$x3Z6XiVGV%um_?C;nN$Q_)n;5RY+D^B=| zv?Nd<G@GYlDGFk0u z`N0y#Z`)|Y?0KGeH0j*%qM}jxU004wR#2#&V5K^7C~2wL*9Wlrg>LJ?-ohqEo!in} zrg@elJsj?%EkW69o9mh##Pc-H>-7F1YnE3=Qf(yI8?Y`gdwoQr;JqkX0^}*orsr7X&a>NA zE6noJH{jG$uIUo^#@Gco2>lL3XfqmL`t)O5e*Tv3 z#nuOZm8XQW!^0aJ8_A&iHda=fL%YMhoa;I63^+_kXi*g3|A(e*_3k@xA14I(D6jYF z-MZ_UjHAK`r=Kz4t}EQ-zz4@T5zNw7Am~LGH{=?u{peMwa8KglvR&C$GDW$RZc{Drj<8+#IfI;%_6H?;ZL8IJGiTZ<=wlME{{$2}1 zxGIk|_FLoR8*gOIOst{YVCKks#3=gdy=#^2gu_S%#41m4i>SxI9MAxEtWIqqHpUEC zGp=9()zxN8Qb3spny!&P(;ej2YU!;%fGiVh54*!WuU{ZicI#oH_jzAn|4?15CH<7J zL_-w!D9X5O`HkE}TQqQ)NNi)^4F|wMvzd+QP%P`*->nE*y6vX))@08tzuqC_$<@ru zSjwWlO1r)45Y8t$FPg?x8`d}gF$*dKIqgqz8xPF6iWc*L6S9suscY*Z#|a*KX?~!f zVRPnvC?&{5=Lj%j2ts-Ivcms)HU9Q|PCy+R$O#-?&JU3FnMNmla++l3%j7^C&K2S3 z;l)~7WoJbj{1YRm>t20rkJ4f}fBHe2q`i$`e@8&Sb;d^u5Wu&<$%uXdWXp0tZ7M=@ zRk>koA~s{jlIjGOWB-9kfoOkVLhmc3d2uQcl4#WjGM!H$6+tt*P256$BE|lx){F>% zhQUM>=T%Uf5K&6(tZ3fBjNv8QsC|x+xR~}sj*U{&rYR1=$viyG&fx&A1BDlQFlnd^ zz6FAoIzy6uHWa9n+~l{k5z+K|&3Z{sWlNyOs|ThD*03)M8xV-lg<(p+#)!>D66*)l z@kNp<-Q$c~eaO1|-ji(yM}s`Epl?Ev8YT)Chpb|U{#ZeaqVA=o z$+eyLzT580#(!H_5Z;$-&R{91qcy zDx62l=O_qyJ3!^3qQWqVi+GBNSUlU*sAjU$dGn-5PJvISm)h(z=E4HsNXK+Lbjt0s zCu4bv4?ez9$MWb$>&CLoStYjsJP%qhTE2h~@@?SAC!;fG#q|9xZ|GQJ-GGx9?Q;$( zJ7SXNm?a`G;IMBm<5Uwl>E|2vpI(~VubKc8)D>=-FE^pE(?@gK#7>_Du0C!GX2##G;&{!so%1v^N$Mb5|GKKYKchB00m zG1r$xXG!XH8L%e3g$4VBx2QfJxL=+vJ&^kKQk3dyy9um&knpx$mFjK#m$t0YzlF`w zcqu-s-LX3tw8~=KHusx4b0iXy>(*O zXMy;xqO~o~kj#vzubOdtIo1((87SELjw}|@ABL$R93XqkvGN%nBJP)AyRgbOVKTW2 zezZ}C`N8R-0RWJw1fp~tP1*Y|5e^<%I@rPfLJ1A2b_b#Nxxt*~n2PbR-9ulsu)cvL zxYtvOP@_zCw>iiQNjyMzIZKo%@<{o*o7_$Q$|3!(QetgsUnbf`WPbyYBbjiRR)|e$ zZ4UG5%;A$uwrJ`NBKs+Yr`%31y;4`kuPgB0Rd_7R3e`Z#Hzp}(z7gX}T; zqWzlLp5u&0X_PK0-YXHch*}O z4$O)-90Uq~Uw0Y|HW7sw2~i9~!=b`j&-BlURn6!;*wS&EvcjH;JbDW6xJ+BmevG)% zH6yrxP+x+pw9hBHz=?JW9isdxq(^G*O6qBeZkGzLQQ}MNJ)X!M8)9ZFv$5r2?U91KUb_A z`uW%tX6x6$E1zRX;{muCuyX~5zqCp1h%|=PT-HJi-FLwHhBIH%bx#0!nECY^B-+}g z)h}!TR`Xcr5(zio0bOwgdQv|{O(qXpi`oLWt%7fSib~J~*;?CjIGjZr=wV@)NXXJJ zj;I)^YC5d$-<4l|d#$k>`Rh(z30kUFP&iut8qeAqDk2QiM9a&Ih>H1(g@=bH!*7dA zAhu7!k&;r<>Dv({BP)lr5ZW5p0RivX z&59N##>B^+p9wuq_X_;L{{F#Wpg$`u8+Z&3_n^YdI)J9@q-B0Ip8x$3J*_lPz&JGg zwm+oH8?6^?;;!F+<2O2W9Mv4B#ew!9lJtM*5UaD#sjO@Nb;Tik1?6x;Dga+|(we)3 zLK=DljZ1Uy=8vJ|L3iN-A~AimaQOqH&*{%@kg$7>gmOdig9xXV06C50-|hHUn8EL6 zpJ9Z-xu-SU20hQfz!0`p$BA(Rc6<9S$6k-LRxzfgQ*c9qyfK$gwah|5g6n$6JsjI~`#yAl?DyCCPRZ(Pj_90}cp*WaQgRm$9E zq28TW#-foRvxG-!J_h|XPOt%ly89GR!n^F{lUvB`xdPuM-&x*XIU8bs5?;$muq;@H z4ZTttsaW^ zS#I#Ldk2;T1oQ*}Ho_kMF_Q5K@acWTuO|}{2_xjOAfD(a`us@mp~%ry`VO| zL;Wjmn^w&^<4sc)AtZmw$1Qp)k~X?`;-0&*=ckcx89pSQg-YbuFgp^TQe$9g`cbD| zXl!B_#5cv>OjgXOmbu1ulu?F@)^AKoKt)v`VssC(-|OKRtu<$FrjrLt3jfg<&_uJ( zt<&)Z*qaMAX1zow01b7r=_G}32%8(o;1$!zGA7n z_PS*&$AiW&SD?Lr%m)JoPmGdJy1^w>#j!E`{o{3{>5xUEHnm*wJ8Dpe++p!64PwpL zyO7x7=@n2bToH57-ZVR4udK0Eun!Epz5C|it4(*-Fc_0X%^#oMf7}MW-e?2qvGEAV z>&mx71qu3(h%m5uPbykI>%9?L7k1^(F{e@Kg%yy3$1^O43hx^w>Sps<18y zeOF9VSl*K}CXOd84WN&_03laQzPe^(;_d>F?e7Vtr;R(MWS^P?Qv&55EO?SPY>HAz zYYHOCm(9G@sd7mmFo79E(II|4iHj)oJ{@+Tv`8Zx|R76^s%V3 z29#Dui}8hSLHevujsX|J%_Z}D+w4*8*gXDWDOcF)cg+2h-*;(EZwYC3qj73DsaUa_ z>q2);-$x_5QVXW`;7ol`nReHMwFXC@tDnm!8}Ei-_Un)DYaX7OMWodm9a)4KGUvL` zss8<|{igf14zw~0aA7FwsR30=;9)!RzDI?D5_^%H(-r!Ghuh4n3J!tF!_Ri!XdFL{ z^GK5aD)FY{l+3!xXo$B7n`A&7=5X&=b7$)BFD9)|k9s^7r32-8Q40uIi%qCEK-3*;XqI*ChB)#t zWH)l+nug;N%`GILb zL|Mbq9qzom*WCn+4hx2c9!q{+#eJt8ZQX_~wg{$&!@BzzFDHX zqp$vXpB9~)jv^lV4u6P35&gW0t6D(+4$NYSS@P7x2+g-WP?>#t$N==bt5OU3s6eO$ zduht7b@u!>O>*oJuYF{*P(r3yeU_C$#Xem7KiLNQ-0O`EGOoH`^&12qwyVr^$OCFQ z_ZRgC-rQ#2IAq`>jH!4I0h&IbK?gU^cWTmxxqR%F4L1ze%-R(eES-uDb~CmQG^~hm z+Z=8@3(fZ!zQB7pG6gGf%DeL@03VUP0VD6*XnpcSDW8l(9s$a*%z(yB?;k<4{rt;k zcps9Z48~}c{;C~~%789?&$nHMdZ=$y-b~hXoYGCL^#ry+I36^J!2M|Z@=2b|Zjo1>RPkfDxUSwDbVl&!3+{%2>irPe__ z$t&(Z^x$YdD ztfEkZ<;7pPmi+@A$f^p?)hc;7_JFJFRr8tz;LXm%aA{aMtaKVJUQkmW9J`DAl#p|D zdxwUb0Fe;!KPfA;-tca53cV%z*304gfN~SOl{GshtV9sIa;?|tRmVz)c9wP{%%;l_ z$hjuo2LN#+j0fcPhLDQG2K@9&T4AiQa2ON3W z^2~kY+1yGa0)zYE_KJ{xxgmm<0EMzdCK*n$v~@*w4@$^ZJ+BaYr4F(D{A#eD7gtyzU zGIhEM5Wh=V`h5w}H{vtI+$Acz+86hu-&*C4ogO+84anp&*rm^&$@qyKQqiSpmunO& zDI(tA^rc|Tq18UW(4rwFh>5z43X_vT`QKWoBPnW>rh_$ah z&AygsV+>c<9O!Ji=UK9DwvrL*J)RG!mnV@t9g}iUs~SjF`q?aq9?&`i&;3-gQA!zl*M0 z1rKruC)m93gah(k*9t^sEFwaW6N!}yQnBn3-V_mchUU{iJXm5!zsb-=CR@puCe z-RGr{ov2>!A#H)vmW9+`1iG!xDKO!Zd`4U`aO)rn9RWIwC?HqZn&=l87ibX>AAf`z z46u+_20Zn3_rF-p+j@ge{FX|$ULrPHOE~?kJDm$lvXnvw@FaXkA+;A8Sx3Hp5XHEr z48=OzB%wFTFsYsg9ULqtnX1;E38sY6RY{_Ts1GyKus#HZQrB;=jG#Q?e>EdZdfOQH zM}(zauHML@+dvSxFsd=!@JX}Y_d+R&b1+Yn6haeQYM|4JYX~$on_xa0`j-HjWnQ{u zW9Q_$QY~cae#ZkNqYjh}{dpM0=5-h(t_wHli=Kl+JhyIz2*=%t7&j;8$W`aaHs8@d znPz^@(py*F?FHEz?JEluJ{6Mig7ormd%>v)kIAduKB_Gzn3w}ZLXAjb_^h;|kls>< zHEZR^J;Ns1US%yL)f&pNK6AIUdnyaqKv}i$K-&PbGseTw&77@JVkk|Ph*y6+z;Io- z?ohIYB=+AzK>I0_Z1K)r;uHf%D<=Td0>OFtVkPeX;{LFT_Zah+OuT4*wc{Ks!3GjgP9x=U-n1POYlI=?xL$6f!fGEy9$rlBJmD) zmL;iG+0~mu$zNSdrZ}#zbd%#=C?}7B*Ncea*@)k2#mlANPif1@H=>(xzgB3qc z_`CZ@Qmr?fo}%_U4@EO6Gl-`21qVVW6}+{*z%+iJG31%BzUT~?(%q>Lv5PXBDb{vk zKyXkWWef6{(x&1s3~3eRN^x?+a~eShu5v4YK22XBG|&@k&#)?>W$RgluOI$=v{Y1~ z<~|c+t$H(v$DpoHae-0EjQu@(yI@x@j~}=5J zO!-0`K>sGH3qf3$TODb(AO~S6@vR}}rw9xpCVDb;QaxE+96lhST{f>YEDQ999!;ik zmhPFrp<5A`4GS8sE;U8qq&d`6+#gh7hGWQ~Y;XR}Gs1aZQ0kF}$c7hLsRRa*>IjJ- zISP3fHVBm}K!uZGmuI2I{qNUAEHH-hHdnhc!+BS7ooi6-DCH)l^ObC?TYcJ=f$HVw z#gg`x1FenKxi@SIM_P=vK&IdU;*jzlz^&RWa#zx(^O=zT`FZmKV7IpGvhyImwKdAV ziUyIF1-n`LYVJN=Ftf-(xI@&z#DWK>Q=wHt!rF|6(Af{{K&LR`{$k`rXtcS(3$+%@ zY3Qb`J;nf2wnWpjuKJUnyrw&Fk-ds->g-QgtI+75BrKi$#6ntlU2!{3-_YJ_|$j`ajo|L0~ zPiaR({q_ge+cfXxc=^$e5Ud!sThx@>Qv^6=)<#0iG({r?#RJIlXlsvio$wV*aH`BX z(>F;!JxvY^><6@o1sK{9I4uR8dp0HHv5R!McwL2TxhDKx>Op#CH%flbQv6HR0V>$W z7iKz$VEhK8SQ*yJ=!*P73k@Kr=gUAyYD65WG1EmrV0d4V;Uk#P z?dR`~oH`y#649mgWa@ADMcsKW1~T)`N7wX_GhR3BzGZ!nkl&VkFzRhb%X$_O$(Jqu zLjL21ck`Mb&iXT$EN!EeDVlHUky}`T-I^3C`1A?vdIh7e`4a4*y|6nMmmr!d=}VqQ zTMsyLjew5#e`6<28!wI?*^MxLnXVUy769A~4iQ>m0NNoJ!*FTc{<}!kz zTD`W$9v;8Cr7E^Q!`uA)x=FKoqi)E<=){sH;nqJQwLoYGCC(C-2(rBra;C-_GXYcS<{ z%UvrZ_Y*m6Aw)n_EsZd8%YX39()|X?fRk9dnIguwEs1o0P@u?FsoV7haVr24z`s|O zeuW@Mvs>{)5<}EJJr+HDvIKrPi>+`*wP1@(6sCxSZmU{^WxH*vY974DS8gN6TWFZD zafANaS-@^~-Y&qVRxaSdYAkwHgrO@;Iwga3N5=(F%f;>$OkB z5y*NmhtyZPfY$B1wtuQ(*>orV0}vk3QgNArmxp8eMK}g4Cd1$K0*|SYEr_AOTiV2J0hZ}bG4_AWJ&o9Az@o&_$sue z!7bV?Hp1$jt&{cSYXar(}xAU#7lda%2Ma z`C4#vVPPULtlj8jNJ(-@m?ORR1+}?8N3Z7GbUqj)Bc)eZ>Aw5_# zFj9i@?+vT0Xk*#w>Y~pEakiRMPl`TYv)8y|?x*?Vop-_9^9g@~uEJ@rbl9RwiU9)bal2It8V-g?g+~@(5;+OP)O4b~ z((!WqltcHPSo~9f@}-!J<9#=L=k^@H#F+z=(iB5TyW;@Ad{>sX>eI2d?N0R5zg_9Qu6%|W%>_o?=L^sY#eA`mftT$#GTH&hCXU>-Y$)|&S|S|DT->lu{{UI zzi_!`$-f}^LCSsRW`9y8SVnN~QnFl@A__Kq`6mM}KKMB=e&Oct3>2{?A70{~JEhfz z(xoVaaOY`~bYDo+_3FEr|LjQI{a%eklBmy|)TZh;aQlot(E5M8q|5;PqV~TuUABCk zDTo$c&%0-apuV*1(f1+c`OAIlMmDtaLDy}pACVm{z@Dz&s$h9|kfr`TiWg_k(Q_`| zpx|#DCAbaZ-TaSkzYbzu$MDW|^vCp~qw&>|yhw?Lujz`+eEi)0^SQcrT~^OjeRsMh z?P^JGIabKd8p~g z5WY)Yoi@)Z3kv|(uQM?J!es=Ii{?_Ge~v8nf@Z{y0Lp0swPf2}#`)P*;3F3>PbJbt zA9Pp#=J(c#<4Ns`U*^uVcC*4ygw!jL%Pm0%!Hq`KMgX>g#sz1A6+}040k0l3D}$3k z*BS8xV#0n6;a_6?C0q4Nun>cy4lL2o>uY;6`Hz5TEz7nO9ZP5@6xXF_P??BMVQkU8 zvaR(&mdb(|bo=2;($M0VYw(%MzzN#>*XrCEpDw=i->iSmynEWV`axxl@&`xMAwOHK zZXdl1Xcn;_r7d@N0jU=>1CpjrlDI_yB1brtBj3!}(8a02nFAs+ZlL;nY;|CtRkTR< z=`9nfpxDDJhxal`n?(4nO}dthjYI1V(rgw0khTWV0nP_wE}zS^`}J&ATzY7DKr)z% zeAaRqf2VP&87atKyaJ{O|6=5Yhf9JkUV4QZ1A%a&wIA6>P9-Am-ZwQ#XjcmCmfU5V zpbbDN4(%-rb7czN%uQO?hiGJ^LTNHe7LCxW*gri0+XHR8zPB}5lC#3gkHj}k1qW4X zw>Oo>v8JXf+OyYf$SIO^Nc9|1?E4H5K* zjuHm}+8x5k9#U-+N95nFKakta?_AHtS5oflS6a~v)xmq&v1u*?ETinvHu&Px~`Es{-;a$4EDwCgL?0e()RZzA_SiW1S# z-1*crsNxanEg1=?)AYUpq6?YI=)Fyn-yEm%MS;3|r{(mAWjAZ{K$KU&89o+jDsFYx*37+FW6RHdqOj#m zq+0NrfB-^ZuUxscLH@jf2q;%rHC;{_kl6Z*rF?Avn3d5LW448`T8WDU8q(A6%tV)k zNbUuxebsgMTr`?(PsXR~317skCwl^nx03#}z6a#6Oi3E#w*&*>$g!n|Ij_jl?Z2bW zd-pza*C9rIA2_!1(@bz{-_TWNG5)gQIA~f}pWIfpQbbD)7+*M!ohYTfVphT`DBt4J zPm?V$dkRxtn1a$q$g4sd#j;#Pd37-TJ1I3n-<1yX40K503`9EJ5QNus@7iCS*0wBR?e)64X zK;`K)K=j<7vWIY%97IzZshf0K?=8wu=YZ>SVA(4|h-0|hGxMvTBM-$KPT0=Od8PWK zAKA_%k&osEP`5M7L50E0(Cy5#qT|K?lx}BEpQwncI=P(*tck6Suiws?pK3^IB5h~% zT2ol3w-aSuX`GC{?ZnkAZuSsmhdG=#UclRqFKOwnbPvW3!u!16g}@!erI5?vS9cJR z*J4T%b`Up+<*7G!5b2fV+qpZ4JJh>{_jeG?2SpEe5XFy5pH%E1{;g`PdA5V7ZK;3W zuw$#eiQU?{V~h2otA}H*{dTT*{8dKCzz!mOG;$_p2k|9gnYjKcX(TXp1C%bhqezy@ zRiN%DsupT9@jHq|7R3&wJBo)Y{Hj8C6li1QW2 zRsRir&Ar+u|IKb|!;7XjJBZc~EZ)vQbuDm~`?lR&-QaFPhQxOe!?NSpo#~y^nAMrr z-$5+mmrQ=`xG-NMY}#$d+AM$*#1*#FX%DzJ(r-r*6^IVmQN)DfqSbfC<&*|d=k(6d z>u2F}O?GV1&6$Lv9fVz}Q?=_3;;u)n_ro28-{Zi4Lv|2N;VqGEJ1%0_2``8{E_zd6 zr}ys+6!{%>z67Yt`y^5V{Sv!(Ml72<&|7a#ubLs{7jQLhf&%w~?7ze^doGUb%ZeuJGx-Z5AKUF%K(|X-Xi#b zIB*Xs%emDsbWen~(Q|E!agiVPF}!{5K_rB)za49UW@XfWrK6o=4u5%GGX+r=S-A^H z5sd(z+Ft33Dq5*Zva8-3Dw-hi#d8%R;XwKyaZC)JbQd-%>9&hq!_9u2sVs4<5JC-l ze|>oO_#{zUY0-VA^pk)~hglz^*k%AYaOvRih7U_8w(mx$J#4GYe{X7t zddCB%l~bL!=pA1%biW9Dnxcex5HbF!H$$=(WZ{U&yL^_8aGbiY+NEp;i<=!Fi9s*q z%LlZNHo-`a_n!V?91^q>(y-&xJu2&LDAj^l<(VSso5B&0o7zau9ItA1^|iAV0T;wA zugqVw0Cbl~ij)XJ0^wNVQ@$TC;`?yuInSk|o?HZj<;caSVVz9|Ixm5sFYiW~yu9?z z^pr>Ibkn0#qDxLW^(Oz8M*pA-8T6P)LcIqAFdzzpmS<+YM4j`_W81$MyZ)i@?x|Ke zbp@8tT?+sG^N+$2j|zgKhI_o8+mP`Y~R(2x&qOPa3QxEa$j2~W4mOn zU9!I*83_Vx9)QBVfO<2vbXHiSd4D{^7PudG?0scN(t;=cJ5m#Mw=$tNhE#(r%kG^E zj)7)+f{BFBtiHRj-$>dXbU^RFhY))bL+-1W#kKh=2935OlZHo|%xR zVq7`ifIRrHTzzD2c`&cf-0wH-4?h=9mY0~~M3Ghcv-5){({yd5bBUq}roBj_gI{>= z=^%YN*_rpKY+-rQV1SI$G2ujBg~cDp^X^q6K;nXdl4o;;6M%(lu_23#&@N>SHFH=N zNVW%&ciQIdI}X5HvAIIkJrU1BCbYtd4;0p>=aDUY_+_U;_8VEj?fPP6Tg7D@W`;6% z7wMe=s%NUwCL0hBf0(4S$Ljy2{bHHEBI4-2hn-1ax&@Y{(m`*x9@Ru0MnBf%nsy@` z`t1qX-Jit2T?@)x1lpimAE!~hDszUjvj7bJ>@`!LNN=~oNkNUizIs@>t30>X2e9<# zmK&_uLQ%GX-lR%*-e-fs$a^4cj)1J$Bc?D1k8UST?mn{)PC)q+j&oDX#6S4xWP9HJ zCTIQ&FrLA0o_8(nz(N76fyHL96eVCg0nqc zt)^l^FTlyb4^E|v<&WQ7vaRqc4rLHODcM6#JBGYVuLalYzcXS)WUZAC#)ag3Y_}yz zK7ajnw`>~$Z3xF$%SS;K;W%~ng9cCTp+ts`v(m)N=EhvQj6sT{r@Tx@oqPol!CGwv z|GDV;m6k^c&~^cRQ&q3Blf9g0j${n%y7#mgx#pjjl7JwetH?9aGGrc*OuZ0#>IG=k zVs60}51}9lbZJ7`6y=9lHcc#K)jjV5T{6fP^Wzo2+8A7iFJzomXUpg2e|;r8M!`#C(y9vvX@Q)%(>JmvXc z4HUV+Z!|Ys^w~5U*NM=P^Lx^B`^I-#&r^NOr!U>CzKTxDp?#*W(+<~m?Dl}!qOPQx zDZ)xo6J(_gSKEn_O8HTcXd~j&MKaO7Q=3zg`N}S(Jt5!hQxq z9F}fj9ug#h*2?wB7JkSG?t&16jB^CNM6~JyTRSgen|H~`v@>)b?gAgAJRUGFR*(gI zCq5Y{@4ltt2Fc=_u{-hb@o_<)D!GRwUmk51)(g0BdXE8HF?)^>o9FR*l_ydzR>W4R znFrtE0hFE2hAicbz3(Dg*~5Sj(^Y~g*oM#q?bp5xnaOoRQ~vB0xh~m}sp4)4 z+e_YbBL>)zc85$L3&jt!^cUDwzlT{=efHO zWb8alP^CF&#Q&Hrntr`dBl`}`{+CLwQB(^Z!@o3@YUe;zy-Gxq6IM+MSbgr3rZ?clPIhI5|k|yekm!?j7Yq}oh zm@e6zghRM@jA?FRn!%p%LU0nsGY=xHwyNoXYZX@u%dK9-Yj$w5^XI_$C9v%ITYw<6 zQis9azQ>L{w4y}qRM)XIq)ltql_zoZu&b6Q>7$FL9m=%+HV-|+)s7CFElzVGTSxo z52|4vB+IS@lIgV)OQK}UCLyxbKINXs*sY1LE}s=9F|cJ&q-i{6)-m*y0SG=!}*m~?WQeY1e$qK`o3#1Aaq(JBTWDQ zVd%``nf~KAzV9|OGYpH-+>$$YuH5&PTuE*cB`s}|9GjaVDQ9x$C`Bb#VnZ59b0k;H zkz~@y4@La^_xbPhc|1O!_vih2zd!Hi>+Ol&{mt_e8(=K>gE-hF3lVM=hHPhoMGS$e zKU(J7rCKkX8-0>{yS98rhK*oQFK%tN--kXtG*LOo%`ZMI!^?2e1nI30i(E42!{MA1 z*2^=Hb13T~kB&Y(RN3-Nkivx8!>fHlU;!WKW?HExVYh_ootFfguW|5wc>8+mInQiOaqW1e9KcMB zV?_~wtC*NGl#G?k4MCFXwsL8gXOX<-mm*j0Vv8NB9$Wb_asxJI8&P5#K;W9G%#R#o z!9>2no-&)I3qT=VUVXf$YH%3kf^VDADqoZ+M7;{jH%79`uM+jGX+}!WlM{tXhlz+D z%Q;G&VOPfYwwlA{r+c%%tMPT$l{c;zWx4~*+)Uqiu50QakGBPG8%ZgQyX#)G=3Y4d zqmN&Zg{5?n*6KrmV$l}l;J-45Jz=6YNTBHz{PDUs3rW;vac3q4r`Hv~;G8n43SiT2 zPYUF!zgFAe%kQIsiD-@g3ImtQjdQopad!)ny~t=Cs8;TYlT|-26HeK|Gkpml`H%g9 z@E-yln6t)_Vk~h|Z#`WD@qtuQJ0$ApZfcj(FnjM&6{m$D8s10F>HzHU?7AjczemjAg(ozz98DH_QlSUfU<^)?@3P@9 z94=@vSom?2S%WWpWO>c_b!FlJ`$;bL&QB3WM0O8*m?c!sRRG^-TmXA3DzuOmr)ff9 zBp7n?q?}rtZ6;eZWv;F1)vqP=svKovp<=E74ihi3+Ur^H=Ox(zw#2UE9^%A5dpyZt zHo=YU&h8CA$_i=uAn;0Ks#xQ?OV)Jj`>7aj2DBt4BIs1U;&@xKIo12k2ziRCk!O6 zTrpwiA#=lfJ#Ock&zuDtxUMvF#qFM*i-U6BQX`**UInmc1W-&nJm2`|x;WIxQx{K# zuz1$6Oe#CWFaN|CcI?gz*+v0wE7hT@G$BVxU#?$i+>!}Jz=~$5yWG%0+BF6PQbF$m zG=g=V5svb4o3w1 zd3oU(+mM@t%l?yjnzsz%p80B<~efK*Pgi>p=Rz2#iIQ1m=#k5&OP`&9V)9UOPDb@AS`oCSHHGlARtrZ z$oK3JLH4f&Z%)N+9OHAyu89wuIh=`2g5XH+EukDfW~il2a?T+kn?nF=E_+MtTIleP z_-Sd*pbC&++#gTLlezf{@gVT`tFsb3=4=tOz$YcqaMThk2pHVu(!$i&hs*~irZJMw znZ-H>`P;Dnj@|FN_DbdAUO-Un+^r~hS7Y?Q@H$K#u74kUN|w! zq3~cz)HX>eUWF)j{Bu*=0Wx8pC!wDq2*Vf>mwsTjrH+A}Adrj>&uSK9Z=V6OgFLTazQIS$zE?fY&O-kFOq6B^mp%x4UoPg@`uE>0w3_YwV(AHF zVr7@t+M6n;&ZX!Tr?fthEuNztcwJLe%^QT>GmWUz%yk=^G)KYDSqmMD&lDFMkGVq8 zH)miq+k3y3F+KM228sI_gQJ7vXBcTnG(29t5#=AU@^jj9BemZ5A6_7WhCIl|i&DJn zPeydVZcFfZbf-d$h6b1ohr^e~<|2QM%h4H=x@qYOu5<`0=)9x*FvQ-3+egqXXIXQc zE}G-s{V(soZ#kh+N(rx%9-ZJ&PX%jUNi^MUb(L$OJKF8`>fvy$a_u6!H)6xC)O@*> z)LWhT#xFNL@fVZY#noR*xhHQ}ibQ<@1$VuBu`HE&zIAR30xmnSFzMmNO@;J?wW*w%6spf>4b4mA4q9u7IDfCim7GzPM!KkMvyy% zYsVPsQ#Q!PH-i7_J9wIj;!yEab~Br}gFb96E&bUdzwCnJQ7jg_}IRezerB_#LM z9a?iP-sSXM*|r;%NXZKmJ(O>yDl~CS;BN*xTt#vdJ6Zs!IuXaG{3<)d-crXgHY-ZcXOif* z%-dbIMtg5I*>1r%`k6`Mr7&;LsZL2+oooSz85-m5y>2qvbV`B1qXnjn|E`ufxvGHO z&-4IKp{V(b-mA6jT?uP!pYM*F%9l*zy<<2y%PX1aM=~!NmtxL~;Vv(&hYA?+R!cD3#Qk^e|G-MW3ju<{hoVieOxcMA^FzX?l(>TnWw*MSNT3cs_L_3 z!P?IK@qc`sQ-P*lc7^i%HdN)QHwkQdJSNbq#}@t*mwY6l_Is^M@twEQL$=`hS> z*Y3k}rwTf`I6#_lMkAhCKiywMyDFS>nfrmCn`JFBr$kek|b{3 z;jlDvo_xkR_tq+U;!L!l6Cn8Y(X(!nW~-VUnA2v*FIO$o?za`;+55QwPSDq+ORU*> ziu^gq?7u{|POCUgm0k5($v$@FPM%bm2uov&&pk{&`)UVN7MJ~Nmv1rCN$qU#b%{)k z=B&+uV3>ipzJ*pKNYCsi|r7ZYR>PLd71w0is8r_Ve^auljer6xTk~R z$7dtDqAiHoS1jGTx?C^CQPBE{jd z4{!+Xy*sh034N&3%!MwY`g5(?K7!|~nj3p>!V^OE(qM0KS2$lvB1R#I6mlfKoL+u4ZcfCI9 zA1m<8SL_Qd^lQbH{<y{2o3_y|W$!bgxx`3(&Oc2Vd3Euu8Zm$m4SQTbvHlXR8Cenz<-7s~S}>#U{H>jFYE zl~V)77TuPn*%i6?vXMzYv=76=b^}k37kdlWt3I)OL_|}3)6a5O)Hhe|?luC30lrn@ zg(8#gub|P)S+SW!V++_&eP{fM)N^qL(g}pjJe0$;VCVe+c(l$Gftz{mna(tgA~G(K z)-6c*jazjjL3DV?R>F!m0+tk$%nvra-|sPdQ!9VdnPXeNE5td)p3o*h*H&Eq-NGMV z`Q47ofyP<&nE|%na{1aSd1RqX!7TT^7mW{QxBuY@KX!f>db!JSHsQxRtG!#-!p)48 z{DLprZ~Qa)S`}NC!4=wm93?+XSPJC&WI3BOKb-a_wxW#t&Xf0H=zj+{5z5JQgtct#mNd z=^e98VNt$G43*F=iG*f!WM$C(7XhhAXEcAK_=Dzy6$4X8fAbYl6I;%!rf&rp=yo+_ zDMZBdbyF#m(N$&k(FKG9yPyN-qlm8awusRc1Zen|=x5hzjLnKdtR+2oJYOOn|`M`eL!BcY9r^kR|iAlHAAL zwhqC~PWqHLoMtWh=eF2hO6-Q;W{GivCH_j?LAkPXe)zV@fW8J`h_+}J1I9uBJNhdY zGWz|OQo*kkKye&AamQZ10zhKj^i`cubt>}mZA4t^Y9kWb4^pGC)g6|4 zO~c!;#`};!N_rqf@#P7T9-qU`XGk7ifk4XzXnge%_rM?OvUWnCnfeRyK5Awj)iF2^ z%$RKc2v%pi53Ur9)UWtjx(epK3sURnV*M9?!qjs2m&eC@4K5izqOJ|g)Gx6&QRdY) zh*mKL?Opa96O@z(`r2*zYRPvtoFsw`b|N=PPh`VGSfvf!aSk4uL{m5yYewS|@itDJP5k%9}$_|v98vuK$2f2OSRP?sS;=WF9Hp2oG` zZ{(BCj)=>dj^8#21(k}m$Z1TkyBgX6FcUCeifOx-1(ktH1pvB_7n#^%kpVi~b6>%= z_%CQFgd=k}Pz!m_Z>akTxOwh?+1|}-@L~jp=*?5s9j_Vc(2HR5xosm<`Cz=Uwg>7g(; zFbSElFIMCRUq7E1l#EJ6dqeenlA{WP5^eLHHIuf(I#HyU*Z6E7qsT_;P2wK<9eg0P zU0op>#tY_wvgXeSch*~BYPmdADTdOJAyqur)P}Ag){TFR)cdgXlQfzVe+#K$b-hVN zwI9g9T~9aZSb+*lqc`;I%amgqzT&5~)CtQS-T!r}?{(mMy;-T6HBPJc^gxOq~l`M*=_ge7as&k{$7?)WWxa4g;` z>wIejEXO3JvDl*crAc=~ryROibz}w@crs?yeR~YbS&mJ4nsvN(;|`xJ47oa=7~Kc|HcgyLr7pKML5)TtSB}Q=hT=? z?-szW0;ae9SR(*Lv=K1o9&S$1-9TizqKZn`=4ANz!OidfMK#*&JwpYD$2YFlr~TpB z;6x5?Ut$oNay|9XMSe}20*A`S?86JnR(_mJsGWj2WZ090ip2Svr4{#M`}8jIH-V!c zOq6B&t09z)_?3XvP01=>*gc|LuY9s*lJ|pJ`EB~NrSG0B;sMfD+kQsa24-k&c{Lo9L_%C_A5kj5blV4PqvUDT2V5lSQLmuN+H#^PkUYXNq1u zgusA!jU{v#ygB=)S8jKX=CRbq>^5rJ8(y^Mm`!Yr=P%9iy+#opXa{kjszmWV2ag@O zCQ%xSN$wFUg~>7xXoA_mNc*wYU`lOpnNE!34ZpI1{A+6&6)*i;@{CbiuzgBX@Nnbt zzr{!Qod@DgWoG^Jsxgk=oXE0a+Rdd}(q1iM&vEbs-Js6xz6jGtt zlO#h8)=k_Z=9Ao5BRi8CXN6M}(-lxZn}KC|-NGfkm%gGS#Z?p_xlcZdu0u$i3SuK> zEL@!z+HcXCl%ty34|{Fd3rv9Mbs^?A+f5RoIy3~WJUMs#T0!WknAD-Bh}V|3mR3Gh z9gRK?DUZhfK6oOE3pY5MqEjG_GdIz-89ap2ms-)hN6VLs+vs6~O5VBo+y*`_ilTg*DJo-YYK*Q(SdQ(R*PbmekFR@i@ z0?PC|^T1KA9_-f)rB3Pvj{c#izFg0CpeXRQ`v3LG)uaqPkIvF<7wI_j_*Y4j>UPX4 z4Y7ttvlCC3n&Y*Pc3e`~}wUcuCq{Wxb)P?`0> zuF=Te_Z8rVump>zuYALZUU`?eiJN#oKC9zjnJPysyOh=NShe=CopM`rad&-FMpaRI z`lyLKtZ}ROLDZP$uu+Lx{h{H(U75A4`cMQ}zl98aaog(!zm^Zn<89>GC|Hfm!R}3) zOb>K{3_I_C&yj}`JucXe*8MLM?>`PonP6!7z5b7%wo*1GmU0q$2;)gDk9V_0Z9R<8 zPbYrh0-FbnpESlK>^DLbI$tpt#algtoVaVJ|9b>Xoa{Ml+ zS!3_NhM5t5WOUY-;XICPz@aD2SD|*mTDjP-z=3b7LnRW+*j}1g$-b4kVQPf(1g`V~ z)WutR_mfbckT4jY9gG(J^f*MBeR+ueLie%O8+?trGz>a@ROU9PFeOSK(VBQV$lqnr zOH!1`C$S^3k^4rF+t>0M7j5)Xudu}Cf>byrgi<-S144unW+>NYPZnjJ8l?RsESVA3 z%cch|jhpCE+Qrtxl#M&&4h)sXY_5(qom5runz`b|Y@RSfEXEp)UxyUm@hXH#4IY_U ztD4z8b)T7&9bzSuy~kSeE3mL5=VE7(>Ipl=rV=^;(R%=GsRGW;XJe<9qiTz4HgBBE zR&S^Zi@-FqwceI#!RljKs@$ZT)$NBbEtAeD>EgX7T*y7*d z?T1;eA7`B+Tw7nBa~-Uop5VJWxFdNVEqvE6xwW)K78F~7c2@xg_HR8V-pvb29+Vrm z*s#&>&c3k`q>!oq`k|3F@;{jsU|dpmctdVS=Tp`vPcYkKT(H&)bklt!4))@x8H1bR zt!7i+?C8Mivun0xom@B&02WdY?ct&Ag$r_STFA7E8nYHZ7w{w;7f7 zyQ5Uh`vRqK4h7B;5yf`b%ZAq&r;xyFBtYQS6xIscgAn-0dJf7eIc7d-bo}D8k{x z)!l%JDlrrcsRB*=Walt2m~4R%yKC>Vi1rcnZbxyPYIWwC7#KStwwu8*Kw7Y#=Z)Zz zqaR}f=pBOvQZ6gqofQ+ZX5MOg9_@}&F5n8s!KIYjpEs(rV^&NL6{>yzASX;W27p$x zdx8fYp%%SUXWP{Buc+Y#P__B>(e4i+=Kta6`8jepOV1OF<4dc6=+<|*4-5!*spM_( zlfk9Gf4%Jhcz8ICb!oB%ADT4LmuW#u-XirvP%`SAb39~;W1pH%z7-klLWnP&f9pY*db=suQ6U35Jbegp`m@MWv;;b|hB9&VY_1azrOt#y zQtEp15$HTCQ2~9_jg`j{2*4c{4z^(WVI3KwfzpaP4c$;bqDhkyBGXkOZf8DG*O$qjkZ^8|+i z5QWXNV!OG0Lf3NaDe=rr8_-n_YFc^_%#SNjuVbN+<0uof>L>|KC2!9wpSjc~-A3y{ zP&e1Be*VbgVV_;>ItNBx%cD0+<5OYkq zhIrBPC*H4tH(^j1L%5-{6X|0@7)u;lE@eoL@oK=N7BNjZ zLrt|jkn#m5z5Ss{_xJD17E|-<>-E=0An$QE+z+*g6`mw}IY<8J?6*E96W`d>q0#@L z{w4Es*y*X~QnIbndDg{@Q%DO)#Aj4yB-l*fOq(LEos=tH+;Ad50RvYw(mxky=dN4! zh_$cbL**DyoUh$a!zS#UJ@{JcUD`!B9_fiMAh zX?W+khYsznB}EPH&HGaB4W_P~E^ZyQ`MvqhYv$?-`ADmNlY)IDRKNRr^%&O5`wToN z`=55g3BIs@-0HkDlK&+C>D4Sjt)kPu_jzWqDR`yMgns|`bf3)8x@0(mx5~s?tGu1Z zJ+FP?bVk7L>tjeKFfsKP*~U4B=#m)=I_EJU{x+e>jWHC);I1(`H{SAZ*woLHipeUvY^Q-OU?hyqTOt ze$>1XFe~(TQ}FqqC=T=?4LcM46p^$5?~5rO8I*tMmDQ5o=sI!rkaqIy@94U3_VyFB zAGzC&8bRCI8RmmbTE3;4AU}nDkdhJnOo)CJallvXWF)C}GT%Lct7P}Y+k9A7^4H4+ zH~J{gXS(&yHS$`;-rVFk5@$`TV!O_*EjOf-=P0O&jFf_M3eWCQy7V}LI5W`#!>d6jB!KD%;*ES7z7!ZLJb^Hz zPyL9?vu=(A{wk^nUywDjKICNvoGq^Zo4?ds*e^Pf)AtQDzEg_V$sL$I{*Nc&J$Mn8 z=3dZNKBPDy)|bvX2tX0CoWtwhQ`;j@&_Pc^3@pM|yOsJA!j;ysh1OUHlha>QG$B{P zCpf}}S15y8su~(RQo71do>gp6(o&$>w+4GE)PF{kBgx@?3CrOYEo!bm27L8C0UsDt zU;2X4ZNcYu?v3F+jHCRs-gn^OGlOBI?5ES;3)4;7z^HNyx|qMq3E`oP3=fyv;5P_^ zU%WpfY2t!YU8z|R@l)&F^Wh|y8#D>ih`GAJoDVxY@Fh}5wq?!22jsC|ISD&(u{p>2 zDb&u<0_WO1L7Q+1_|A?_zp)JbL(>QIydWdx-obr9fK#yQ?`*QHpd5XCXSRN$iZeny z_O?Z@+-5{&y2D?!>oEa+*(Yyv#3XJ?k2(rjYv*-%I@A_=g{N zxb}tb(!mwRNKke+7Sk5^t!yw$9OaqYbZbO3y5^3GI~tExb{WcA!i}PXlYg|hB704? zjRONM=Vmfu2Dd{oYz0I}D24azT^U*2(tz;V@L5~^%83)#x={sM7r6YNSxM~5r;x-k zN5Wf?PkJ7~)eFF3Qh6UhT^>EL7T(^Vt7;WxJL>qnBOF57|7Q|I4#RrQM0T%Xj*Kb3n(x{WSWmb&&Lahw~2>c=p&Zdi0QMH#UYwXn(7 z8046XsTgy5nWdee$v z;GE75kHgND*i#N#EURN3`YdW)WtwFE%K`6kZjC1!8aCv|6|7bBujzjWm&0Sl6T(UB zTj{X??cW3;GgOH9_B|xREUv&Gh#%(57WiCsugu6mhr#K#D6}+j-lAI}5jF3(EYOT7 zs`fo5tKb^wYELcT;CWp)6YF`D0PLWMnwcoLd6HE7vwdok>VqAY@8ZH@Id~XWmrdCn zH%?W`(Wy+f`W_RB!8?+Xr`%R+4TvA<4!wHz1_Y37AX+-COo}nxRFWnT!yw+p>B2hZ z55Q5aeJ^d0&Det>0B&&y5i)Adkyms|GYcxY^ar=)|Ds++fi5ceqfB zNA+6~9^JGCVNt2$mOlH7#hr|8haU5pUYqmsrQ++n59mg=Au<)zw1L1gG@9yePBon} z5qoU_bKDD=jY%+uCda6{#cRcyXylWT*&(VKJipyPoCpc_#M7QB-{#e%buX+teyQqZrDDkIvw=0)Mhrp<1t9az9gP39w;AZ{PzJ{WX6(* zK^zNK?9mh;PPxbycPj2R?0L0`X=rmcTd*lO*7HvgU0UDN0_yh{#{JEASGS1!a|0@^ zF}<40t2;CdN)q#32V8vY&xB%n0y!C=O`ctGD;W!jcMcdl2sSa69Brf?EFD*f z(BK(3Jc0MNPcCF!x)(iTbQv;g8%M?$z;6V)1`m%9KQA!w1rh8=3JDa$o&oAQ+ex-{ zRoG0FV-^yp4KNa4-D>F#y||kDoWS@#sI$eBk*JLg-CmDYXI$m*JnG*AnUE#&OHJa- zhCWjmzH%xS?R|W@SIy!cF1e-j1QRq=#gz?lwTFba9$7mKqhv8*9UM3_5^5NF?*eR2 z_k#EmQ3tft>odO+plP_ng;ep3H&ik7(*JmNl;BlDj)@89)CsR6Y)@~i;*CB`{haeu z;EhY_BeQS!8sRni_5;)td!*CEginzzRrnn`03>GiSyc&&?-)r%_Pt+pqVFG1w;Opl zAC=&NY{JF2gx%s~z6ML=9dU;fewJt+qL77=Jycvm-;d<#AJ(BJAQqHGxn13{fMCFd zh0cFUMJ@*}W<0SaQpc>=<#Weu^O5mzeeRCx*k^VezB5X*cldUXX1;|YpM}4ub%Y1X z1SisNk~_sC&IS4F)*AuoWp2mEBA#efQ*=38%-pZsk}d0~a|L!at^nV~V?>Pu%Do!j z*u6v#j2z31@{Vz%yJ6Bk9g2Y0S$~+I1#nQ>O96^I&o}qv#5JdV!NSY5Pm@+_DqDWeDAK|d4x61;06N{oWCN95eDxBqy?dyx#(Jt3Ht zC((gAZQ(Zpe>%?-u1kWeYS#yOd@DRNwK5T^#6d>bF!2{g0zZhlw2whag6e#!yZ+ zBuoWo{E>^jspMn1!Vi;TQ{1dI7o9Uo0Qsq7R>%GNLjfaGECQWrfys}mf>zr((vO8b zI}N<>njjou(n*?T;(sNdfh;*1gnwJi$nfuPe-yeJcpfW-F5EuLHM&ard(AB7($`%` z4D-vzS6_My&d!pq59z+8^yPD?q*=lx#T+?<$w&xa?o}%!gqkgsSj!>)-1PhpHJTF> zp)U|%lGP&*GD6B#<H z+WMJ$V%DpQ908B95B)rg+#!s;%^JjPp!xCBXXaxtR9r+I|@6d zZz-(}jb6O4)Qqd1Kigxgm;$W&;kJ2FBO|P@5PSGMkKQB!8lB_a$mJP*Y^i837zF8S zRd+Vmc5yKZx}Q=rk7N|hEIn9^7rIfzDreL?Z~J@q;BNu(iFyUrk-jpC2`?6kQJBxM zuNcg8R`VzJJ==Q1hz#p9f0|NyLo@L-%Md*l*s{}DE^EFIF`XB~gLFiwRH=gzp2-RBQtn{|+*MCz zr4%J5F*Y0dT*%+-_YH@j&HSE<1P3u__D2jXt7v?qs%a;7P)D$0qn6^R!YCA?Uq@<1O zcFClBKWs+hx;ZgN1t#Y27WXwou|tQ)&fMOgj4A+0C5`=&qDJ=>T$=oBq_{@>Q74Y| zVT+rG7}sRyz}v5q_dpa1tf0XdiLAC7Wqp`?*-E^_7HG)`fhDsOj`5fq^)-e^%KawM zQnIS%`NNltbs4W}asM6Do|4JY31Tc?ALy{p z$jyedsyRg(3}b#RLp{VZS8O2oq_9r4F&dU_GRq;4cpD#j%a)%fN+Qz{Y=>)(a(`MT zEZ7&{xl?Px{}yLf`0{6&3=X86)l?#ToOlWo71&DJ>*g*Y)OEi4O^lK;d>r}80X#q9 z(O_R}u=BuswW8;BDl10VT6W_(v%1i#bwi52zF4GEC)~;U>(%nw0g>0@FONEnJ%g4{ zT6SNu|L3>yOuOl^$~QE_Kbvfu8aDx9J-#_0YgBa^qH!)V=*`Xro9z`K^lDAoZ}fv$ z(af<+qbDq(g)4z)^t;(f|6m++i5`Aw`4jBo@u4l zLqqi--xZ8?_7dSK132)tHkDJE^kjz@q?_Bg-~Y5;tj|!0_jK1L+P;E8Kc7UWf9-@u zYaX9yfjDe1pI>Q{);~~=^-ahyqurW{W$)qbBQf^B_qsVClb)1OtX|S9DvMS}Dwkf_ zUpP0f7566K#ediS43}}5N-rT}CP4ALd$v35$VyV)w=iG!U!bA|OMq~u_Sm~_XAYXR zE_6BsZJHRQNVrHc{3wvv>B;Squm>RJTpSrfe=y}quu=n@0@cAX*)`Q3_=0{eQ(k?b zuPkjEsKZk|x_Ivv4}N86b`16$p9>d+I%r2E%SQjq9kXWRD>LReJ-5~kvZ%cX7OsLo z9MEvS0?q+(vvS|OL=95>*=Gv9^-W$)7zOp-CucJ?P8v3n&(@-A*ZzFnwnsnBZft^_ zr75Y61kFKP28Cc9^xERR^ly#n4k~18jFi`C`y=$69DJ2ABN~4skl^&$ydYK*6k+Ig z$V*0Zm!$m4=wI2*5dQ)9{uXu&=XBgjK_WQxq@?P!&#?{lzEX-JSvMneL^C7Z9qNJ3 zq#9n^cftabC=Nv^!er-VggR#kprl+>YPLd@`rJ&iK+int+l-+zoP~Y$pCI%Dd0#uG z_eNSB;`jz9Qdb*>8zZjPU0+C>O<0D+XG7WDZ<(EVPH5y|XlQ$Lkq(l1&mL(T}T$_`GOcwPi;D!aRLs_l0m?A7|(b1QvxrH3=;aJ;W|{pX|Bt4%YKF9 z$!gq?zjT(c$;r2N@oJ~9@WO@M@F>W4K6e%Tuz67cbBb(>eCHesLXj7arCVc05 zsPNE4En?4GsxP&yf3T;6Hi$;X_Y|I5Vi>WGm6c}4p`cdWKMh(OsI<;P=G{#Py-CKA zfQ)ve!3mC#A>;*tKj}+Z750I_l$hwlMA#K^BbuVgBb zI{suFJ7U8&HKJ~HqTu%3dtx!Y3E!(WF5ZjeN_u%ob)-(N>Ls&Ln011}Z#5p~46vEp zKakc|oePQIF&F}$kH-}e6LShN3kr@H9n5=oeMICdUnUrG0wfV3PS9Xk^pK5zyBY+K zQP3P>y@qcup(O9jt8Bw+rHm{+C-!cfI{wH$n>}1^2aQ$4bjCaM;*B3a!^6d)?p}C@ z^5F@CO^U{NNw8nB03bYjm!-R~H8Hbhba-B)7#VM-A1sVCZ=^HI!tQNHApG7Oep3vC zs!c_FjnL0!-~52_&;$NE|8(0#4sIsIPh?L^NLsGX`_${Fvg?=h32CFEaJL+5(0j11 zu&dB2M@^TfI>~K!qu>teBh@N5`jtLf1#{?1`XB}$wjRpYIF7?Yfy#@oMkH3scF!fK zyh4QXB>xO%t!twOb|&rS z&pnPsa$npzC?nyZ)A-Wp5H||40|IaA={GvCxkqB(?fiS|psh}xjb6S%)(_pG+N#_d zrc8!qxA*F!+cZlRo*%`t9lOpCgntQ=L66X8LKy-dozxQtPJUfXZk&q5Ts*YvP|}{h zlxU0zn(v2fW-i#UK!Bn?BZpm&Iib0c@iu|P+?dnT61Gy;E}IU9X8&Bx7Ca{wiNYVB zHo{JFOcMn1FMN;~edfp|U+ZE`5D7TMVp@N`x5AFek}(f(5|1H>6%fmjINEN(!mf;S z{|C6iJ;$u619Ijo8eruolmN-|(`&WzT;!m+%Ukqn3116Vvd35#d$%&9HZAs+ zi;7rp*5lZiqS;*>2W1;Ca=rlvK`wCRwt5P_At!cEv{8C(?IKjknNZwF6`QH*34r3(sFhs{^P5yt*&4 zFl~)*Sdl91jv_oa=)K%)ed_+PruKTUMMHx9>QdM5Kt%fE5^Wu4m~>URLJ}>#?92UaD$=o1KJSHlBS{r%JA1!iBZMaPZEqUU}WR zW&iQ~Ug5j`I4JXE+aJ9c$ZPN1kQXyC$6mb?l-#8Tn6mLrVDEQt4#Jaj1iSzn+R0SnPI`niLl*lWUcSE7;TfI3Ynb|Xq)cu^~!QHJhNG4JWOR|rKXW00+}IEJwNlo_Hw^0$xSNp|5oYUXPzHcSrCpofXrnm zmPwsd;sFTifhUq6VNW)Lt^i6RZ1ktCe|*1!ANO+n_Oz#+gvghT60HssS9n|?F^xKX z7wDH3)pJD~x8*-~bVP(Kh>W}H)>Bs5VchALY6cO4CsPD`o(fk`t`+>3L1Bl3D{)0y z=X*oF^U{L_1iOQ=ewH{;Z+mf*-U)QjvlfN3Pqs_c^gh-6iR0 zhwc!6o|{E(umAfYR{F>-yscvLawtr9YGU&mJlF zMk-bCp0dBlfs*?x>)QPn?pfp#^%v4nLR!BSsgbg-Oh{fC-Mi!2sXsO``gh?L$JG6z z?%~lxshkI+%tkW-8H3pe;UUWQEW{DZlU!KxedgD%yLzrRFf`?NWyHcw$uH2UwtUL?jOe38%gzQ!eO41e)<%ze)hjl=et zeGj4R8ei^3fwVvReGmNj1y0|!KbsE{I}|l2TL-vxorgsW)IQ)6ReZTP+aH@P`Yn}S zA*;>=g^IGm-UoPDUS`J+OfiZ$kk*L;_u8U8!QUEFF2RB|^Rg zTA8pH9IJ~2k0;YHw3F+8;F6KpLGhd9vMWANB_Gbtjc(dTq_vtRhJ*)dH&X_-0^ zhK0155BG0gsgEVR2f% zvW#7}WQ`0xly;GQ@b=M5Un5=ZXe_!b8HSn}ZS#pWES&Jy|{%$|x4%7?4Eg zqhA$wbeRhrrH5h(t%SJ|L(^kwr|Nu?z|TMr+}zL*Sq}OaPtY3cA-dKNR49f0hBX*}h?Y8Kh}zWEsT1FWv-l+HGjOo1x%kx06C!n55KNNcA(cv!XD zl~4%zFfoZ>|Fiono|)szkxZm&xX@56lF=Bjt^!l4ct^ZYG?vGV>oNJ z$y*&pwses5Ex5Ygcb@tQ*YM|YU%@%iH_c2r{mu$MVfNO__w|gR5jVg3ZQq)q8U$T` zr~w1)S)cYT6}ne@NH@0Y=}*MA{%{m1t6c8o_bc*~s?)4}k*M~4G8lSAEjUVbAqH&C9K~84(zwfaqd}9`_P!O z^BY$<4sTmSn0*c2MXQmvAG&$3KH;Zf^o7w|EzaCI*Upa$R9r%&f58bY5*WF}N2IytZ>JAm-lRpZ+{(p3w^(i1hF2 zD<~UCWL($aD}?JF-wVa@=f_OPk!|GC6oY5c7T#a@$2;qO1aVB)_-YByi5XxovM#1D zxj1mX*}{c>;JLfo^SXpozc=gR%2tMUs3eH;)o+#qUQmPb97NYr(&>%HoVRJc;DR{V z92jj1n4JDTn3mAC5|41^^|mw2&wZF7fd#X{z-1I6yzqfZ!o-PN$s5AcdAFZnO;CjO z$2A(Gwux&JP@|H!h;*vxkikST{Sfl3O7pj|-fZg)NGxpPamI-+(ZmRN{D_pgPJWGP z^dfB}%{jY7Yt22l4qnXNswl-C{WhkswQjVJ)&fL9N)9|FFe%g#JBHWZCvXu9fjDb? zf3~`MtP83cB>2Zck7(T(U}+iy+INMb8;Pj#o&OO72W?FOGjMWL`p8}J-^1N!0}i$- zPbfun4npDT3%$FD|DIU{2=V;Je*vaSdgBj21VkIeMgXU1`JD0H;1dD+itB5w-`Hhm zT3(9qKZPMTt!;X^B2lRX6MAtkOq%Tg2&Ju9|B`FeLKGwlD!~To+I1rwNZ!@1jlk>n zt>)7&86(#)LJfcAzeGO6yYDUSF0KkGgKR8A1?Vs47Tl6J>=kgw>1>SVw_{a=GU_i$ zjHzcb=LYZG_an)jD9H#P>f19rlhy>7Fzf}47-RJRBe2DSj zdR*hI&ijiX6HRG@Q+Wc=_YX2qp63C}wj(75c`1Z=!8zOrAX_{`GAbztu^X*q#2rvF zKL`n_t@Ipfo)J4D2Hk0NE!l`+SNw|<+em6pcKj--(wtbN6R#lfg)Fc z<29v@msYbyS1XV@G6wsT*Ce46b`Cd_#e{<4>NkYGAv&tCFZA>eQd#WfV-7tIY=gS$d46`4Sv9ce zrhI*wk4NB$i0^KdiG4jdS!A!n%l$0!mebB0!W^H8U#O#a6Ft5-bcmn;^5*>&4{p(K z{lQU~k19$%Zj&6LKK4T-cwB_b)HU#=w1H^lqrJjg>g5T*v+}hz~}f@6KU$| z`S3X%J7*%^@ZW*|a%=O%le80B@-9#SPRgk$-3zps$xyyWI}KQy()ygPFN=)@F1(!A zJY_liOt0^WsUX;#o?L7my*9jv-11z?}Dk=jJ;{6%}i5j#Zs!NgjLA6%8v z=geDS>fD~SHKVB-bu4X54Y-v*r&vIa?9&J<`5&5t#&?Z`TTKiTcE}D!&klz&s^$3woGOgy z^+8Dq6(zpG z0rK3`AqPe@S@D}Sel6n^-$+^n?wEMeLFg}CdPJW}Jx zGM{us{J*7^7bW%E-%+RoIXUu(&!ks*DAM38IlLqIyqekRr~I_uJU)4Y%IX4=5!0!n z){7@u9JHF>A+r~O5Y(x^WeNwx0f@&WF>9BFXp$J&#XP?KKgA|;mCPk6eTiuat$OCQ zLlV>Sa!fcNOV?i#Y-}BCt~qb z&41Ks*-k;)>BQ7}LX3ct6j|4-H;q}PF%Vdm_ILq}_&eBpArKM|ozzS;0^c-7?D8SN z9r+!s2q6tN<2e9`Ww#+Q(6`l+1fIZ&$+SF30lfwFD5U>QLy*5w(T93cP&o|mtm3_ZS}c^4uC`6crKVfp{u%23PmVzP;Y@Yo4w-7_XsXw9wrpes*JC;Mew%Iwi{e=w%6|68036b41|W)2r<7 zZankpls>A{vEK(N;hpOUu)9M_nw$9^23x+?6_N&SPMHG8K~J2(O`07!3MFN$15T_U z8!0a#yU4AxIwQKVVBelQ(R8VEsDxdL!$HFWZT-Ah9Cb6xR$U^P0qa%&!|~&2UhyA^ zGl^p3`z=DGy>SqNd3S)6jF`2J8LKe+t>c(>MKUR2aUC3(^*+Fa<06B6Ta+cskw;>t z2nYI+Z(seHu4w~l1C;d7fl84n79S3vvpCJ`v%Mdq?izkV;`@xeAHGjR4 z4<`SED4(jE3$9b>w2mQZ^l4d1^NJhn@MySn1Yr|~tYjPd3EPuFO6s%$w-jg2>K&8p z#dT=-W8(!ihjg~2Ttwh%VK+K;4*3z$q;evUPu10kx7yA*6`JPUjFHbJ1)b0<)!b}P zQe1(nsa`B^PwR13IVyT->XRDJ-*f~}Qz}+<&3dztDrRlDVTn50Bo=?c*G(0(7uj!> zPA9jvL`;0Co9J1ptuN!|3bgevHMt&k=pRaLo?1nMr%9qNLxgo#k96Ef)ZZn|q~I6f z?NA|z77TR676ED#()((WcR=N7gl|_Gr&5OZ@a^b*l`(84l|qu^~l*$VD3T zJ~{h@%3sEb>bd@S8|seW0-*4;3JzLY=@NL#GBTM7a)L3Dur!*wQXSA7`{Olm5pWO+ z8}NpRj|~3=rHz<~2mWh21NCH7L0iGJQ*GiOT+cf6%Ns3_s&^^s0$IoOuCU5#O24Wz zh-PHO&=)==X4fDOYn*)kP-0#*4jc#Z;5>?UL5?du4$V-n;k^nzZ=8HTPj&h%zPUUa z!1ITXE}u9$4X*2@KR7m~?VW77q-1ZD&?hGq%Uegd>Y^U$el9&TGM#5=e4EI8fW%-u zaphlcYgLx!QwXg3>P{{7;=32|*9`l!+?jW4o*b}+L9u2!QMfN} zMJB{jBsWi7U-EXQzcwy}nWVpny6+=RdeCgy;gjTAPl7)rz?1b zj#?YaN>_Mcn0mum$PpA3g>vN-H{E9`C9tMd>PAMeG51-vHOau;?ZR|d*+ieV|6J?G zou~b+(oa%_?fa&aFPX1%Hdq&z?kA&4gHmy}QzOhYW%ZX&e!V3e0h zlHDI|#;4lf6aTm0BC+7><1lv^_${9v6z0En%7Aj&=Z-&1w;Fher{s|CU=}cWtPZTL z!MKn-Msl#^cvt{fMUr4eU$@V4oKFip=`AlKWEn$YXrUJ1yaHHh=f0Ah`_6O0H(>)B zm5Hl-{ylAAxd_hw_NRMqEBPqPdo3?g>@fm^=ViyZL%n_>0d{LL+} z=@GVK@|+N6V&u8|)Nl#`s*=1kw>8UaI&9jRvHpjDKR#slNoV?nwK$wz(Xhj`&TDac_a(|P$Fpwk7xSyN`l?7y5oVg4iOtXQVTVuJvFRvXtZqN*l^D{qu z@ZvdusJq7^VZ--28Y|^yx+N)e#O|mI$UNd(07S^alrNUy22G-LWC{8~#Up4byXy>g zX|D_DOASKq7X{6VD*1Jp&2{xA0$8tG)t1wifM}HIac*92Tw?ReKIHX#gHyjb3e7u@ZJZNm{dbHuBbwDTP6ci z_EqNcL#X=|#EA1Wf@o(2IkxBxJ}Fvq>2gUCp-1968SF6ClM0%E*xH6(2ef@trR^C< z&z+YSvvV@NP(w7g%}>5oPquva`qy66R7Io(-zn~nddL$I+1FojNUvtRk$WE~k)hO+ zGe}$jkGq0x#>MJKyGx-N7gI!jwBZE{i@ba-kUG) z&sR@522TYqZf;}w@4U|w4{g*2UIc~%+t0}&eZ4e+GMAN#Rk6k*KO?Ju*wvOYTH(ppdV?wJdE7V5wE9rE}WBJy;FHZ zo}t5#IqmO{GRK)}Sv&e@cam64HHR-Mr;)0}2UXe^ueRSs?M_;&PhWkcll{UPuxkY> zAKfbOLGA(v+@#H}mJvk^7$;^jy5CGZvYJG8Q`a`fS(~x3;!j4htzJLjaApYf35nNt zG^L6AlF&?W`?s%NsOThytYr;jNA$x4Mt`@U8~wA0!Y zjeHwH8h@U)-j%XFo?>I#3-{fFT@NZp`DeF|woD?-y=$A*J}$1~E*p!T3i=|5R% z2+N)>wMBI-({Y*5^&t7$yOF2F)1#brmF856gt4B!mfql~Gzdn4BsvbY4A-QafG{w} zHICSK+-D405kOm3h#djQW7hY$6R=cZ9rx|BI3m~os*Rc(xq;Ft_Lkl53}%Zry7(Kx z!g_YwBOj2Y0v#NkmBH#O>Rx}B^I8^p4?%qsYjlw;;4a8_k_4t)fbrYzLP>Xp0G0cn zxLfp_($jYGstIdh>n*Yj&IwBbSkTn41}&V+i*_a>u-Hbihn-gqzEVuE^jlMAa_A+p z&34LyxAYf5^X2)ekta4Xt*g#23BAP(ckj`Hg!_=#mj&GtgiU zPq*j`2V*7HvCsX)FtS2b>P|aJL4i=0*#m^Pb1fcN50W{Hj-M@1RTF%dFylU*0RJH$ zw&xMNtzhdQLrEGqHGkVNAC{Mxtykbh!REzO4)4%7q7j^e!!X^!wC=&5SF9_2mv+(? zcefv4#X)~^BVSUw5mg_Rg=^V?amTY;B)(m`VN|&bQiwW}woP8k@7gzz^_Bv?6iRxy z1o#7Z0N82yx|+;hLZ9COi$mMa7?35s*534JjcVgQ)TO++mpUHIJD&nIqAdnEq@9z# z^L$rx@0<1I3NBD;caQ3^Wwh4}5P$pZnKoE$cft4P{tE5SZx?)heI*&=+Esi1f6_Xd zLfm`@iuJTH3b@Acoa{mr7QUMv+8Q|FVe(FKBJq%=7Vh{93D2I&!l9DOIsCOP!698M zoRsd6vzEYFb6^J|Ty1Ui>gpAQ*^llJ=7&DOjd7IDq4t_89cTcbAoSR$cBg2TovH~O zsBuGMcdyAlQUgi5_y^^J!GW&Igyxiiys0QCeYm@CNQ}G|Jq|A-X=~*+EEUo6q7xJrxV^)xSI^T zHn7w?E8<>-B|peez@v0qS;zJ703|J!NE<&O{!JwlvpPl-`-Gbto7fz$`duw(dazkM>Wlh}=^7hs$;t^WD!=-M5SBVe4vL_l_@VJ^ipA9D_oue1Zsi zqWTG#Op{{pD5QodW&wFs5=n4)g`~&1Tkk{YsTGc{GB?XDd6_y33jKF0f zW{VNH5n9U#xiN@WXGU@j*ese_gM$uGT1y1;o)uB|QI`c=0R9S=M&#nPU>vAFGtH<7 z+6{RKA#%+k{UHL7IdDuaGwlj^4>a3cS4g}MiZ-9Ka=_XrvMPHr=FrQ?7jX>V7<~p` ztK|2FjPCk2L+n~agkYA)e!`-z21Iu)l4P0k2~yCp88IUeH; z$G1*#DcO~6t&asa7+C$*pbT$b5vyjB^vy}h)<Ww!>gb5l z!fJW8j+I}Fwz5Tf3cl`-JdtFt*l79{xC^j`WD0D+{!7o5<@XDjaT%;xMAJc3^Q$9cT0v<2?3-FAZ$|&YbQs=7XH~bD^94wO;>5iUYZ-$0YyY5E zJ8M>xQR#)!x1W~8yV?mVUbMEe!;itHElyk9I>omcz^>t5H}KzLK6Lch$kSMT61G~A z=1dGTJts`@0Q&VNX+#}J9Rxe^GRZ3hDRv3SpkTi;EzJ zD7>rA)h8v*K6q1jn_%Skb9XdTnGIBYb=;~7$+Yko_bbfpaK@i(IVw{SW16G5_Pq}i zBe=v|M1Bv%F)xdswWYRJ;)Gw+KNiopQRUQEuTzKCQM!0!3F0uelE{#7;16T#KWkCl zKEiIheC^QLRz8O|ht|>L+ns@7q}ekKC*p+z-}9Q~l#wD5pA`0^+fSrz({&%JPuz}qY7aOOwUGq>`NP&}4DnEzIsI`Vs# zcw&YhIwMY-LMw(kgtav%Aq$$E-F!8w3$pygljAN<*=}RRlQ~rFke{jksnrGv{mBWl z83Vae2cK46vAP})3UtZW@-EzgkZ#HTyd3p1u%D0?1)jRt*E5?47lIr?*c)*pmG_DTI`x@A7R#PxTC6wR z*R~^ab+O3n6T>h#Zr-I!kvT5FVi1#T(}hXt7UMYn1^%m4K^BMm%oVQF|= z*>4J=9wne)ozO4(>Goc910Kv}D(EjkB14&J#C;!w8aRsX7kLSKI@H_|8@UKigokAL z26qPIoN&;H;o&XO-g0u_mH$%j-IO&dhcOteun^=JiH2K9pyiq3QEO+tlpTMxrA&oA@@!?(5AL zYs-QLdGfdp<>$ZH2)EAWMnb;3o}TnAX5AO~P~}aB#`U_pS{G(3Yzf`64897+@|@UR zxOjxw7Ukk#@0lhPyS17BT}kCs?I6O!TxIg&aP`At&T!OGag z5PKcrBdm{2JZCFtb=D-*8yIjR=w@P+o1uYTJ&Z%JLvlKxU|b}_cE;7L`Ga+9rl-gJCHkV@drBXT6Q(}3}c zDZatDiSuVT9Y?0g!sp+eBeFJc}q z7oA^~K%RRr=;~ti<|pitu;Ma$nQS+11YafqWg5o4q8UjROf!SCYPW7Ubyn6+K0pXU z-0Ot~Ghk7ZcH(bJMAqP%Vfj>tQu|ILhx}`fc9<6U|CJ;xOf#afK*i_{Umfy1Z>)U6 zwtM(dm~35i&9dtB^s;&>^A=}nDy|=PI6^*g4Z;*syi$Cl{KRf+DeDNR(S5n)3OCy! z)N#4`r7z>lm{%jOc|XY0Q9+r{-{idIX+CT z*w)*vx1V93VzW;^wDn8X6D97qoxN!e20$uOnQ7m^Mj-rt%N*eC-!QSG_Us#LYjTDe z+xuJBB;~&02I8|2G_5BnD|Hpfew_SA1;L{RmeWZ zHcJ6_b-YjFSaqfxOJfNEMjP_6nKhQk^lNb!fLEo9Dp9dfdo9 zUKQ3rJ%@QSWfpd-5a6ZmfEP(Y<)Mdc&puG;gG3W?xG4AfZ}&xpfUN+aQN(k^NqUY9 z<#FI50e(m2_};AfYqXSu;|Z7vEW`%aSbi9!1|z*_DlMxM!T1-o6%HiNkIDr&S+ZOduReON%3r z-HKWPZb7o^e#}3f^pwAsf@MX(P5hguJQfeLXFPLNEAzn(07+%zr$NlV^R593_AMP* z7h~L=594a|kKlNK^4GWS9>$B{f9(X(SW&CAGUV1-;pU}+li(d&Vyu`KrbCtNTHll8>_B~%S zyo8q?J?-yTl$j~UH1aw@dEleB>7m))(82*=I#;dPbk<>T!`gRP6bTxTm1#s2!vY`F z0pA5`$uZQHdFe?o{bv>iVcR*oi%V3>xX<@>c^mnwu&_W`WAKgnd~J)>t|ZY&s?aBu zKTLAp)&1)(qQM1WspSR53d@VOq?S5PssA#V7XK?$7o+>&Ls_Tk5jW=>!>rCNX1Li6 za7-j%y|y~sA5O8Yu?*cqjRi!=n-4DjTu@BEy7+zW;ZL(QPI>y^s+$)*f+62z8DQY@ ztoT{60|eAwc&&o?ELyCSfAx~Esn4H^im=MnYbWr2PudbVbLrR#m%@u=Bt(b=(A6y!`u0LU9<$;({_E;(Rs}3fp_I7=FTx_m9gKCWBAHq{^CBO{BDLDc@yxr*U>n zXgURY&vY}APclyA&&2HZB+2aOH~D;ofQdgO<(~-E^+A-NpJn`J@#V4-%TP?Y3Yn*}_ zL(p>Y@=kM`+{H{)m+Foa2{O59mp!BtCp2_ zeV&-=JhGdc?P0>2%gj8d26ayTk#YYpbS(7Vh~T}cg1Em((O;5)IpTDufi|h;%6~)a zY=;TaAlW;yvBJqOs)2U|>w&HQ%=@>h?V1(h)NXN$i9zRlJ?S7%=vS-|gb5irbOb^L z_uGC4XLA8%+)A*f3Y=MNG!KdajR92R1}L)6f$8VwXzrAtOq;-%>7-|14V8rq`$$*R z@G87t4C~ZhXv&0&sV@j*WM4HAi&b9%4liQ(55Br~s%rQy{<@_1i4{tEkm?@Tpa^Vu z8C}uiJHG3pNm0Au9;;u1S>rPOiIq`hq61*|zbZ@1pRTxzm@JS7z(VZZ+DH^T%P}Ug z>^JJ_uz^HQ%71RS^k+Ly#!)ap^X{Er936b;9t`ac^m#$Z*_SZWL+@dge2~MRK(`*{ z?z{V<9-vllG0Bkv6uI)r+vZeJU?RQ697<3f?ANJ|y9XIQyX)~>o8IVtgvZGZjBrWn z;BPipb@g<{DMM*gvbiIqU-o)r7aEq|SMA@GbChM8blrHLxC%NKKst@C>*FwR>qr7Z|?6A}gKlpS`MbsX^K(%||bU^dN`Na~?BE4|XXRe73X%&? zK6|RKHdZ25yAkHU`jC7}BGW&1I^F7n0A6&y0y}$_o`$^opDP8ppRj4W~sIt&TVFQ4x6H6c{ z0fb)J#%qCD|2-aePfi{yGo5Gl4ql9Po2&gr`9e8MtIo;-PrF%&KZO=5)AIcPo_{>i zWKuzMMviZz%%$7Y`4Sgy`yHs4rL4)`zTN|dTq=#0pV!-Za2sOKW%>68g8NuP2e6Ai zygwcemph_-6hygyxaWH3cOy0gIin%*YA8%xbVM@XR!Z{Ty6>U#kOMezwbfapr%R{) zuI9pu%E^_tuKGm$c=pnUnr6i45w)QvI^GI+eA2^|dTr@XuTZ{WsrAx9f&FgJ+GH&+;oozu^|NP|uDo+mt$PeaO~!YWOTpgWBPSx zCB6Bc?}f_Hfnrg&$CiBGF{f5p4{k?cW(PlVo5OS9kUSKz~rNWo9iN^~e!(yhxTS<6Ms^lcgHQ;_d zzu$@IRdfYM2ih_6BYFaXH!|Ssc!Z3G449D|kUtT$IdA}Y;;%a+pa%)Iw_-OM47M7N zDbSowwXU=_1+!$&-Yo^4O|5ThjQ?H6+-$l&osBu5h;H>sPZP(e7eoEoes{v;JEEsT zO0mc~<_-!^jn?;7ac?kQ80+yJP3zrMKspJTH7QqFQp+$%-&=yX2!cx%hbgWG;%{CT{ zbhXSVNx-rS389In{>El;Po{`C(-5^D55^ZU8>dWVnyir8~)5X%^{-**E+9*0#- z+^T_8NKZ1$6v9J&WG~cx(ZL37H21N3z68ISUl9r=&rg(R;Z6fvn|oMaZ7jr-ELV*e zw!W9{y!e?HZL{scclTpv7THKFeoE-9ni+Hr7!7sLV5BIXZt4t z0c{M7DoZDsdl7aZJcQ>@Nmj<`E#QAFK6KE{e4x<}2E5Q25#if>*_=NOia$4KdAp=D zY*92NpEbPA8DDbECThr{o3A>*Kt~VAVh8vJ?>yL+OnlL=@zbH-Z6?om*O(6yaZt`> zrW7iuvo;GOy`$rdVmm(!Q)kAgv+tR3s(}~r%lqif#}Q?#3r}B!HAjL&K$h(Xm7@Dq!U;W+ya+0%5LZ?kA4ru)Dp7LUZ;-iQd zmNp5q#Nj&X;lwdJP|n-%<8@xI4@}o$!PP3mFx9wd?p zmbnDH2d2R7u%2LR5Fvxe9RfvybiW%N4)11Re@Gcx^Org2V2m-JLW<3V9=_`2VPWX1 zx1)5DlxOgk7#9z=4kSTSV(v1qp+krNF#~94ef>t|>g%Roq3&j!?LSb9Tlef5Ws?}# zpZ~f8nTO9f2n|GSbogHbSoiGn(R zv)$z;|B18tIwDXCUVhJ474Icei}w0=GhFQ=DSKlNcw&O*D_;KFV}a=r28TM{&rZO8 zzr4ZB)4YNzHmBoaP?x1$p#Cf}8K4R2&(JCoO}5u+pS#%|ai<_$u}dgljx(&?M>z)7 z&;-N8i~k@ejQdYq=WAO}4qK0y%`Uu@B;Hw!#qni*lWI^`LPWTC8fzF|OSKVhHf0x$ z7KyT>Rv*u@i)LF@d~(m7&tumJM=9Wad*PV@scL%U1gA{2Y(?Vfy*{?UTeC_ygu6!L z{qp!N?v=BlLNtR^V&h%)z6!tlm{g0R&tsUY^SY;HisS&b1zw|r2>2)AnbOYuoAR|VV~byGj(WzxiN z^1Qh!H@#0YHHIq39qX4$F_n_N7UJMAddLiTaX!8NN5>G1Dr?eH+tJQJ^&W8g*;UY1 z-O=x$nFS9Y3HP{!Y8S=_7C`-8>k>B*h_t?cm3d52;iSHQfFKm}&)uOL2(i0^tyQ0l zaf(fFE6w9wso(=twq9Thn#yX>u?PML>GkvtOckQq_ztbb-9%M__(GTouKhVozBf$* zS&Dy*20W>~FL|{vBdyu~9m|HBDB+#T1AGkxLEzh7(+jE4gWJzH?1`NQIciDG$n&aK z5^_yJ&`$;rlA?bg_mhxUNZg0wU0=A|-Qn_z;56Y_-k7GWGV*#=#~2A&O{d|Oy(pWb z)IsJElG)M6z?@8RgF3>{^P)S~rnx-+uJA3%<=ggrq3KL^bw|#gTxEMm<Ncm z{Cv={jKLj{NdylOp#L2xSIz#FxsZPVb%bHa*6S+pAH<0$jQnP{Q-+28dTP~2BMK`j zrup4;#YT3{h>NBhcML9j_AUn~4X#)bUC4Cu5K_>E-wr(*aNVGSDvS{K+RA`|sIqCx6T8-?15qO!&G% zTcG-{>dXTJaM)pXR}Nd%49ItJK4Qrbt)*fBDj*|B)6^|EhCutHh2Njz=9CZG^;G4w zv`bkpo@!}H=|YRtIy#1gTfydYdlFh#${?5{kj!)utizht`A6g0FFp$%T^lmxJF@JF zUI=cn%w4>-z&jOyoecoZn?Lb2)k-E(FKt~#c11=q59y#jAVVT44Ei@d7(m|~y9e*# zaw+%A5hjSx6!R;|CbRq${r)eINhlCrQOl*&!#cn}07YrTkQ31U6gw;y$^=vPOM1a` zU@9}4n*lEAD52N2Y&W-n5MsCGUc*1Ls2237sDOpxQ*1NtIXD3J?KXOzYSKPI7Gh!| z0kE$ivP&crb_<%3{|An=13_0lHL}q6#wDzL%yuH_ezeIwiERe9-x=|9E03Gp_KyF} zpJnNQ-U))&!j#OR0IQ_ph~#<`?E60^{p5Xlfb*%@u`e|(zEV|(MGtmskom|6FRHil zeLENe|JnAa^iXl(6QA145+$W>5qwSEmotX@b*|+u70ayQ+RhDNS}u^is=3bZhvN6) zg|`1Y{>kykBCxROF{Gq8- zXZDBEBr`iKv@`DGG2k*A8t-2s^aD`&;n>tJ^oBo$d?BTRQ22YxcWRdnld<>^Z2ArjFu9oT%e+{| zU<59K)lz&ZTWK|{n1T`i_`3f!+9`qcwq+rs$9x_(dQC1=xMwZU^ICxFm1REe9_n@q zBAol3ONGKt2Khch5~;;R6XZ}x|A1NHG%6KkFWMOjG4W5Zz(z75V8kW({y1}B;UW>) zi|9A=6TSg{2F1$o>)S%P%Hi-hkA5=|_)AdPKCCW-C_tvov61pGp~s=vAIv+Sv6$@-ITf5x7VxNUC)Jdq?+_qdKUCu$T~x(%0!XJB0drekDx?8nkv}(L0Z*Irft@ z5gViQ=HrA#&P4Po@{!_eF@N09C)j=?$q3U6h;T$2(T=qEtO{Y}C9cOrL}!*_n~Q7w z5n%{PhSypFX00?wl(PJRODcdffF}AGcfXq{H(EizVVNmG65u^Ai+{|vn1bah|6@Dg z0jmDW{+)tVeI~I8dh_oZg!pm&s3~!g#!Qm_r;a_EUZv6~3i_8T*UH3OgC~AV9otx` z>zSL~6=3=}!dhBd&KKKHvgk;R8|YXKVx9T|Aj+E1-W<&syD%s1Fn#b#O`hSmeV(Fa zmb+mmtn$q4Go<^<*8|!`WTxxdqA}M@RxGH6%VLYvr*IE5J)jNA3SWGvy?1I`vy~Pu zN1_lWRjXJ2ahu_kI1g^~{9FZyo66iPS=fOiy{}}4-8mW?uq)(D@yJx2F)2-M18^7Y z7wjYM6uHe;WV^Uv^zL{Zh1~qI_%%Q(>FK> z&x{E5jRO{g?;s)E-HMOkhi5G$xF1ugsU#(jtR-tNy$D0Hi|ZH!7u9he{VnIN9>}b(HW%c1~Mb zy*{u5A_s`Fi{EFTA6)Zd7CRiI9Rv%o5Q3RsCgU$Z3&bQBv=)PmQ0dQAT})%;ix zct@IMsGBy>FwRgj`Efz%)OMI@Ul~(RCnX7|xCbD}udA-B;zbA&1Q7x@HHl|<{3?%_ z$4-kw0It-fe)#;jDDQCnNcbmz$jswC6%U*_+HUMui|~~vb|OFRKu&norS*X)tpq#v zr`<-}IRz~bw10T1lC45gY=%R%0D}L^J_o0S^yRl`#K-i9X(kuT*d61Fg;|4uQIH|o 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 yuyLb(xDoWdyr(} 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 VWGEE>{m;}~q@nxyoBy|8{|Q#Q>4*RT literal 0 HcmV?d00001 diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-msvc/SDL.lib b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/i686-pc-windows-msvc/SDL.lib new file mode 100755 index 0000000000000000000000000000000000000000..22d50ba18b4026dcf690b0b5d8cf5dc1b53b40c5 GIT binary patch literal 42522 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 literal 0 HcmV?d00001 diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/SDL.dll b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/SDL.dll new file mode 100644 index 0000000000000000000000000000000000000000..78c8f689e90a98f1139b0d9a1c9de2f8ded8bf00 GIT binary patch literal 314368 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 TTSS>GUKXXr#{$j2?ce_cyB%Ay literal 0 HcmV?d00001 diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.a b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.a new file mode 100644 index 0000000000000000000000000000000000000000..3cf7bd8593d6ceb896ee8bf5754af864ea28ecf7 GIT binary patch literal 1799420 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

|xSd#?)J`uBe!&tWHhOkr_z@x@D> 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⁡L)cvj#_21D5d%dc)Zd-XcFHe9A9INF!M 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 X|6>FOA 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

OvyR~dZ-XM{Zu$f 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

eX56RxjZ~9`cZvZiej_#CT%wBnMk?_fo2-uT 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

  • VHwqT>OLv2A1P4 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
  • )wVUrJ}o$}~1Bn>WCgy-{}iuj z?O!rsvMojgqQ679xVfjTx2M%v6wqHItY1&70I+OnexUG1t1M6kC_Zt)tDfIb7d&wF zwZY)I%XYVa{fpT3AC&C6kE=kC(grO|DZH6bpD+SVk3u*Z=bZH zF4%Z&V#))FW9oOWxv%blVLkO1{ICH#Md;wH{^wSe(Wz zz`8yzc<@NT3j5g`U}Poyi9sEI{el%xup!jGwk2h@FrJ-SwzgyPq*PxI%?X&TnJ_D4 z1e&EW`Ibj;)+_3?;mO{juN8%3B0BshppDA{MvK?0wAW^P#WI6-tS*>c+$D<#G#!1< zInPChbTYR3>wCOOf)QRBtAU`};x$H)%4tNkq~n(a9rCk^3>vO)=Lr(*)t9E{N5l1% z_9>ttzr8DKAo|GjrQN^`UM)hdVk+1Z*-<0lWa$z}~WM!o7HIMpE z>!|MIrewvvVYbqWwdcu~gUyzIdl)aF_@f~$typ`de6sdf{@cTN3B`AWw4`F~w(`mP zC`v>cN`B*WsA48V*tf~pp~;fmV1gqC^3=4k>t`QtVq|pc?71_jrjx!XLXGstH)fEv z+vSt`az^GjwADc`ds8#wW$!D)-8DdFh|3{rIELjoDjdLaVd7 z;uwxY^npw?Zsx|v8&u&!=Qz{|B%wY0ZJLZO4Mcvt#zmoNJ1}h zv~Gv4aG^Ijw9BD~9pB>)J?%mVpyEqvG=e7RSRhGloI|xPw9%pEF7$Fo+w9QwE|gZP zMDphx`icvE7>Liq_kQV6677J{W;wLfAug5@d3@d{;}CtD(9UtRN+6-J4-&prj<&_o zu6MNC9qkTB`%gzZ=x8rF+7UTF3P2_)&VmT*)qdbw;w9^pHxUQWlR;H0}!E-0%M zv?$h-bqVh#Wt)JHfCEK~K8=TbGf2LKLIHQ;sKi0ZsETm+;z-~Kc~}z6Z%FwWe0y<( zv3?2PK}Rv!#}@%z80&TT*sq1LI7zTMgEAVvJ&uyA6=XwpypgM?zfLR28kFnUZqS)h z^EpGE>-belhiZvu!JbRUk%nwe+IzDe1o%@R?>XwCbJC&}?1~0Ee36Z2o`?BUI-f(P zTWfjPT0slP;?8k8O29-JcsLWCnIA^jVo9PEW$bE)~WljNi~JDUjN0uu&=Fq6L?m4cCT;lXlbkFPgOCU zBT^QxYisMWm~r)sJ3``?b@LS-p}|OwO_s$X`?%X$n;@XOdQDr)r80`;JQ^q(ti({& zh*=5j^J?wsd<&N9&#IW3P8k>K1|Ndjz1&pnT-{(7-X`h>pX196$F?E$H|Pe9kgU_@ zJi0;lvv*~+WR-a=)u+I-2aWY2HY9Kydl|kg-QcUBbG^h;E-`>(BSF4sJ4|{C$6ah} zBd#)!Zg3C6p90@1E067bWggvN9rD+k)dZUSW$6YNApY0UsD2_Vf7!ah+2DimZ|~FD ze0g+(3&FS7^5GFmxn$`EIg@gYeYSwcnR1D&${?{3$IUr>&<$Sm(sIbI-S&ymmF9Za zXc|Gn=HuFJ_m6G_wEC^B`)arC?;U0S{%(1;+c?{WvG$sWC<^~OzjAb?#Hx6*YTLeA zXy($)1Fq$s5q{<9RMkD~qwnEwYHSLkg{#9(-fgcuPyWLjO% z83yMgx)6zVJsUbEcDHSqP%%9{b=uU__>{2=JAUKTDHA)d zc(-T1ajrgF}g`&kA3%ZXgLS;bzqhl{{{c<5y~Hh;j-fb@qVxjOmK@rymsD#nk5ahz1Ts< zOBjVn1Ny237hlrW0{z8Ee+KC4b}7J>olap-=W6_p7i{!h3@V4Oo-@SB+ae)y9;o7P|4i643|B?osKNCuaYftwCo1}}3N zl%JC?>0lkyQrTjRIWYrT?KtBjiEp9kVR$pdepbx89q1^^m1tf6M{8Hiup}Ibw6KSb zDpfL6A|w6aCx{Ip+V&&|5U) z7uD^lF+FGFU}0Ftxr2O~igC(duUgg4FFh1*j=50sMM7(SZG-8KVkTTsqE*DqbWcd@pZ26j#q;OC+OW&Aef>;W?MnEd?8B6wY*{ zrfgAp_8+N4PSDYD7m;GqAA^Q@YlYQ@iKN8}-|a|^3N`C_HtgJBxkHvEmf|jZEc%SS zvQQMiVriyO)bpDNqhfuj^OoKo8{rXqMd?}OE_*BrSr#hfJS81UGds0B1-!@bV!fKZ zvVavIv@{g3!k;Z?;6EMUb=HaciY#j8SELUC(I zODfiOjPh)r-9^(}V&kF6Ia5og(egZndIY0UgySc`6NtcXs7T+!mR?D&eP<(1Vn%yQ zAyqg+ahx+YJt#Xd*R`PoWH09Y-Z$y9JsgFw(GVe-H>tNlo~W~b24Q1nRIpy=9DFpB zSyS=6Pra!;LDG?oL|SZ@c#WGsH;gjqI!ljxHvtVbG|sx8ZqP$Gv-OI5f5cg0oQ4~v zB$;8C7}G(M7!5$DnNSSn%&PTbZwnB8vU^3)E$}CC6nifqhR|Mi=np{0n$W>0LqWrV zPByfY9c`4OaX*gmT>&KWu65`J7y3aUk;2__5`!D?1bxGyhaBJIj`kXmNDffV1Qi2G z+$4}lKEctxg!~F0XBgQZ$sD!N8XT?B@o{cf_%=Hlxl3`#{Bbs7DT=(K&L6W?h#k>nW7nxmZ?g&Ip9=ubYbv<44h*))U7y@L!4sIeec* z_{0DYn*z=NWIAn~Sz>|zD$bb&5S;@UXn6Q^bKQSg5?}7X--9zHX1YVxD|4~@`pX99|lv?LC4Y!{Mk6?@)TQAiQ!4(jLMqjPOv=ubPs%f?Pt2&xme~W*NurJ zFRAeTS0|ME9LlO3N?#6zn>NLzkbllE|FdQUwYRXtaP?|Co7-{xvob1^j_d;()?VD* z+`UPEhKV`L2H5bCsX^hI!wJjYd2KyC&FyUwzQ*p(ma10F^7QoB8Ob@_ZEaSbxm8YL I8Vi#D4?*5vp8x;= literal 0 HcmV?d00001 diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.dll.a b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..5806c9a34480d81b999fe3779379798c614fe520 GIT binary patch literal 124908 zcmeI5eUK!_Rp4KbB+Th_van@YGD3_ONyxUmnw_2fkWL8A=k7`~yW^SJ8C!rywbQjb zE%g^Y-Mh2GoIx1D`2+}Ig!wYYfcY}U7-Njj2w@Dy9Ov_0IPN%~FF4FcI2?xK;_e&{ z;=+uY;E6n^{X^1R%K!ZAlJ% zl;t4WlN?4{lB4&t-18U!$-VDmx$pA;B-7Wh%pL|HnLo>N>=^)(6Mw|=;FkbMPTtP4 zybeIJ@;J-d`vFMS@t7oUxRK>swgE`K?Hw$ep8+5_GtN?d2!Q15Gc4QqdnAv1g{83{ zfTY!7`Sy1KknG?wNX}o!vbzXC^4QZXZ~7zv$(z55<-0K-NWQ1Z^1bf{Ao;$}vb^;M z0Fo!?Sbp#^0FtMkWqJBb03<&;!SZ8o1R(kGce4B>{uaqk<9U<3b3ek`Eqb`A{2x_q%OAc4faK$N5Ry-Pf#px}{~`J0LoA8$=0FuwYljRGa0wDR@m$3X#v?KXnkFor3{9Tg&`!_6K z9tR-#hjo_!_XGgRSN>Q@1-=4GuDBm6Bv(Do@}iGGh2(0yj7Y9I$#U)6ph9xppRv63 zB~T%G8K#rG{3({3FrDP)n^|so7%C*=?`7Hd1*nkRc00>A-VYU$SJhcw^9)o-Ui&eY zyZ#SUNG5M#nOcJi$>Aqij(!*_B=_JkNxo@6%QtUBg=89!MKb$ImW6##AvuocO!B}k z%i;&1LUQtpEU&v2DkQ6KWI6pdsE};naY!Dzj^$hLg9^zTn=B8%8!9AcKF^YlLxtqr z8J619P$7Br(=5#!p+eH0W9d8r6_PIg2FV4?W0H$&EZ^~6P$Buw53#)Yb5J399FIZr zmPwW;9)=3Z_oMG5Z^b+!dGbpvKXeaNNPhTnmLK^PR7jq=hUM)m7)DWk0`r;Vr||zE zc?bGM^0WI{eh%}P@81O#lK+5tNb(=Q%<}08 zsF3{Uhgkj$^P1!{?`Qe!-$8}s&u?M*i<3|x`OBwS{`y&{{PnY|bBmkRdVRCjOd2U{ zZl_6gQ|o}mp4nvb5!V+Oqn+M%vhFv}GDAXusN4t9hP0tu@aH3rB73TJ5x1uu@8E zvsG{HU~Xoa#)o2UW|dD@=Xoy8`K}eT*G8w-O&8}6Pl-LPPFNhAELxyWSR6Q9v_M^E zG1KQ)lulR_e`RJ~{>sdJ@mG{i9V6K}(X2^2HnfIQJME=b&&k7$#OTXr)$6NUoz(ejH~OUNy;jri38Y5;_R^+NTASIV z-L3U8GkR@FhpL^uxKV3XTNm78x=GspSSLAiqKQ|9YirfUF729MvMi!k$E=<#*K5_Z z^}3$(Z&+PsvDB)jrydkPscf`1v&#Le%0}rji@8qieA+pw;!SpiC_9lt)~DO;v@=t8 z&dci9qMCHmm2|7SBhKq|+iG2_zDA1r)6GtLuC~)nJJW3$CS1KbTC?8Tdh`va*H57r z^+blh)A=N8zuN1ZO}1oAU}K}VmeajzttC%X9h9}kDyg12^9XvKGt1Ou$5+RRIboBj zD1Ehcw!7Nxq}{D;VIsB4YP)q|w%6IgTDL`L)hd-u+RadqR#L6))@qH^Ia1nXl}=wy z>S?ztvk5OMqtrG?T(6!UPny+w&d^D*)~j8F#62;zWUaP3mNXj4O5&6d_{&x;?c75t z8^sXrphC++t&SYIRx&{!YrfNQa}{@2DxF@;cD!u)uP_#^daEPJ$1|8^owRr`m5>@6 z(i*FJtxXq^d&;v$tF5N%?d`-hVHKx0HYoby|J!on(rW4?2wUe+%1ED2V?C+&+&@gK z^xkWoi}Yje0gO`HEVp)Y21=t+lk@4!((>lYhCG5*lFdrmXq`{>Zr6=u`V>8nt)0VWxrWO*_mAlxwP$;jh zj`m)>RLPl3Ft(<2v_%gY8m+O)yF)gtV~eD^F}?0y?Tf8UX>1B5D%ohIv03Ofw{jIa zvdYxPt`J?wN-LEO)-$+zOve_@N7L%&dfM4>E0BvdCxL7qtkvs&9#h;IqS)i8VmhmyQ?>r!m+HCaXi^s zU7eS0V56bE__NqgD|Fh*+}i4_o60JkzO?lE`Ca*U;qF>zE!_PvS>-ZXPS?A&^>oWk zH%h(#!MT&I3x(gvw9?8wjxtfdg#XsY(uw9-*^aO}Is$%Eb#@a=ZG_FINbBMub^8u~ zN!zXE${#!&t4z9Tv^&ibGBH|hwUXA8E;bWYCqN!CwC|H{_H@fGvL%g86?w*qChbzc zCG`3zS?j^cwM?t6u!7y^%rmXET1nff69MqN&`hhXU9QQ@R!XUDY;(mqF{{>g>e?){ zQt)^(!Pw?nDP)zkQt(Tmm11@J2w6MAIjKymtyFW0uU~E+*TcUwxtkV{&7n1f&@9bGDkXcG8{PY39=G9+x;%%K6L(vR=U6vA(?? zxdda2buQr*8Ii`M7UK?C7_G5#T4-c|3X@gfe4u=$O07L=;d)^+am8qboApAej)k{M(hgS8^4*#E-^c`En{S?JOWQ)D zzqNnoQ9eZ!7r<|bIn9ndg(w~X^t_|!2r6IIK4zZ=70tdecg zq?7N>o2_R`Wiz+hZOM2v%LsW^Ql-RaToxvaZm+W=e|Ao& zt(|ievfx~sQymU&B6UINRMn7^zn``2X6LXWrh4vWi6gcA+qv2c8kjcI?A&~=Guvo* z&wQIucidT|FH~8RhPBSY2kJS`pS!Ws$Wk)HiXLB4;O3)bZ-| z)|OL*O>2!xtyc5hi&$`Hz2W=uu531V=u)GG4o~4QBHShq@%uQA8mc~V1<>~MC|9aa zSHb=oR)vyVr_@(``D&CW&6n(b;yG=1$f(HfZRSh%p4lBSDzf`2^Cf$qcrN>>KcL^_ zmvcT9OuNEp)Gv=ojrtAph`nNu_}duZ5E8|wy@RcPp>)n2JTR$pQ0CmTc+{&wg3h@MZnk zzD+#$kGIjcr=GGp`{_>6omO_`s9az=aE8KF~j4e*?d$9A*+;OkZ)Mbk>a1SG|n^4sMg4*np^AD{wPVT${T4u(&!$lax=G z{8b}s!X<^S0@^Go`&gk~$6x~AsoX;_E-`8-vVvu_S5*09o5R?lG$gDzU1N$K(&R^~ z4H#Eq3G{KriXL_sFe_zCpi7M?jHLKRl|NFX=s}o6K+2`Ymqt>2N%=!XiXM_X1f*zB zY^~NPV(H^qQ~8)BWf?)a?At#I3^}&RC?YAIr2GMs!o&54fs{);iQrfI95Rm$svbaY zDNkVs0rg?*)u(ce=-b$pUSKI+hwhv>+!4y?Nj-vB88u|z;*&X z%@J%|d71iOWNZ0Ot)aIuzy|?~-q>=;anh5ViDDnisFCygBClICWKI1COiyS%axbNm z!_D@y+`$UCnW{LeJc&QS+S0=Pfm^E!=oR@su`8&8u0V zUdP}lzFTV8n>;pJ>&4B~(IPi@Vp;Hf<nfjRZiX5->y(j?dxxsl~Z&l zX3%o#_iRoFTR!1K>1wmQ+@dw~HU?B$WxR;{t}5!p-Z{G4nlVB>>RkPWb&(fOUOpsw8J6 z9KdfgFM4*NaC_*=j-NC0B#G!^=2D8W#WS{iP_trYn!4=kF4>$}k{08gUu-!P?;F8y zXao&bi7DM$e$n;fzRh0ui*6Bid)+U(qrY9@e$ixqyX;;7PK-P7y@20jUi!>N7;dy7 zKWVeQy)>f1Y-4a7KdRo|K3)lm`lb5u6iY35zsY%=3hu-fPEU#3WnXI9={FsGjEkP7 zmh+V0XpXM>4MB~WRWwv;ZqR|oMjv`k&1_?EFMia~2LUnO4L0iBq*1Z_WZ8r% zV=!a+aXoSn$|dsH z7tYa?l~LK$AnyF$p6tZ&HSlYS9W~FLnmr^`ZpyaSttYmy5<0(9Dvk<<_gG$NidUR5 zKit+8#ZuaAJ*WSuV8w^_CP$6YdU6wc1%K6YqvjhLia3*-O-XUYIzL_}i@c0lo9b6A zFJj)QaAOU%8)>t#Mom@3O037<>HM@@na~~ZQz$xj@va=F87#YJ+agX zohL8FCs#)8iKk!Eyx56#!;Lp(>o)zT33jxe+{EWAe=)}m1^rNCP1*b8mJspylT`Xq z6Yn^{yO|niWv)=EDSOAkT~ADuQjV9Ny*BZV1N?$!2WMcFYqbR%b;{mxC@e825z0C1 zNl}bIIEOB^NZghBF8>Hbm=q`QcD?juC-wuv&k1(aywL&Ic}mxn#afj4z{5Uzaue@z z!n-nVvgOBuEw#$t<)qk>dE5YZP(Ry+d`*MDUxv@(?y>_-R89FO3r{ zHDzlxh(~_iAFJ}BB|ecys}QML4K9S3)YC35zc>t~ll4ZFPD1HNO&m)BKWV7J(M-L1 zdOT@XaVh(7>osM^Qea?lJaX`HQ~Vf;{eAEgf+1dqHe7y6x2F_8`L%YLDy{Y7CieHi zj~j06GR?u(aR#UvTW_48Bh+5x#F{a{+Z}SkjWz?+j1?YkTS}|EXgPGC*gHIG<3)eW z(4rpI*Q>t=T*rAiRo!v3y~MPFoY}_UKK!Wb`qCpO+BgYb1jTp*@JyE9YWeeEOQ`|k zO@7s8tlDUm7cFsKVt^ktwCEMaL+v9j``i?wQCLD<=prwkb8o#Z$!y@>UJP-Dyh?QO*ec~hiDX(Klx&QQJ%Iv2&$88`J> zdnMiK4hc8L8<(3*>%~p1{Q~^3;bywt-cG`eH3QUs*%JpCt@5HJwzdJD(zG8?E!H9_$%xP3C$+8aI1)vj5Ck(i@A7qmA5n_UQd<&CR*mPB-mLx7+x?gjxeG z&yDp)awD`}+{7L|fbZAbB-O?F!&BihQ?}K#l4?&RFh&(=5mAQfh=blY_&z}kE>jn5 zgc*z$XW3K+$a~e)7+V0I5VYVTbwfgnvuG;Q;=N{Sqy^x6Gg{Q5qC-JTZpl=l<)2{1 z)JO}!TLdk`QWE7BOl4YPNmRp`7Cq}N-y>)lmXav9Tq@JzT@uAnn*fh9EgK7+R%0n` z1X~i79fh}&c_JD`R_E0!iaosm-z|8-X9|Ymd0S>id6S2Rm0r}u8Vta9Notmdpmn4o z%EGc3+@K*sl@~2>EET|;1ue6!=1!Lirhxl+%Z{aDL^6-^vBoBN5>#A&Zq)89{VPQf zE#I@+JF|KbZxe)Dvne~1uJ%?6c>M&gbt@_Vu^R)-JpTZ3gZ4{mzV?5Xvcf;!!O_g`SYJbe{|0 zO7$x5Mw)RmlrRRb#8;P)T(NXD9(RAWUcXEK-Qx!iPEH(|m^?BuH9pR3t?=vNDOBJV z+e!d$Qe-UmcD8x->rn4GmTfCpPb@1!=M_m}TM6JhG%t;|;$?@gO}>Wt3Vso)XhZ>D z(el&&Zo1o5DSX{u0sFac=m;r^yi9Y5G_-G~QE`%fA=9XcNb%hM27VC{#l#Ov=NNMb z8R%^c=l~RpmV22u5*n-Yq^7ve)2NN@eT?(DRj&_8l*v31z*wCpFL8d(i_A-!4pWq| z-Uw)fGEyV%5?qh5dC*$!E>n~Ac2YB0y^8x3`!CzF$$BHG5lT;LV%c;-QFE%DHW`}B zy#{POvA_tOA1`sPGdQn!IoWGG(85lb+Sa332M(2)vU8m|-dJp0wHG<@jsZYVk+W3W z)umIY)RY~4mw94|u_{kmign;oYcqA3mZZIMY-Sp3Frm^y<4|d{t?YfQP_JV!f$!AH zUecZjSd7M#74FR&AGiIxqsGdP$YIL%P+57gVnVVqt~K;F2K({VvLd>B8J=8+Z|v_K zyp7aR`McPmn5vJ^Y>qU1>O$m?V zs^`duIHx$YGlI-|jp5Qmy-u{*x=jBkB8eX3jf+mE^@}_cv0tW@aWfqKGQOQSYErm1;JsvFbmL-M@-BCa^8y^+vZWu(UQo%?X6XA?Er z8egD#aO*T>`+$j>%o~>*tM(&jB9>B*X5T;t8k`#h7raU@|9Qn1GfxCCR_Dh{Tqgx;nwRFIX?1fw?d+%$D%>)vbgxa# z@kqksCioE)%PH7a1U*=**Lk^e>J_XS(;q4-Lhy<3G-x@FrK+>f7WG=;&$ zcvK8NS&AP+2aD0?UVOms`JS}Ao*n|kjo$Wp(()Ezx7U-Fcl5VYPY}`Xm?teK``cwt zTHcJdgO*=g`5d3=b-VbyH~ns?_2;jplf%t&bd(k9bqp5pJ;#ypsxL}eq909@#b>@p zZN1Yog?vxybz~`2l5W!6Sdy}f4pYWprVmNVqy8Lmk|#yQm^5k>C3%Xbcd-vKT#8;m zxu!ho3lXRIF%<83!NV>?Ndw#Up+=!WYt<*on?CR;wI?~nGHle^W19{+Cz{oCH&}9R zD3o6`BH3(Xa4&w8H6iwq5KvQu15Vbn^lH#)g}EbU^8jQ)*KBhR3{LE57tKqkSD zpvmHs5u--Xx8(`q#!0XQy+Q{YTZ7J;ql)`Ee3cOhLD3%dg~+6Naun;(-&)9ZY@7rf zi3Y7h6G!Axe~MH}WXSX0#<%1dn%=DqQ#%Y9QXchXh*SI+iv5f5ki(FgO=qmxg&G^6L92EEhqdd1F(<}l4i z>Uv|@$?3h=iSv;HY-H?&(3Yq66#c_^5s29XdB!MtSL~%^ptt;dq-uZnVbOu-BaJKc z0<0@Cjwd^-tMha>JJg<@va?`PrPt5njK!hGm9lfB zAT8Px2N$FB;$KAtrSKvp&YlkNIz!5Iy<1yPw?d}Hw07*BsQ$C3 zV{|dzIN>EzdQwxYy^Pujie*F1!MT&I3sfS7TZ5sVB-$)B{b$fYYBFyeY^>Icn>gPn zz$u5DaG4pP)~o1nOD3)Iq9xXP0ZuAf@E+dA(uwBT)@5JowVv4cB6NPd#HVFo$?&pX ztEMe8?^(D}rtF9aWW@2vp~p?}V0V65 zJKO-rGp2@PT?gWbJaNfU8c$Z@9qwa-6~218+~Tn*;jFY-_6|3*Qb5IbU57Z56Q9wi zQB0V>mq7_tb|k0kjT2vlm+qh|%!L8hfR6VU<}Eu_GnhQo+RXs9W1K3Jy~&Ydv|goC zY*hiw8Ezg-FAfnmnKuqMR_n)2?Dd0L!OcqAPU)H6P~*)2y?#iD_9hRGQTve-XC=k? zV{|PC^IFZ?pjxzH)``oGpTJs<@g~m=PfX!QO^i1%ZKyexG#bfD(r6Dwys_Rm+z7QN zImMdssLdX5zad9Gb+}NgchgSD?eMbmPhiZE9y$Ct30?%n`&0nmoDtONw2+-p>p275 zrO$+Ujl#K;5pFgJ^vyf_GzS;G-|T#p1kxdcCg;<~_acScaNj!WtW zTV|E6BO@T}i3^R^`SB7X4jeVStX@dkGrhBCaXGZ1sOv0lN{<|PoCH6D;*$<=BqInX zxa)R1wKF}ntW~Hjt=dD4*uZQJnSqpx|i8YCgz{^(aq~NbzGRmS!-i7+UD0=^IY3pE{p*>d8=) zW;u^6Liq$Qf@0kn;6O&u#`O9S)SU?s^29|(X}nm8W0G-I$c&ZnXCx?lN0fLm-nh(U zS}$(m9Bu%2W!$W6gxuCD`=k{ygPyp!kiv_UIENd+{)`koj3wX_sq7eJqQwl#*{n6% zn>0K?D!r(QGoAyymZ`xZEFp}tP=BvFmlrHURi ziq+xwT9y7 zoj5`Q?hx$Q$6!OK=~C=4EBR1hrRWDxc7z1;V?D|fBvL#XD$aE?YR}qzqhe^Tw$sKN z1madfsO44JdzM9yEJc0N{5Xm$WWw!|qlH$dk#wi)?d^oF`%qabyF#YsMS4|$$w~C1 zDb|YMwjxczQdG89Bb|#CftBzWUb}O@!?sPk?i>qlPX>YeWX}D47CJK?b z*|i(8#wlvYaP|#ufz9PT5;3Td7DJ-V4{{C~peju-1#4*jotjO3e)o)C#r6T(-Ax4kvEDDC;=< z-HVY!v2Fw7iji5IO}*=k>kE~avUQt+M>fb5ll&-(bsPA4K@m@8fBDyK7!&PHo*tw2 zBPaGa!!3dw(X((ZFy)i|h>Eo$xVbM;;nFl%t;pgcD%5$zYko~i6s`iToR-vXbhL0(j^u{!rm0v(Q3aEEB61u4ThZR zMpDD2QyXck*9|!Kl&Kc3&4vsDf5qnz0Pm>dJB6ZQPCRDsB(Cmw}-E;K5-RY zR4{6NbYG=enWY;m0Y{bctgt7N6|M1NCC>W?aFt?ZrdO+1)m_Hf^|fGYE@kgfyWUu8 za(X{@;##aYvmVu66gIEx;lQI%+ec;BVzr)FW`r*C;@O_Q!t!#WIV`*=PjbAl&X1Qk z$`|8F7GG4Wx}%#(p~jiAqkL6N5gz5}kttpb#dZ^|Z=e{e<6_}zX_rvhDO(qw)}9Dv kjK-6dIJSX%)N!>;dZ3^aZf{K4yVaQ|0v6+(+avS;0W4LZBme*a literal 0 HcmV?d00001 diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.la b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.la new file mode 100644 index 00000000..0108492f --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDL.la @@ -0,0 +1,41 @@ +# libSDL.la - a libtool library file +# Generated by ltmain.sh (GNU libtool) 2.2.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='../bin/SDL.dll' + +# Names of this library. +library_names='libSDL.dll.a' + +# The name of the static archive. +old_library='libSDL.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -luser32 -lgdi32 -lwinmm -ldxguid' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libSDL. +current=11 +age=11 +revision=3 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/opt/cross_win64/lib' diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDLmain.a b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/libSDLmain.a new file mode 100644 index 0000000000000000000000000000000000000000..6d14e4878eaae0bafa74bbab49d379c3db0dd938 GIT binary patch literal 14816 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 literal 0 HcmV?d00001 diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/pkgconfig/sdl.pc b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/pkgconfig/sdl.pc new file mode 100644 index 00000000..d3a60fbf --- /dev/null +++ b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-gnu/pkgconfig/sdl.pc @@ -0,0 +1,15 @@ +# sdl pkg-config source file + +prefix=/opt/cross_win64 +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: sdl +Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. +Version: 1.2.14 +Requires: +Conflicts: +Libs: -L${libdir} -lmingw32 -lSDLmain -lSDL -mwindows +Libs.private: -lmingw32 -lSDLmain -lSDL -mwindows -lm -luser32 -lgdi32 -lwinmm -ldxguid +Cflags: -I${includedir}/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main diff --git a/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-msvc/SDL.dll b/tcod/tcod_sys/libtcod/dependencies/SDL-1.2.15/lib/x86_64-pc-windows-msvc/SDL.dll new file mode 100755 index 0000000000000000000000000000000000000000..dee47e810f964dcccd42eceec3299c0cecbbf203 GIT binary patch literal 306688 zcmd?Sd3==B^#?pNnF$j}c!ClQ8YF7aM1dxXEm30UA-Ky0lEQ*r^5*C*vxUjT}xIM#wBGv?gFz@%=^UNecu)n^a_rI6V zhdlS(<=k`6J@?#m&t0bGih4_y#bUAJe=23MtiYH4xy0We{}Vv+;1R0^TVBg~`_vUy z@7t$Nopb%X;<>lqdfn~6yt%mUm$%$EQ;KiC^_pwPuELh{&f8*hRZ6mSPdjWhp3-WImaga);%;p@3=~me)_gx87mNC&nE4?=go(Ia+)= zU%+80O^5q@$IozBUe4|laYS&8cI`q9aphZqoJgd$Q>XO#S8S=BJ?5HUYQIF>+%xcJ zFY-`jAN425Wtklxb3138do9w7fyjq%c7KG(=Nj{?dGnBBdF=Q2Q{O+G;^|+2@LkLJ z1dqTg%Lz!hsegW#rQ9{I-~EGp@iEnxO(onj>Car`qwf3bk@;NlG1^Un zK9%x;w<6z@N9LpU&bz%1Swx?q?*#9jIx=55@?Cq=t;i_)5Pd1~J@kM%dXw?fMg+s#RoyZ6LxT4J|U#KWD7eZgJUinv}7M#L(@w^x;3 zDfsdPR1%JBXQ|PucU6aF4W(3UmqxfOD-G0^`cT!kP|ow-;GBLV>Ua*p;C`DF8i?F0 zN1%jpB3dA*6r^2s^)KXEEx{hEi1H_|RipNi<;bT-=Qu0kgm3iCKvI#Sx+~Snb*@IM zRsk9&fd+TQXURdndc;bhGOB?I@#;H7!LcSGA6KNJju8ODasNU!R`AwUXi6;apZK&n zvJg*AF_ygte#Q!Z&xsLyjCqJ^b9_?3iYuJ*4Y9v>Pl`Sw|*EfCL7dfUH~YJx_?p^#?hgg2XPw3T}p9!s~Y^usaAfw z;CMBfO-=urB2w*$n!g9t7&|s2TbrW_Md%-bXPLn^N4XhdV#feFl9;F?AF*#zyTfrQ zWE@VV5?7{DDW5b#5t62cJN1H47TTxJDk)a=MJ46>W>vqbWSpvNC8etVu2;XN#O2l3 z`F|O8TzMBnrwde;qDPEBHDp;lx}k4V^#jI^m074lZf16v^;7`;z_WX#*01`t<=3} zrLL5e8ZQEcp}vu2@kRlvQ6xku2Nk&uMe3*UFpW9}EV7IK3V@YeEmkeB%klM{kTofE zw}>gGn13UtSPI=EV)7|w6JqkE&?^+vX7d+U!~!y(d>24bRcwm`f;7K5-NB82eC1Z~o_ld9{?B_!ZJH z;KmNJTa4fS7Fi$~O-py8nAP}texE9&h=#1eykRI-oT%brc~opBijmf9m-^HoMcg9$ zu3w{piDHBW{l?js^vgsEOY@qMiAb%8CnQApd>MU+{(@M~Dk%k@A>HN1$>=tH>l)-r z8B5Ru;rPOV6H;7#s{Y`>)ft1$X8na3KYX5hy%$%QIFj*Es)WjFpkcqxfO&7-OMkvqT*>!~}PI ztUC_eVYehZr4a#Ov>1a1TafrU;(|NA)*b(%#20$oXFR`}3a>+S;Il)z<8=fQ0W>aM z{_H7K{%<1vu*OgFjBl0BGJIxtmUREJ8ZSa$;ri! z@Po>$F~@mZp|YshG&MF_&9Pf%OgCpBaDQsa92yOCy%-k@jgy{6Z^u-7n~*Je1y!Sx z)U+B)9;GCuWKP>M<~F5Z+$4wesjtO4exz0;HDrb2{%=s{I8wqbnL@$+cIn<(;8x-){25<& z*Ylyc6uu9cIZN`R@waNfA3xXs_75xLs!(NJJ5@zBniX-a$-k=5A0S51kY*m}yx2)v z2ZDPX)VnGv@2gEa2B@)nvWZCJj6bF;2S&z}m`23Sl)?&8>cAf{zT_G5bdUayJdF$q z{X_I(aQB>6E9SGmS)eA@MWLj$3Emh~xF_}td+=+kSO3mkk@Cc}l2eGk)Gylba7r77 zZmOW}h`24th6FXZ&WcX^wAGD%4X%Yy?Bxkm{)K#%d^JSQWocDPTqC81DONQ$$r_u` zK0ZfU{u2x_55&Tn%!WO%S36k^Hd!P2D%v7742fOQ9ypjY|BFD+810jKZ_I@xxs?Rz zawJ=V#>nwgq~+J3fv^Dn2@_muh^uw>yH#s@YKI)V$XZjE(tA8jUk*_9M2)`V(%3y! z#54%rcw_VvKvdUW)}~yc|7wt# z^*mnl{^p1MN47T&+Qa~)^cnBQ0<^jfED*`1WMcN!r_SI3t2X}jlY$3qnmc$PODl%{ z&mX{gBXRJcm=7KWqXq6H!|$cx?F|1W4R2!j;WWG&aDDH;DHWYOLmHhMF_qqoRDCND z7hjp!fQb6(YV5ohPStAVQC4DddH(Nol5t3ABkPdG}i zys8EKNSi%mpTy3)nh1$ig-Bk=J`#9A#8zW6p{v}VMmM1^x{r=DbZG9NR;2B4HMp{r z=29)s$ayTwazU^hkTyh(MvD>P2Gu_*lqk*B8Gaw7{D!|AqrBxPzEkvRedYb@P-BU_4QLEBX#auaz{+JrA9!Je_2n(IMwIbe6tq2_D$bu56x~Pi891#{hV6;4vWpV2}RDGXUPsmvDaL*VA5uYJ2bTvwN(TIPJF=;dLYBRib zLCjug^8KR8$WytV@y0Y~MDNMaErUeMGYD(chb<>Ti?D z0qb0i4sX+lGux#QOihateLi2bZ;urIxqyFx#v<`?SZcl?mN!z!gP_z$gLzukok|HaIZ=%yvF=kh?|5dq_7O@uQThqNk-PE{{0}Dp;J=YntHM#?g3Jx+bO-&1c8-aYWC{8 zba$>Ab)!?OXXESi=x+3#J0D;0*y9~ddD>5#t4ie7l)J1id7r;^QxkSOA`pvWzSHXt)CAGWT=La!;}rd|x6kHI6l zr`4Tplfu6Mh=RkYVB&7G;LB#g$EaX4alr?b6s|ztXpLpn=9*vS%d0TZEf}l^Ms)8I zUEkD`UA9q{Uh2duaPc4!WsO%hFX^H3iSL-=%Q3YYOVjndf_kKe{6NnXDda`iU9l(7 z14DT(7IzZ?S9JRHX?9Wf0+jc)x$XIZ#7z{e2hsaenE1w~ktIP7wKmxTqTNDk{tP+W z+?La(LxY@61PEz`q#0_hNkru$z$RIpf~j$1S?TUy3^EWAlI3g z)|*aTl;5ymT+!U}0jg8J-=D2MU*{pgEml!hY;xavt*al0|E7S1>vEgsSrCyQpMn~=)>#!sXsJ>HRU8A#{ zLZLTPZhe;;9VDmT1Fbut;V|25t=N#7LPkw}8eu^TS!;Dzu`X0m!tvTI;8%2L4=s>% zcuuH2X*&T%;KEvqe>W`07$z81uT>G8z`@$&dm!&F!WJ7oMv#{r)@z^jqfa}7$=Q`A z$5$_f=Tb}iw!*&+eVug(ef=&Z13VrI+UQ^6I%E~y-3LGB>uBELn`ycZ9>~^4M+?3K z5bVj;PE+ePsCCW3W~`NRJ$k{v5swgPceH+=1wC(9Y0?xP;*32>^S>{6z}e<_3fbwO z_A_5)-s32sRU_~u1ujP5X$nk6;5iD+MBqgVT;1ll83nUZu+4FuiGr$0Tt>v#3x%jV zYLJrr2mDWZVAb~1QTT@nH<@aFSSGD&MY{lOO2g+ z`;?J|0h0OM&?E4!kx8(`EmX>GkQbGUWIZl786#wCT<+K(U5d=mJ8}`Nt_7eztVWe4 zG7hECvq+>$uDlBNP?ZyTrO&lXwb~@cT9RP;9Wa-UsM6A_}MZ{JmmV1h#Z)!@8m>A0) zgpk~HAgANt#7M4XLS&Z3>VcUj2a{I+vx!phmi;G0C^-v5AW;wmGKfI^qo%J$#EMSo zI0%1Sa*KaQVk7h@P%6j5w+iX~ z@U0OMuu84J@#~B zKI-<>AES2da#Q|AdyihfXmF-}S^7bHQRjq6QE#2ECTyrv*0-?eZ-MA1Xg=#}k1H5I zQxv^j3?MOh9-+abiox>@IHE*7MT)+D)%0o8rh&0At9bZ8R+O@h>CvN4F6tdXwBWo_ z(K}N+d_NpNFUj4_v|;NNW9V&EMm4N@{<-JQLN(pH@TY12h>o7JW-WrvFHg*stHy?2 zrpAiuy?S%f4w21uOAUqiuVU2W18 z0RwP9Vkcm!)NEHPw_rHT9SQD;h_M&$aD4xMR5=Q)q)&@Aduo9IaDPwLmc z9f}buIuxGDJ{@{7iTHn~=gj|!9%j$6=@INXIz6k%C`{9H)cNYyG~{@``j;4TlQHDl zF<(uL4bA7_2BktH4&y963pHL<}VVU#QHbfmcUp*wGWpa@_cEtd9xYI3pwqclL zVY<@p!<@nT9{OjfOQ^r}#3VG5Ei+$bO^9d~Ytv!pgveM+pSg=Bs4R>+`r0rQ>|&yN zIq?%rJxrYN7c0@pMKrM7v5QeN5rLWF0Om}rQk=+I5l5E~b-AHC5rE!xN2bySE=_z1 ztAA(WV=<_Xjid$XqA@%l{ugZbA$Mjr+H3OuhYXTJHz6aKMDxQj_+!pTN9RxD)?@KU zGTU>sO1mMVs8sZT6@N3zU&LgYQo(hqy2o0CI6y2i^1$u2nKboQ{c>UiRo$y^Y5EED^tq|D={x+?CZ2VV!WZ+<1pqFYkS9j?R6lmsq6ICZBo0pT#8|MDTwgK6w6^E zp>dY&u+Oc}lE3d0#`d5A%^&xFoVXK`%;U*C@R6x+n$);UH)e?GR`|czV)esZTv9D2 z-77Fm(TZ5nl|R-DDRdh0(ZJGok#7cV684%o{vSjlkN?-Aw+X(+ispOkT8WKn-9gp5 zzk40c!cr)Snq!Nz;6PTpn-1IH`i%s?!hka{?H0{f^)|KXQ=3}$aWcpB9~!xypkc>6 zMN@DsX>BzN)3BVg4RJGVivEFuSy04mRrJkneUq;#DJc;(%O_L7x*6Xdr`x*8*KtsZ z>EfDhuOL}oe=&eo9tsiG+O_7Q7GtTQrm z5IzIpHv;1mw0n})x2$@w;h6SM5I63~kJ;ykyYv<*^f2;z>)ufxrbbhPW6FRY2%Mx^ zah#`BE>}4kOzWOh5-VTu$vBqHhD;k(t)^U9!Fzh7Nt(FN)c-+@;M*X$$tezye!j zCQK2R9seEv*Ar!eD2wQgKJ^!h`ae3d{-O~-s6R>8&GGm@3DZC)76+gqzH2}{IRG59 zf&j(3$!%?KKPb2FpUAYhOPfqui2WI2UP?Tg8UO!9I$nev^^*=MEeVeSKt05j8yC5n~*}4xIA~S71rR)Qry9^xO zO!4UWL|P6806zExyH zOCUBgvq{PkagZ8`I0xbeh}NlSZrr{80~XXfAM(U zD#kOZbkSeV{@rCevb(a5(Osfnh#$S(rCQMv8qN^iS`6MCd$74m99G*os zwQes>u5~S#2-VowpJ58YL4`#$5sLEzv$9igC3v$B>)YHBuj_jmwH-1w<3{>+UKAU8 zyt}kRDcwvN4pRo2ux*fP|CgeScd^Mz>&H71crt9CFsekB+z4dd|_^W^neWRkc zppFUOvto2dlnIAOMO#}i2uU*@oJccG=~j2?7Rq;+a%5K z%_{K-84&YjrvIl}4c*FVMx)3^CLzNQX4NGi|TO#%T| ziqltyUOr5j_v;_R1gC!f3jO>w8QiX(OlN;jX@||u_AgEBgg72S?R%{A`cs=84}va| zRF>MQCcP}L;INR_{XZ_RJ;#vO1E#zl>?^N_`^qb*hXhlL4)vGUlR>lK=Mimj9<42z zHcYjCFL=&lZkvcdZ1Q~nQFz{SES?`=o`cq2o*yKh3xYAq&>y`#zXeJ+%}?@4vW@A1 zY1>&Hvmd9OUsJcuTNjtH8oo4EH0;ut-RkM?q~YYEMUOWtCATWB!xkDXre)ji{{kb! z8i&u4twJmYk6Z|9$1mOaB~E^k$%CB|(s3>U9J!zS|BjxNpoffHSla(*dcJ0QmTt_4 zwRw#FW%3!2=?@!5Ub=&{tc)|J@TS2*;|aE7mAPw#+q%(Ru>q@Kt%CS=No;Dq)#MlX zE#V^|=cAx(xA6Bi!CHX7w+XII=9r>;j=CO@z_nY`Tub|xF`4rE5wlM-^`W3Ius>hB zim1hMRV$&ROSCAZl|gclXPv7r`k zU7REyW1z;m71eB$g9n}3&+s>2yDi;SlaJO_Qs^bq)6vT>>(KE)T_W*V>uIOQSv{ zf+F^aTCo1x;@@P}k{E-jmOCV~{`;T!fz5g}_`mRkj`LF`Jl^}aXYK#D?YSN80kgBh zaamGZn)cghyW|&$OjlDBhCU|uOQyYoQ{NN+_KV;l3Lfa?Uylfi4m;SJmw7Gn9-G&8 z;`LwBy#7E~G(XUHtn08{13$w>Sm1l=nmt$p!?{4i7UI_oUE|co;V-sy-s!{cqk0dd zP?YS*Uiov!Ca@n%ZHHL~KUSx7w^M2o(_fT)%!@YUM>_dAu;K$`fZtM2Md8n4gLu>*&`viSNsuVg2Ni{Kf zFVX2~+G+RdE#9)t9(`NVQIA;+BiV4)RJMaTPV5TdgH;@K00nFa*eH;NKo$k;2-qp$ zK)^wPYy`3?FaUu82mp(kL6bu%gk~TG2+bf05Sm;H5Sly+5SqahAT*K`ri1J0#?2&~ zQP=}V`d89(3H0_hbokJmnz|<8JF3GjZc!nYG%cdPMR$MPr@N1#ao(ctR`hLY{|emN zVy}X?La+m(tpOL+U=r>U`(<=4x@ia8CC$mq`YK85;cT^XGwQZP;IwPNiPviEC&9BF zsV1j_D=Shh;_Z=Ya;&%pcQD^T}fsGj2l=n z&dfe+W&^g}zdN}+JwJ(F?e&!t0(O^cqlNrK1;8H-Z#n4#7xo;drniZOw|qR9AZ8#p zY%4f7;UJ=2KvE7oeva0D7qwsWll`ISaj^|yH)kOfhJiy{=SNzfIG>kkJe73EFu23; zm3r2vDgFnj|8aVgQL`v?R=Oy#U~ga^C`NJ9|K7j7qUknjI&HL1b!Ab|^f`kIZzV_+ zGUp5W+eb%hzuEuPp8u5xhcY}c>pOaTwCB;5WA@*FZ4cj#3ZO1QpgT5GVt!$#_n=*z zKez}@_QuqF@}H9#-SnxQ)*4B>C)kt^NzZq~uoM1UxSuEhm0U}jy%s9DmNa`URB|n8 z_FAaqTGH&bP|3B~7+?eBh-&~WMa&Xgz506p^NIJw>)Sp9qljE0HZx0jLl|J zzLSLV{fD4lY%U8C%XPA$g8?E$%ySeG8v|_&=Vy9|p+3_0N8LPrh7??%omI0xKtp=J z77YgkKW!~3;o2-To4$6mn!XM+Fc%Gnd7VxBx$6>_fTu^R5A!~4aMF=sR9X{Lg;uSJ z6*a+Z796K}=l@zQs-)_%l}yUNc0i<-lt0{LwWR#v-mE2E3V&HGDgW9*HTrsZJ3(bG zdc*&_#51JpGWOSz{ejyHvU8twmZxZnPb%&3Nn;!xTe5H%@T&HGiZrTu{$=Pe?k6eq zF1iSP<-bf0?l|m?PR4e499D9*Pnxj-CSOf#)&!eZ7X>%$lV+~3soQXo)R=p*PtnCu z5HiqqCWmG)YUhfcUk|itqxPt0aI_rSqcP`qNH(n=w6{H2GQ-lx6$vYD3$}R5wkHSI zQ<7*CtxNYwv(}?dYDfn*Z{Wqq9fF0Se_OIXtxrvCIBJaE^2B5-p{&8ygES*f20{{& zdO0khIGoVZDBSVf!ieC(iVX4SO=za<^lwj)Vx{$0FK1flpbgzV1f3Xk`=rbBmVAh- ziZR7@7|wi?V%kiw^`Ub^U!Gxm^E2wbKKo;QelU0kF1wwDF;tGb02SM7a6(uv(uUAM zt2S|d2^_V^srK|~avWIO{6UswHK<7$!#1W;$&H`ID~U-^ zmrL6)!musWxTs{df}2Zo;j+T@u1pf&d9b zDN7hASeZzrI(}I!uK+?M&5YxM5c(J7bd<}lQ!{ujTj3PxL*&u~UG8W3Lxonq-UlHt zd1Is9pW-NnI4jqS(8NLrz4}cZ<@+R{0*%>Hn9kZUJ;3BxNEgRr!@mIz+|iX+(BV9Y zi)`LmV?0s0824E^%42qyK%~pXD{_(1B{h6iX)L*z(M2a03)(z*i+KR@pnb@=1@{wAh#3>} zm*@tlCI8SU))91?kM7~iv}38@$bMbir{9s?W+h55Zo?Txd@WG0m)iyLZE_(+pnEWS zc>3*wz-1DQ_RdQRqC~?4CqN$41BoUXVY2SQauxgWQuwC`pxEnsa8_NANCc?*<>iSY zq-5j+odJ;xS+xAX)n6?k}2> zj;37>NYdSW)8P;HS_ciRXb4ZF~uL9;l7W zf!LJcB8+^bJZK8%&Aln&er{~^oj8|HWv29|&=UYCBY({)vPcmE{SK!zn!G%-H{~^? z2>mw>y+e)5LRz|UBbNzbClq~}$gL9%FjXTlX9)H(a9TEz1w5GU<#r=+7(pnHxHXNw=0L%XD(AraAs1Bk`dop39@Qlsk{AGX_Y0feAs$03Ig zXB4E+LJr~VwH+b3!;nJDkwwOgUJ+kIcLgS4zsa^bwFLGa);naTDmJoOi_8-z?R3Hq zUEbu5)h@wUa!YD6lBZgcj-v@p`v-^&Iot5*q&3je{e)JLysZc_-b-7Qh(ZPENSR$6 zIid}!dm+w!?)OQJ0aA>jA>p5)b5Wc2FCujf9e0MS!IsQ#wJz~iHf!tX-Ybr#S*10w zFkfnl&0GT3;2DKA!$6U=CT`sl+`nW=N7WLPlrCwFSd;60WFSkZ6I1xyck!OVmCd3K zDMT0Hys^n}Im1U8JMVrZ!jEbr`w}%Y*n;suze*a0QPoWbE+q%3^S0DfHmeUy4fgB^ z=DrU9dTLm`;Px<}J}S3;^~6QNYCCa#7V(D;F&~5BL;pv9!=o+O4Zf2XJHzi@5rbW# zqSI8H^rj4_5*a-9k}uE$ZAyvV{5s8VuKCSB7h zKK>S4Fs}eEG2v1(eH4|UBkD*iCw%yhHSv!#zvJl(&#_gB1+edeyFGA=#?hdzW~X)? zi1pZ%*o3_#mx?uBMPeqepucKery^YvUqLbmRX#aeu0+uqoREJh_W_?S+p&|0aizrW zCbU4>F0UZ$BPLvG_#J|UH3ddZI2Bd9O#)T zW5u_)Om21AXNpc*GP;U-=B`{Bm#PsE{iH5kOMJta33cAFg*y`^EQ>cIm*`Z^AUYVi zGX4gB&jQ9AJ*q+vx8U{-t}YwD@=z~)qh}d25z?#edXwH}EQ+Cv!f{+7bZXP&m8cQ) z?x%ZU`ZuZRI4oxM7e%Y>N4vf(=2KC^$cEBTqm!J5o6xmY3)4+Z&dGJS$@OKEdFv_J z$oGwF^tX8>0O_C`VYqjJcMM8)5U(F7G4S!~p_0A$YF8M~s>l#EQ(KHj09N7FvKzP1 zrfN5)Q;fUQ@i6|-4Cu2RZ{ZG2^bLrcQc??CFd1GKb>N~|9%X?HP#yFyZGWm!jsyFN zFz75{9EtY_aNT>V8hf-PfCMTV!I%CKdJ>*B^e0UZU09^M2hhL~66u(h?F8-svQ&9J zQ>OZhDJP+zOD7wQLH7{ndXXj@s(in!)3mK>^Z}8r%6GF?j83hkHy~7P0UCHF8n~Le z%=p{u=z!p&64jzzK(9uq#_A~M`?H*t3VlMLay;o zZF4!zFKHKo*_Z@TxR!g5=#1zDyKa>lCk&>U3G+GzC_-4YE$0wy`KPGwVtGxt5+*ga zGXtJn4f=XO#o8#a(yJZMk0)lL+-r>_7dk{l3I=&DAr|$R!0i@?5aT^B*BiKQ~hRcq}C8Xns zBh*cp%5vI~)`&E5u$bPFp=zcg!UiN0ZAhI2AUY8>C?bFwevSYVsfKYJq#Axg!G`Im zVd8OV%)>?8!~(<*g#teOGrOf}hcl-cTV%nW0Y1HeVx+Je3QjapYFK1D5k~-QCp3NO z%sJrGz1c%4ZWzTCX5vo3Yza@o{v!W7>E0D@fF({MUd8gh!kzt9)6hchj1yOZjW>he z;G&YVPYPXvY`!)b*H(r2kVwFcE2}pzJ zMKj(4PU_aBua^W6L66x{W*SExy~d*9lHZ2dq5)3rbz@}&-VhUE@?Mc|AiWTO^}6`%^D`!!NP3ldR!SJa;ettEvMQN55YK1(+}F| zCNABLN{hO$&1H955(S8&8U;TRzd{+Q@w|Wh6c_Uj+aQgjq~!*b1r;L1p6E32V)&y- zmm2f_K%bYqC8MIy*KmmtS)$R+(0Dh|vj7KSYgjkvgY^x@>&s33-HhAb7Adq8Xe(!x z+$7!eMc7*5i?Poc}{{wD~)h3T~Zu8wJ=QBu6sQSftMQFOx_n`c++y42WB%|ksn zQKrVmUx=fvc%UV?Q!*~bHRA|+8rJ|5k%^%EczTq^YyBd=3o_7YoJHvakRG`Rv0r*C zzx89=W}Q{3ys2c=g5RS4Io4Sv3bA=64ldvUFK>xLWY5Mv!f$6m5YV2cv35%tdhY`K zm+qzOY@%C?f@LtdL!_!2hfhHsWW53(1sQODHB8Gw*d{gPZAW5S+jLOIhG`BY**Q)|-yqkt z0f@>@XM2IOKaG}Vy!3VMN z#>Pfr%;lEI5o{66u!=T#Vi(!Gu~AVt$k75^Tbo*vjYJz2fD0ZRE&>KQa*^GKPQ@4Q z??xE+2xXfw*lTFRF&W3Z=U~7ZHneFJpjQF)O5mu)*XeCuJOQPDB{k4n5Y0%g(f0YEYwk>8`ywFF0cLxZYoK>rPY8#1FHLer2*u$wMjWq5c<{buxDTZZD zZ2WT7x(-!O0B(p+ImD-2y0-@6O<7-X|bl7?cD3 zI6#{BYvifeZUm7l>UaZb$>u)(Zq#4e=GfN+wTXYmim zc)Ofvk86eIBSxtm;yDaltxwzcF~?4@5|~9C*+H8D8&Cd&&cP%%)B2TOCloK*p&lCJ zWdDzYHHM+?GRSp=3Ti8dTdC3|E7ziNhJUF!jbLV6r~UdF%oc5{D8+w?-cb>6N@N9h z+Vu_Js?Yn+!R`No(V!EG*lk%jL)Ay$N>ulI8V?E>(*o)Pp=wLp0AgRV7512E3C0%M z{}E3<3H=?*JD%wO>=kSptoGG|lPmv;;LFg)6be*j&Ez)nxPuvKC)AN&{K5;o>;L=nqmT5B-{oUyb9%RK*&1}?cYSe7esOSqN z0n}!E2MeNCxK|4fRO?z64^0jy zeqd^=JShDZPXWOzfX7vax&n*tE3j){QV>ljlwxa;R(WtyZt`UGSMY0V<;RPM#Ad+5 z+)2&k?1ozRAwjSl?o%qO3#EJhL>STN=+vb}74SmKW$j8ZFl`0rBnuMv}1CauKum2eM@dDXY8kF9Wau(dez6kyF^h7CS zHw1>#+b@K=JXNr16y~D+Hf^v_2$Uf}>1OI1NEPLdhJOW=ZHC}u;lEMf&pHPFYmsVJ z+@D{W;aGfRt0tgU49CG~)y(p4wx?oys^GxcVs@p`wcTt+Hmd2L|7h(ouyvDZk2c6G z+X-}n1w>#*-yW^}Gbj%gSZo%2oC*??jpd7=1=}2tB0})?82a95tD)ylZ|<8d?LkC+ zg;B>-FzbT*Q+RVMxVEt6(V42=be_e6_rd@4=*)`sniEDtx((WxA4R7SPvGRf0~oIY#{6Sr zM4#mX-+v`f666g5vf>{>hQ^|;Kf*N0My=c!%CfkA1P!SF@qU!-+Q6lG0iX$htt1Kf z2uVP>p;5;Tl=7BUcl;6oAwN;a^mGvCt#_9izsF2Rq8{8~J(@jYEI|4*HtE4QWr8oh z&whd^KZDZk$4>tlrRN_z{X|MHK6ZLHW~*mh$4>u{(gVj%Z$x_6T5F#S>ET7~$J^ko zj;vCqU?b_*qssoL%1S5{$AzGUq+U}AXx}*nMTwSd;za0F+?jHqz zDaIT;Sinb1&zWTT%mx*6TIzxCa)GbA{nYm43-zJxTD$S|>9B@2i1{DzYGZ~3_%#8; z2J{fEkc(oH3oKeoiU}$e5CY{Cz%!`D*2t`qQ(-K+B3j95c(F)Nq}t&q36XIDK)mp6 zd=JwrL5H(U4vPMN8u}}mmqT(8Du1BSAgny(?K=Dcn!A+&xm3fYFN;$K-Kj~uxPp64nHyn5amBP zT9BAV*q#73Qf3%;%Zw4f7=(?HKJWj)9`qog&9TI+IWzr*1R>NOJR4O4+;Dvw zZ+r3frDF#2YGcrV3lT7K&;TWxcRs>UKmHTAiTBr1tfNH4#f@crW%E+n1=2`w8$OJn~o&7YDDzJbT-;KHC}*6)o3fiAKPifrm<#fn`2BS zH0npzFVppRXo*#d`u|;G*4O6PX$FldlBHEv^PgvRCX|U&SES=qz2KeK?C{(V|4@7i zw%~)OwVLSD=D5Yg+2*(jq14BCl-BVak}TrAH@(GpB@bTmqC(@@li@3BF*=K3yz+v| zx_MzOFpTdd@Rv%4)~n2*v2-H%6ONn+%zoOna8S5$D>3C7BH_QzU zC>SV}P0_q3kdHLYY|=Ax^bbhW;HB$pN*2Be-loDEygJ+XUi~%U#`Nm1m(&xv3hNbU z6Dke8GKcgEo?k^-uemVr!Z%31Pj8e9ncEh<_bVY@!$5&T7P119v)Jfy(-N1a*-`~F zXfZCqqRE(XrO>5dlXylAZ-(QUwQyI|VVnjZ!oBAU_yWgA1cgQc^2Q1}0LWtHpZrP2 ze#d%9Z-&#VY1c4odvM2+vi8buDb@qT7dRdhrN5#|>e?0k-?V`6#D?Pd-^I?&pUdHd z)}+>9m7JAs3|ebx-qzON!doFa;Fqpj~sGvx78i~OwmW4M5Q8YDXwxYe#1aYT!DT_+uQp4 zv1wS*?KuLE8uQ)^s&~nic9v(pQ*@Xg0JUya@j@~$uRHzw@B ziuEkGDBatGE`qZ8D!aO+06HNm;)jo{u5g@Ft5 z{C`rSqfeoVqjgSC-JY80c-$=0UbJ|czQ~#s8+EQ%zsphsX+yj2a#8>dyDOgpg$NYZ zK>Uim`nAQAVlSLi4BLh9%V3)Re$$~5O?!q}cM<1z=>;oc%qK>H3y{GFi=n{UtKq1k zXK*l{UV9A-xvw9GE9eA7^y<$a%8%~2289#!aT?G2~kJGr5L3BCokH=3{<^<1dFz% z+pz)#X!6qDqKP7L?bX<>q4j(Ey{y|H8zR?Cis@{rEKpEH(UVgi3=`NVJ;jBA*cq$lds1 zjt%e#Fg3IKP(!96{1s$D^`R%Y+okGxYfk}3z_nr`;Y83DjxYHSu)6pHOeR0@L&_Wv zQg$-C_>JAbfs}SJ_Mg`L9b>Jb2~VNo>`eB8F_ED-`A7bR73d|1fmTwyIex0+YLrgf zYj~xTP83shVkM|TNy~ai^t|&0MUESRvSLHUcJ5tSv?_UOM*q0Uje>)4n?J?yk-Il5 zr+ySXP^^^%##wMOSC-scK#YGYj-vKvQ*tPe|6lrf9}K5fgQ^TZdNq{Z%;-nY=A9x_ zPQg>ipYWh5z4?Q?q4!}8R%{PcZF&(ik1#W}6VVv956MytuANCL8uA0)T~3wu+Iy&- zpp2OZ!;T*AXX*TgOg!yXP{l6S;UF#fWX3wKug8Y^Ospp5m2|X$PmDr$l@zZk2G>>n z(GnOD_`X&G^M~A`UaW-!Rc8>P+UZ0ir>Idg=hC%=uJ3%}c(%xHX$_SWBYub)drbt0 zyj}oD2Z+pe2Y2&U$jZT2Rhl^4h9Cciaj8sPsrfZ1VzLQ9{X+)#K zkdpMW3Qe4%fk4$w+8 z5)7!S0GFi@y^kR+ABw+Kqea9p)GsZg-m9WtYLG(X5K&c5!SHze4Q|5i#m;1@7!L?l zI^M(&eo0|Ea)31g!t^ikK0sf+$vvAe;>C-1fiDjx=vgfuPk}GH6G1@f`8@FD;l#Xt z@S#LqA2|5wn~5oX;J~L#64ia+;HQTZ=k|jSB~I@HcR8%*W9&%b!H7)INlN@KPbGHq z`2<3}AUp8on~AS@{;Hy*t9TB4S@tqq3=4Wc2(4l@fvv7PVl%4++8d%uExOyaIv@##^PR#D`9igE{(=8di57hFG%Y?m{p1iVZ84sb z#gg<*#Olpw7qp1f4gQ~9Q1BXp^S9}am+{4*tvV4OjMqGvOphZ<=+)H#9-wrxL{8qH zN?lNJ2NiolchI-ZQHQ_uFL_@*woG9G;KCDrSmj(CUK4?{+8i!3i=KBOLiCew=Zm6a z&3Hj4$xAHnw&!80DG#TYIiL4y-;9b4ync)hzl|2#qu}+0UcD9^uZXWCmbW>!;6MZY zYZXUUF#BNZpx{$PVmk@IE2ZMQ)koVzcvu?RLF}l>!bHeB5!JUk{zy2COGcunNMFLq zVB}m!PF5U3+5#&yh?5$j*F*ryvytr5m}B2_(C)gU5X1obilO5e`i!9>hW^FS2@Ji@ z5S_I_xwjd*fuUB0LJX~8XfZ?oU}zyjPcd{mLys_Y6GQhhbPGdwGc<>x`3(Jvp&J;Q z#n4p@O=svbhH4p_$k4?MozD=RAwnC*Fmxe9r!i!p}h<(V`vvczh>w& zhHhc#BZhv(&=!WKGt|k@#SA^lwO`24Lkyk6P(4FuF!URSPGZRH_rVOA{cdB(?Dwu` z1kcQV-^GyG?;kPbW1O7~&1R^Tp(_|##Song17H5m&?OB0l_8a(hZvf`&~F$T&(LCq ze#+4843#tFW9Te~u3)Hyp-UJ#g`o)y6*BZwhRktv7DKt5b_zq;3?0Xig`sSQdbl5Y zo)%pC4?|xu^c6!p88R69fT5iXZDh!lmllS)xP~_v+RIQQL%SGyg`v+FdY++=82TGS zTNwHaL!Au$fuXk;x}Tv|hGGoG8CuTJDu(W6=rxA!V(9M-EoA5!hUPK!SB7q3$du3P z88YSb8iq{yyqY0XKCfWNl+S4lneti7kSU*&7&7H^B15Kp$_$zEIi4X?K7YoLDWB&s zWXk7ghD`Y^WyqAz(-|`5^Av_m`5eZODW5|bGUZcZ$du2444LxjV91nD3qz)S9(+nj zmMNcI44Lxz4MV1U?q@dWxYJ7 zjG^fac^R6_&_ss347nJ(h@tZtn!wOlhN>7E!_YW}N*Owrq0<-|!%z`JWelCbPzgi% z42@uDAVViHWM`;=p~J9RpuO`M+RxA+hW0U(&CqU!tPFj@(D#26lDvbVZicoow2z_p z7}~?oI}8~Nt!L;{hMF1rh@saR+R9J^L+>*5GDGVadXAyh3_Z!vD-8Xap{E&on4v#0 z^gD*`XXqY=bcU8Ow1lAmLw<&S&CrbuX$<|6p<5W5!O$FrY8d(zL)8q;V(0>frZY5_ zp<0H@7`m9DVulok3K_bPA&H@J3^^G(hoRJyqK`%~^c_QIF!VJ;#SA4GI*Fkj3=L)I zeTD`zw2>hvLvJ!uD z8yM%OK(TmNvy+MmQ@`g)r7%t&Yb5S`%Xg z=ra9Xzxe|ej@GDS8GY$qR_4T{@UP+bU|~#n^iFRyP>bbM4VFyR?xZcYb$BGBr%mc9aO+Fv8+Kf*sq{=XdQO~+W|)~)oTbOeOw8(<5M!xe!ukgUY6Px&f46zS4k zxYh5&Sw*B23>GQBLP|Sso9@6bSq@e7J&OLN@9fe4!691T*;QZDQQ!R)+kH8PzntCD zDji^O(H(TFi(x$BbaGyhbu{HWX?*B%-O`_ za67SoX$D*&A69fu=ihO5p=PCIE`HJj0sJ_z4^G<*{S;u|5dy+pFNNt8B>Lw!*m1{Q z8gw~)KDp?YJ4M9Ql7%7MEh)Gakl&4iB=6GG;VE(lXXAyY&8?^I3&$e`wMdr2bjB0+ zj=`c>!Tbl|PU#Aax52mZI^xkGF7e~IEr>m6^?xmJL5{@15C`GowmB$_w7YQC`T76l)PMGSlzQMaZ9xcD*c8H%c)&KT5?y zToHQ^_o{E`6c=+^Yj>(~zSb+`M zR$|A|V(g#NCyR*r0x{-681lyT+pmZXUyni+odOx^DK=J6`N}PHM98e-DJtK|*dH-d z3y4_CK{Z^N2qK#Nf1(9_##7(@tzEyv!2YlMTX)#7Uj#YEfqfeAXzO4OncGC`GTTI# z;)RlAL%;Tb5!j&;+qTAD9L@(lrHKWIF_~)achUaGqa`kENzvYxiZ31PdR^>t;aJzN zF@wyn%u8Y0Te}_N)rwJ30i-KvcC=`f`aXTDK70p~_47W$U*kJeD)!B2Bh6}Vq=`K= zNL3ar2U>q9`3`EIV?{lW zmXuJg*rQ_q%-m1Q2l1s84JKhbjng3T!tHxM0(_|JOuV>~3<(avKl_J25?gRA@Ugp1 zA1yH{y}yVAY)M(Q>*z3rRtp8@KN}DG;O!TjESAUNq(DC24)915@b*x%Dow=2U%6Z< zi!%;7pMN><8%lrNz5Bnw0aOAbP$geY16h;H34ijh{pAycj)N6KQznE>Tu~M$@UY|1 zv3LTgTU>>Qcq=;bOc8FFx8pey`c(|Q-P8RIejcGB?yYRqM$l|kOxvlYeAA15OxYZt zxC8Nt8l8f=?;NL=edwv|@kkT#)580Wjp!8>^IoTFy|Y~H?np>dMg4sUc)xu>ojkEjt*<;GcrAq=2Z zJFedy3-J@uxOH7_NXP<-`Goby9r$hP*tg)o(Ub zIxcnB7MwQO;nn?nYxH$EfwF%UMt{nG26i^0$Q?!QDDp&+CwjBtjr#X`qj&A!kd}Wu zAVvA{V9hv?VOe!M{TemlUQaO=`T znDBET^2QcoA>f9t!6^_al#3*qDc1t`q?qz^{GR!ay~ZE0-&E1b$4gcw4w2qbN?ZzL zycBY(>fwB15$4I_RKeo7*ftJXfoY{RKxfOURv`|*d5tN~9p0lxW0V~)Va1i4FZD3( zO)5FvWDW@{2;Wi^vj98x_BKQxq!y(LZg~^enq!oi1_^#Z8v-GP{!JaP--(BG=9OYn zrqes}nQD(7&8Y-shV(!;3ij7}Fn@ky^nK#6OacWd#c3bft4H)E&_T^5#$(;{@HR^sH ztPa10Ab9i;+9&vxVHCIAtzQ z68aBqht zKb%^8hYA*G^FXL}Npy;WMaGTMDWzB#pM+-9K*!j%qzVST!Og!_C}c=jF{05m-jea+ zk&j)e0u@<+r3ME8##eN9z5< zGhq>eK+ijY6H+LSK(tyx@ZQfUwQh>5vQ^gCst@D!n=f!AzNT(BE#t=FLM|R3R8}dKka1ZIOQa1R;bSK;yL-VZlYOyutz% zohrCuHS5g3BZ1I(MOHnbRK6oimwtmE!ZIeIA~4yD-|##`uXdH~)vJ|^6Q&zaU^OMP zA@8In@cJEkVJ7v$>|>n!g>^}6Y{7Y$&rA~U{RKFG1bL*}(aEb>Kb?mlQ67pCd}@SJd&duzH;ox_ z^K_H`f$9u)Ui5(nK`y#B)3e5_s^25f%Z@I~9{4syo+&e&hbBSk%> zxZsdaC%JGHn{&g~A~`lro`{2^pV!l24gBmd{me1c#lS!%PQeDwxA;$lVszDuo6?uh zr>@w7n#xfYi|Jx<0@3({=7w-w)q#*AA?Kyq2OijA`2A$qP!(t%yijA|UY^)PD6$aB zg&L>Fg%BJ9e*=POzT*th{OZC!)ojIK#1t5r4E56&ecSibwDQ*mrwRr%k}Ij2rZ6$b zP@D3MbxQ9XMQnHx7zNXW$q6mR^0J;47+qN$!-phOwYc!Fl#CIw)rY_Tm;B4t_BkIZ z5Z8kfR=JVO5ZaDJb43l68Y zrwY#gC(Y;9VS6xt^=dr$gUO+}N2g{@u zt3YCyRKP|l~d={*3@ zej>#$>JvYO;|EdvHNEj67vd8?#UI!Q^nRL0e@C9?(cjNJq4o^bPfzmD?*TxYOQ8q? zHTZ4KY&meD1y{ad@)a9#;Pk*p5v}^itLW$0@DUf2pEaSQ2D!M{xlp0V6&2 zA*^6$c#nc>BL3lsAeXy{!!;UQEAivSjuyC%4*K5;@9~dT+u|TF1-pcZ>Gy0JRX*FG zL$w}#U4q_{2L|n(l{Cy4gNLr;`Z<7;3@w^2K>Kv*i^E>E;V3O$6d3bQd3L%GOed&MtXrGr2#5ci0Cla7VAV z<8|w&BUppije5ar{XF$K-pd9Rcvo9mUIL!W!JZ}3@}%GsI^a}9DG|IK_BGnjil5J- z`4_4H1`b}$2ygf5zkmiT^yn2H{X!|+fNo2?g+FLRmbB~%^np8iJV?fiqb+vf^dqU`aB=}E2K6_4QKP`M*M_&3sUe~vbz$6 zBs1jirn=8WdCCX=O@YUUikn4mv=SzP_I$c5DnFgdBz`V%hakC3RgL~HSK!b=Y1vCCi#^&s+?9&HYw6Cz$g{NP zd;FC`0rVqCBmu&+^Uv8V*p)bBm6k`Sb)xqZrvWty8fBrZi6KWs$hgdv;J5SwKuU+0 z-yi{2B=vm=F?e+W%tA${Ud9V?t#-U@XI1wTVvnT!xG)KokKZ}IS zN@P0v^J{z4o=zr1h#P?S<=rl_O`{b+gP=l>6T z?*d;{btV4iBp1kqzzG;^)L0XZQ)1B)ODj=qbKqXM(F@|M;;W^mlVW9BY!gLAOeTrV z>G2}dX@AppI#c_$ty4O!P1=r+TpkIaAR$VDRGtF&a1AdjZ^-|<_CEKK@Gz)T`~Us_ zeDvl#_SuiM*IIkM_SztUWlmtf^d18c(qqH@2wx=Z%~F1pE-wfZU&RK2*W5qxM8Olp zJ!pRYXT0HRkNNn^C!_EoUe+Di%dgpZEfWEkrR?74!Dd?i7LM{;iaFzE7pOVN{k=R) zuv9SXzhFmtp23JcnF=|ilbP;6(*^idT3KOTs;t7p6dq-|pOLbvzkSF{2&?Xh^w4bl zA)}^ahv-VV`K_gNCkr=hH^NfE^FB(%3*aZJ@5d-Y$DfC?FMB`?o4(cgDQfNHJ2;H6hgxH50?Z$lFZ8ki~$6HWVFkiQ#Y(G!=0qQuH};NUk`P3SAR-|c@FI{fD_f1sX_6}xsHiJF&r6G zyCIY2?jft0!UvxA)U0kdRK4qYO5@-`k9&^pKM1kO{JOZuxq8uje3@J&S+r$$TXowv z^NeM;l|P)P3=&!(bKTaB>hTeIENIS5bLuwJ#oOmW1Hqh&+@%nN;H(@8phhS>2J%{F;qxaCs_h-Rxm2 zlqqeR(g$~nv}-nR*Pt(N=;olMSKa^Q8{tr__z&K#S^H>UlI$S#H&Au(qWYEOskkE1 zA>r1U?p}(rE@g}&YwK~T!+iW7b%ni_0QXTTC&Vfx7Ksr>Ej)6SYzdA&LbWuge&yZ- zC~{JuprG_60h-K2Pc+M|q6JU>ida;Slv#i1_=5vtHDg82(@L*i50JmLG>Qw5&90a( z(MZCC=sX3u!o>AF&EMFqVs^svjMq*l%9IWI@&-ep5NMCD!koBCRKuemR|0T_y#&7w z@3ad7m1c}=NgCJABQZ8UqrMJDo>lE|9&z!Q_;4k!96DA#K2iG=;l5AsK?TN65?^9# zxAB|eXNdhy_vm=_g%8l>Lno?Bq<;%)mPpcJ>6!eCH;3x=NSGnrq!IrSr^!g>Legn% z)Sa!aP)b@fT(UKkg^Eq*LnUlD7q#42uQFS;3-)BVva4A%i2plU z%_k@qZ)e-rXu0USat4P8 zqTw`d1C64F#g4!?HUBc($}g+5eS*Kjb~{d6PX|?2fY)L_zf$IufiJGU5Hcl1VwcQA z*&+Pvhr}2CDGIdtKE-6O(-uvw&G%B|J$$Tta~<81SO#GwGVz5H;?Sxde!ut+>hCkf ztJPoB=o5I5CAsa9o{`V}6h{(kTbqx>?k7&1IJl;0^`*7^t9B*7_xk9r++WnzLR4&g zjeI5(aPQA(#XH7KZOjrVmz)Td?GBj}_l6^rjF_S3a<2qDs8&(JTBTJmTXl_;6si|> zOQgpM|Lc3`fARaE^^-|ZzK%~3zzj*XbyuoX?CHOY+u&rj}zk{u@zg__l@gq`?^#{qc z@ZdjkqH5*d_(=1GHTAp3gv^C)5;7yB;S>zBnN-Fb>f>YTkNO{Y9S3AC`GFd{tI3-= zg?hBk568%e-0@=V(E$%;t6Hv#{~>b659Gd6-QN~}8a7q-aJo6E1~19=nfm+%_aR75 zDmNRyBE%QDc4)7%bk_X0MdmkK$1O4&r%)n}y?(trk*mafBbR zBTp1d00s}9QzTp!Fdu6u-V7AvO6O&-zEffb##9A4xGWsGhoeD0(ew~7vsZF(S?*BZ zBXW&zjJe6+xUIq|*my1&e`)n+D^T{Ef~zmKy9u-P{%=LLm0h2CwC>=&n?m zUrBc1E6FZ=MRx(?l61Y-0z#G3j0((ckqN8E`yU*JQOZD{Rd)~UFKw+oaz%AKa$Q&L z;hP^gr?h85I5N=)8OJM1j=6G37WuiBS5)TA4;%Y>wrG3Zwa*~IV%bw}+qZtE>|B}Z zXr@Hns-?h)FOQb>Opp zQF=hWocq;>OMBGUa-c=y0pc+m22(qq^^9El17F4h_b6Pj!U+=oCKV&?Hms@sNChT3 z3hjye#f?HFpv(Htw0$TgaJ02-_irFpeyjR=!yzztEgX^4Vt)jQh(`z_|H9h1yGl&_bQlx zc+G%$McWi&hU`5Li~zp3?GtcLK~(CY=;ixE=IFIkgb^RsaIx3g2VxJ>58hnXhF(xn zvXtZSIOOe78sa#@Pu#(Dn~%#;4Q+$2m}2jgAy?RMz938hZ9xv!z2Xy}pwI*5oMU(* zz4FM|X5#?I8n$!FQJXZq+U~TwV%c7EixbU#mI8O}t!WO~@vyypihaz@pgAp1h%2qa znW7*UJAsfZYeJzTkU#aZEs*WCa^EH^_mPZNPX1#O>o;YEK1vPBM^{mHOhk@wWU>*P zfQ;+9vMMB+)DRLh(D9D%)G*WkZW>;WobEO#6G1uT|K_+bKKSVpg)m*NM#aRu0M8sJ zfwD<|pEI;h#Q<{_tJrK~6OU%%S|2)>hr|!gBdz_=nOq~Bmz{?LvgVxlWkSDU$$(M6 zD7%7q*GoX*K-sdnamtRB%4GF&ucIO{&Nfgh_(;HT;~INpG4HD{FIzOPlU!1gzBdrf zR{X%p=2WAQ9XbR-WCzMt)O5#xqnE+<0eiAUnx}J93ECti>>u0>9Vml9K z()b~&8So56&TEwwA}LR1)4gx=mDl23i7d%gAqbgE;4b< z6skVnog4dzx_Fd~L zCGD?5`59ATzZ(13e_)ClTal8KP8NbclAz!p0cptIL;`~Li4rx|^WTNBdlMxIJdq40 z67n!AY|qFhJ|Q=Dr_80)GdW*pmK7IAV3_LZ znox9WR&19vh-2)U`T?0dE(D495cT4W+{drV??vF&fIFb^f20Pk58p10i9i1;K6P)< zPq*4|z@?xt5`Z^VR>6$y; z&q?2v2%J_eN;%awEDXGHvgYi zzWnmb#J*-ryw0P!2e(FdWkvG7X{@nt&4@h=vD6P}f#?i7NEFO~D3|R6UX%x_fy;j* z1ZfAE8Rd9I+*bhUrA?;uBWFMrU*O&wVGo_jm1p44>rrIrz4zmPyyccezK?A}aY=kq z=Qq6|{k3i-05Q!i=L{{RuGqi7ok{PCxRigf=Z*>fUO1F{dnx*T%`Ep9JWujRW50cK ze%N^gf*-mW^pdP}v7b|iy)SGZv3g$R`7)l9ciZBrGvFm|==vASK3;t;*zjqFjUCkGeBuX`1P>;P{d$v3fHU+d`Ix>AjGwna>@LpzwDyT_ z@HF<*LV0zdCe}XS9`5BI`M0@}j+Gw3{xk|x`3>y@0^T$G!U!h+cKbe*p@^Fn=9vm%zyQU|51QhB<#eu&^TKJwfOGJRH^eLFe-YZ19Q9%E)wl52GYj zm;pN;wBIUPY!xjI6m9N|%flg^+sx*vLptO9nw{I^(J)KD8cYg7p7KXt@>IRW_1o1M zlX5won|Yqo8RIv%bF<}NTotqnu10Lx(mFsJGc4QS+?(C8Bw@w zr`agSGRUaZi0<<2d&HrvkkPOV3SGjarkV2>CdR;-OQRcQB}n40GyY2Hp&4{;&u2t= zR?*R-L#hYY57B>257fhCMAr{izr*ynfc|1WD&UJt9x7CC)C62F6F{xQc~4kCSHNCp z)or`zP)5e3n{g|2?ul;Bjqc23XmvZ~f&UN#yHX6J*f-5a(Z50a>9&H2iu3M~l+7OUBFMk^Hbfqpr5%(CN`UW7nt zMdRLtfRkOIWeO(^g_COTrh0QXK;vX)Z;FF>h6+m7ZIgjS63GN zp{C9PJ>J~twtO`VVHPP$OY6Sk7NMJ78O3t`6hB7sj0QGwY!$FJg%Vae4c<+a3fH4LI|^YIFP zxhEgpe0}93=dHXEeajif27-Wa`?@U>7-Kd{#E$u5H%{VLI5T*;xo~Bu(xusz?Dbe4 zs$3p2R+=q?Nj8lJ{!DQbrK^x_hMFy3@?G;~&c*x^c0x(ps$xRuv8d*C9B3$Qh^Oc~ zQh!6Wbf9^*pX2H2*a4jCT+y++V2A3+`Ud11^8bfD0DwNDSkQ+MeRt3h_z*Dey^6)Y zX^76i`Lk4=Sm)FUsaE|icBtnw>uh5%n=c3$>-lph)47-&rCrq*PmUDJ!zq<-gpF<2 zgp23atc$NOn?s{81O?o;ky#kqPWJ(7(DDp`BrT-udeZl&te1S6_~WNkZlmgCz0#MO z)vm**x?Aj%ICZyx2Tp#vc4zOdy&7-RUrzSEY|#U1xf6%_VjlxC8@BM}q)4&EA!hXc zdUbpe^0;Ks7!PXvSFRvHIe~KdLozbPGp27+DF}6sFNEVvrWKsq$Ad2otf*{5$}U+N zH2#WxnuGTqQ2;dB#Jl?(sSVkzGVfCy2w1XLBnJObo)Ab}x!Njeg`3a2#Mm3e1{=vc z$0{MC`m$gdYCw1>Q6^KPxN2gpBavt;+YQ1b7ME2s2j2@hI!l5@aEIAKci%=4F9eI6)pE4?A#?IV=r^GbF2T)RrYuyqn2idt|8Bd*_g>J2Ox2QUVw8fXHNufgqZ*~ zVIcyh831Q)nIw2=J^NnfxD2@esy!90Pfi4;IN3KSR5;FpfV8MMB03nfae^ z3$i@TADMJUBZMWBFX0K^9j%2pj1deP$E+nVh=&S&WONM|z*Di3k1Nx4ne!ineNvk= zThf80Z+;#nK%$ZrtOWBVgG;0UBfu^{9)K}eZPW=?z<1T1QuYZ(qw z3Kp;omBLa?g@_tW5{P&d)|8}o=CaYm>*8if>5DL{n2pb=%LZy8f+bGWlsp_oA>O-P z+>5aldqd-ckc_*62PyrXe$6iJDqZgG7Y=$+hBGJMnF-RD7uYBKy953xE+$_h5b!4R>0qCx%1E@k{97d(7K|8U=RIa!u|xbrkO4GXPPbI zdiM#e6go8?5UMj9y1+#NX(&*pGvb)@@6*UFU<;Hi7wpENo?-9T$UTMYNP*X)Ah?jb z(0v+$OG=aImQ2C$X?-y~kK8rbRzPwG4V#^YApSvcS=KwnWi^xa36q6w z4pmH+{SboCp$Vy(6r`R8@`N-}f8r#ht_6r7^<6mAG*WB)NFcS34`h85=7xRi_wL7~ zAovH@R`@9UFStK7$_c*$f1ocOB{1KwNsetUA&u2=@9Q{>c#w~EYgOA6TFqK*V2OQ(E!#-eB)Y}Y6yjB z?r@3soGz>U3|Zx8nk3mDj-C-7&UrHB`8=9EB)U_0=^Xi)mJ{8Q9o?4ee~Boub6L#% zFHsAHdF+3M%belC2s&h4_Icg6ztKC5$cz&wopr-;rXHG_-@&Ps@` z;GFc>yun!+5#RID6QtDHJk(nOmGkM0fC3#C+Q1M(MK77C^`P;ooZZunUhsEevEn4{ubv2BunQ~<|7Be8xsRS5i!!Otc z%48pwxlQVYO!lV(Y@S5+M_$0@1JWM{>Df4vCHf(Z>3XdowhJR|SWi_}*>Q8eg!6NV zSji!!C1PI_fpt;int2ZeA_b_+UB)3{JJGTZb7}{V?=f28qf;XV7lbQ`@erD3OxadTQF;+jtGo zri;zc1FKwVuySQKt^~tUU=4r*X9dw0#ZNK;ULEK?(f(Syb?ib+{$(tkC zvFmy=P&2DX)*V-Whgx-qyx z;ZFb&Jkd`X?^s5!=O>;h}?MNaz&7VM~%u&H1&w zW*LH5Sxy5GtD@P6mb7mWip4yKq&<%PPEJmi^B#_VlMnMA^}E&NWpo=ey^A+;P15T0(`x#*xFauJfmFEj9lpi0b`}6=2=3`BHxNC zBg&Xy8%zVC_2+RtP2Clc^Df|@f{$!Wa=)(LE2Ga0J`|x-X>;&%A}U3+3`K4hQ4K!l zNp&e*{g;4K$t9A7!qc!Lx7?H!5SdkMJCaOpO*mowNr-+U`ig!c@FD)4>qDYDH%m)> zv&FunM88m)=odaWGb#IxNXdR9&O-KE{vKpMWijfn?6>@6*>6Nr_8TFx-w03k15#$= z>r75k@GE%0?h0jnzqpnu5z%jM0Nc+D{ACnE&6X*`_M_z)v*kt>#}{0gXtDjw;AKko z`=rddwtrKDEK=X1q(tJ^QY`)>XJ$UyA0{E&^&j@{6Jwz0$n!9+iZKuae0QQw$qOVc zE6vzL2G2;+G8L^??RQWpgA_g6Lz9_iL%oM4Vh&8G&*>&X zFpZ>k*!2PlB~|oO=&FQQ7-DX@LUzNYlvHGHl+?d-4V4l1)ljFKjS`NN!{Bis`OKc8SSm%TdHuP%J{F6 z966Wp2yIsW4>U)vPzAn7VJ+}4=p*0PTq*L}WZoy_HI0tSj%|UFqt&NM0QbbT=OZ~v zgSffXdpTcr;xO85&Y*AA!UqH0&hPZrJXMzmO1R&#gO=6lAAsL3VO19Ske8PXdFc z|5E|uXYUReNSzuOO8iU*1`iU_QGbAu^m(zMvS0}`-hSgGXh@8Wg2sB@2{fM9DA`wo zP#F1p$|NxITT0A;N>%ScNq-h4h7Z-$2)U zKzOpYwsb?J+}@cPj(p8$8BygZ`z@0^Au?LAUW>HJasY8aj;zhnl2jNy91#e~#R+Hm zoazB0vK;h8mK{oD*_kG?>?=8f!m*71S9?Os*iz#NM?Q;$qlK2WHkBlVmS0YY6#NI( zX9SJ)iW)u~5ci|mIE`sl+FgUOjd?Y6Z^R(+Nj2dRtEAov+i%5Jdg9+rN%2pqW=bnt zBck6CL_dWN_i24>kp!h}pi!#~gO%hb!3LxK2ft%EvSTI7aM#U6(({Xy$C|NLBsmPL zZRXTAJO-7^*_knvwQg0obYuMvtRvs15`y$XoZG76gYeIqEtpMO#vde^H5h4FTRedZI-+Z7WW}|}Y@Dt7#NXEwnk!J&rkAw}Y$P5@PT2{AnvqU5LoV_a`8xJ=?8XtsX!T%`S~u6URT%8Yhzi!#Z#IOh$$mz!vjVxj0yzb;OOtT3 z2;S<5MSKIRY{Ttf3A1COL@alwaorzm(Ei(Wbm&T;gXFJFqQkQ(ba?b^&_VLrfDRS! zfDQ*WI`Bu(Av+2AzUWYXGCqiYezHXW+NLyw$frocKTImhcDIGM?}!iCf)A;Vy^r{C zaN|MnfnULg?4s=Vgb(!aQt74w+-dRQh7>;Bk>n1&l|yB$JSrR_T_tQ&;=po+6mOaH z#i%YO8|By+L!GA*&iirzV&ERL%^SvEY`aNyaNf;Y6`UF&rG6!QeLRN?`+??O%l@hy zpOZJpUTN8@i&g*-_5o+qZCAfr4TIF?1eSDkM{XIJVdo7>aLeT>?QT`lylFPd5}1(i zlD32uuWM8|AiSZF5~$#--Di2KWV$y{xmAp(*>Xqk_2FjLhf2LZAP~yJFd;J5TOTH< zq>Y|T#Ioou4cL!mamX8Jzhb{uw89(5&eUjR$Q^qkc^|U#2I|4I*1Qbs7q$uO?@+A2 zz+?S2bk-t4hS@NX-lntuJ9(ofru#3#`nL(|r~8t3O0@n`vSNw4s|357VZ;+N4Rm`( zF^{*ATQ1L-f)cAtt5o`bM;s_VRkrjz0YhpKNxwq$6jV{tg72m zlr5CxkwDRUIH9mZqe>2)S(Itj_ZSb{X_03IobAoA6a2t(#v6`|j?mi^b=!n0Wo$yB ziZtUgv?0bmJvPOuU#>8sA!CtMztadx#LIA*CbQ){qM+<`_Nt=wX|lOQ+D}4uw+j1Z2|)!$ zL6?qyO@Y1{$qjPKcA)bx zd(-b?FI?r4kkP7^p$P+n#?C-wc28+n{C3Y?ilLG7j@Ol}XX9Xwy&+(44wP(_)j>p+ zq^IBlqRL7Lz+D~s4gxBhR}GwFd6QyQd)NmNGvZ{goK&{SoWBv!nau;u<}V|3wq+WN z!TtXLPTRzUIL2KHGFSk^Y#4(E!4rl_JAQe)YZV3h$Q@sTQF`CEgwZv@;EUbms&h<{KV zJ!8z4iTMo8Z1@R2Q+PrBtl}|-EU&wPf{1#Uw#Ha;97f!XjP@JLM2|9dgEkkM&4M;w zR1;{kStQ-NsRq;`C&k|S&6y#C4-@=3WWOy)X14qj24^T0IuVTnJT#UGCbmCDb_49V z^(T622o9xP_t|4<@;_B#GSIaOKhyK`S%tOA*nu1GM^p-41q7X10TrkqOaY3zW5+PhQIuNJvAuAcmN( zC5;9%ATW>#Si{(bHNZ-gvDt_Tl7fLDgfNe&!ggFE?|86Ig0IHJ?@sDVqp25XAZGMNHD8nDMCf#$^Ed{ z{YUQm#T2JiEqHJI@H4wIGmN+$E88R-aURs!n-~62yxe=SrIc-YOsF$SO3C^90O<)U znsV{>p(in}oh3b~xqzOSi!274Mo<67RLBNftnF;EmL#P(6AycJNqZL<0etgtsCsT!}WlCXh5fVPi+EDaL+xb|ddC?M^T}kKavVJ(=p0^$2eJ4QdXO zS_-ZZwlUz`70j3#x$FOsP9Pxej4Y=V9^^~#uf26U#G;(ezjiDB)piR0MYgiV$p7nW z{&0Py`d@qjV<~?AC+2|lh)KxElk%(c6m<6}ZY4X~!}hB92CP@^bn-v+0mR^{1q9`9 zJrx*so*oQ!JNtq`t;xM$@c3z9AolyyjX#NRy~m%9Z>Jjn+}gz0&4xS%oHl-m98lv= z*^k%|B4KBey=#teaDovz!wFB3Y_6!~P1yd4((%O4BoR$vFSa~P2Ck>LcZ>r|%Bw$V zFRtDBBHKvLtNEvpGdaYD&gzS`;2Fx6oxUSuSMQK*wY(B>w7ndIxQLO`B1^(-$?`Er zBL8c79Co}mxmRs^UKB~|_7v~Etjg?Y%J>E7Y}7n)U`cNE9JZz8n+tEq!%P@^b~~-H z0neUXNa#C-XgXU$-wxx~ERKEq^G1d{Bx+1 z!?_>?QlnHvavoQ4{$v{u7(04kPuj@w_G8aU9o1i<0n)w*y;AShC)ehlv9?g6wl=e6 za(-1bhIrLFg_TifW>QvzN^K!-(>Vp~b&8=Zjz3=eO1XWJ`zlh0Za-~5Q(`ldgA@FT zV%f0_CYp_l7;ngFP!HHxovpZL?ZerF9{9W{mr~BTV-!Mnm6Q1k(M@XZ27AoLe3Xx0 z$PB;0l%ivaiWK(hv7GWz?Ebma)46JHLj1G$lIq=iUzeRhMW@~aB(5cCG;pB@{ zcR03`jr{t#W4Ln_5_!eGN3r-1{=^p< za9=woyD;S3k*!Tr&VBjL^?7WU@jEvc*fIYy|7slq_BFH%?Mb|Vk3`19g`t>Z0&bDZ zJKJR?npHf5vFBONwA|?CEHZVN3l|agP~V!5z!SS+tB0Z_bV69A`A%KM6M~QC!2mkK4DTSiZ5kmpo|-Hehg(s z9S+qh`A;DAMHQ8;93fPpbepn+=KLH=IIxN48-`y3g)H)Q#;(O{f%JKCi-zOG{+vil8sFDcd%HEHfpX&^x_53DC53RUY1jy%bIrNqJt;MBZD-DK|em2 zK+XovmXaJQFe!732S1&0(rkE%1{33Ut}m=V?gJT9Xn3$AY>KjOihORg`5 zg|s6BV%G$9mQ&j3nXEcHD}k2VusE@jR6pJ3z?&sxrui$+E^qgfIm zP|e9|XmNAQg~z#`n_}|XwG^uC31t!g7td4iioiQ;>}DRM%{im&6CE zw^deq5PIW~*#J&MabYS5OjvIiRsf4;E~iLZ0%anL+zybxgqq_Cpcj%;peD zl{FS(4cIjM z7pgWFz9v;;#HCK`xF7QBZJ^$gO=iQhjLzn(krv2Jb&J0ENLMFLUK1ybqb#teK3Pe z2vZaY+*=qEz^Q&rlAO%Ox@WafLt8ls8|63xkCPpg^}?wBGz)a-qk79#f|z6Xy{>tN z8PH54v5eq9cWz`cxM@tto{;TMAY@2#l*AVQMT7;t?uFVX6w>32_|Mc>N!DA{PD@qo z7MLcof%`CP0c*MawqlQnLKfSW=buX1`-s9dYJvdOUwtU0iZ#_#jA?zlG14dAhk3=Tyu|2=%qY}`S+$-YO1 z<~}b=5_9ED$c3lg*E$gEzqxQi9)H|>8F1|*exiio4b?YUZN6dv8z>eMTha%zHRmbN zJl%CNXu|eZNs&^rKb9$gLxLo!pDSt^=uDNMGaOG5<`Q50X?w3aFbw;QMIwN*_JA4K zXO-ZO0uE{snRmH#syfeV%j~h*CP;44l8JEM7#q=W&Ql{Eo8ns*N{a_2GS5Je_5agQqImV$F6-NuSd z4jagg>2H1xxhE5#gBVEs~G=Pv9vbw`fV#sdS$TN&>P zRd(91Gv;q2bgz-F!!~bFp9C)%EMv1eU5liU#Q(@w4-Qu(K-XTEj#tnTdp(9d+PBKs z2lK7gU{RYONXa^d8G3W?ybo2iX8?@$a>0C}ri2Dteeo>{3AnTVq!$0kbb{%oB9t@d zRd#mRUSAckr@`_W6SEy=?n$Oqtq@>#So8wL=sD$&sh`HwS44bSV8r>nDpyJ10`}{H zl1^0JX?57bXoz03+DE2IL)++;C>w`qWk#k_+BK4SI6y;6PuLzP*#-vCqCz={M2S48GU$-{!d&y(U+5_z*x z63jRgMZEtS!i{!U)XXHC(Fp7ZK2@knTqY8qAV%oMd*MoA4sE=N3l0zwRcyAfojD{j zWU;TMU}6uuXtJt5XtEMPA|BJHNT*~g3> zY*xWARzv2~RFbnq{u{oGMJD6Q-zu_IWp~BFzYubTheIkli10$-Q^;70SylHhRrxo6 z!~~tD@|3(F-ag^8m<+0gug?|Qo~7wFqy$^WBnAh`E9S6{-LJ-qQ;@_8jJWzLv$>Ty zB?m(xkqpX_CxcAk6GwgRlfkZdRR+5aKZzbJSUgIwnE8@Mk!eo?_vk)gI z`9TNV`&-gW)X$ko!GETp?t6i3V^{w#>&@}l03MKTS z@iuPUTlq-Lt4>BLWm@fp$$kov>iR-VT%;JA~T)TrIbD1t|77w$# zpDcUZ3dyhb;Vds}qWdPz2>xih#^Z6q>Obzbvrq=e%Oi*}qW%OGhpCv%Y-G+*7nuvp z#ve-u>4h`9P>fsOl3Q5BTkL6(S-*yY9O#K9Z9wa0d1V#4lFHb#hY4I|Zh@`9)xCgM z&NZNjJao5+$l$O+m)v_BdZx|c4S4J>=CSwv$!{&uNIL|F)wD>3?l<|sqj%?FsCGTM z3rDbbO?Av31a3f8B28kRqNw|4K02xVr}~zUui|{KWPO<=#_3&O{MWpXj6AHSF4vt& z&6EdHa|$I$;7i;Kq?W%akg6G}p>*x87J2+op?jMye|^X;mn;1*nMaO1L;-k=Fw(Gd zd%1HzYLY)pDmg21)3AWOI%vFF-#Q46V}=$*4`o>;OE`3{`kzQWc$Y=I4E{lnyP{DO z3N-I3lt|g87|%4;JUyr;o5+LVXcC6qi74M19|Q_7o@_SzvI0$*0;41jq; zhfFcHR2bb<8UH=_nVkq8Sj@XUr)=!$6HL#A>9LY5-U^zn?4nY24KWxfw0)w~=wcGAkoDaL**ceE4#Wvc%4iBl=DC>ak%uI~wOu1caqQ3GZu1SAV@ z*SxFF+#jU! zu^URp#LT<2MSi8?za=aJF>iD&LVU{vrN zs^QtYu8yM$}a&F933QEWsDE>IP9zzk?#Wvj!?|I8?=s~0-@D&4KG26O|k-r0o z!^Pr>6a7G)G&8Gsdi~;I^-(b4rRd?T60|40akBr5FC_2-df`+Qv{U?gNqm-N+E-0J?C#w0BXgXzcM6JyuoZp>C9x%hS2 zaXF4r24r*F4}pdZd740CdWe05`RY9ZI03`mfbf;VZ#5te4&m?V#^jBtsM8yh`w?1A z@`Ki0S**irCNx!#L|hM{@~UOS5BIR=4K`YE5)d_ ze0oZH8;8+b7NYR_%kuhG>@6#0Q8(wQ?7-Yeh*bW|Y{ z+KpI^n$PP^dS0d=5_3TzP$e_|(5Ewzo@jar(mNRrDH!*c`1sqnhN|Wim{sV{BDy1 zN6Tt0%XEanhY(nvV2nw<>^1B;h=d7Q7Ug592(gHMp~x%|-q*~Vh7IV{%9y8#1vxIJ zz#_(yz}FihzCpx@k3mW)1y1FefhH?ciz``H*`mju!-Rxc3~|N9zD48l@1MMYC-@Wg zEqwS^HkNUM6%4YdqR^$~R~Mdva~x%vrJ53h9`G>>{`wW^erUr>L=)x7q1tM@@+qxYpyOF5mtdy<-;mb@DwD48Hhypc9RX)lD z17=01&23 zgw<@7pMOiO2M_du_sQ$QnBMR8dXV5Z%m?cM#}LbW$nLm=EWwPx-{Ai^#O{){xmwod zx#$Wk(1o%<6EQyvf4F0n!+%(xj)m_=Mi1S1HU4R4Cv9Jw7< z^okYvQV$asuG|r>j5B?ku<^r+uKgof>#XQemh9!%RTeynak6JyQom_%!)l~)+)QA$7RBNH(dysV3SseC+KSF{+)ojX}zvXje=|s~wbmq5eZrsl<==nX*>6F~A0vmJk};xjA}O{E zvW&Mx#z6S6I*tbImB0=HH1KnmV(*6Dt?F8r)XC~k`f&g=j8lfr&Id7=wX7^apU&5etzKh9q|?N^K^pW zcet~8k)SVLxmKV15q<8rr_HyN|3lh6^v-$=y>AeDzh4mLohkM-{vcTaG^!+}P(;uK zs(^_KR|xZCEq=+0e3hm9#$kPgQCR^l{7_ax7=0yNnS(I8-s;(+#}9p-&lrSLe9Ve& zV>yqDUuzW3u3+Ro1k%Mk>hio@Je_Iqx*%UmS&FMjGOY9e|L@Npej3{~3>CIZyvE-N zFwMq2h?4Gk;4j!gXkV?6=UGWgXS`mD^5Tb+_ zDj<^-j}`gJ9W}%IlU> zvR*Smu)POB=Xr|XvDdJYj>le4 z)nE(G)8~=uR({I7ag|x~5pjB)5T^&exh+NQ!<;ZurXbWaohf z3bUMti|0u{_)Is(i4NasgY2^5YGKM`q(v;g4qnH}@wD-CN)L(LMW0_ija! z=%?ka-C2OYyS!=qWhrMudDB>w!=(GIV6ZwTTFI9!=ksEi%J!Pi*&Tbh8>|mH*eTzO z+ch+#a|ge>k`XB@fyif6;VJ|tW zai0agK!P5==qte&u1d+BQhGq)%c(HqEQ#Y4P+zz5fAkft2p>>{A;{4G4mTwcT%s)n z^+>Yvz9aa5YP9xM&y*IbiJ?hQ@%_hyCzm5>_6yx*+7eWJT2hZcCHWZMxjy^K_`<|` z&`U+=2UrJpYW`0Je*gshRkTCV3B?`;>yZnOP^WOhFLYRg zFq0fWFiRny<`-8Bzj#>li=CQZaLUWo@N>m4kQRF?C+BDuI-UK6n5Fh(GuiF*V@>RMGvc*M*eB+JwAp6THq* zCt{x(g+#qcP86@qX$cvJ6Z$4^3Xzo5(rz~I3zQK?A<;I(c))V9*vkKe*<2S6oD0(cse zm3XsWYYvH{9@1-0HERx$8+y$tNHVm{BvToc##9E&nxiDU)S9!>9$UFM`ZBMYYApU=K=xfgK>6M_2`CA6i! zzgEe(a$hW4AF828u?CD0U2z;3U2M2NJs`n;-4g8AJ)voIn*6Or?u33W+PZsC*QY7D zfujoZ>`$ zmD&7NsPa1eR98oLh`4X8GET%_OxmMQ`Myu}MQ@9JMpY{k#I90YhaFnosc{lT}tXMQtn-@C(~r}(bl)Au#i$a}`0vzeP8 z!E*ZDznZ@de`ar ziwT0C#0f{qAb4>Ar}pzlMxMvc`Q9%Hi2uS5k^%9($`ddDG_MErd7X@x@3TK>oHmuQ z9}oYa;rR#IT`3Vdx0kbhTz1_}BOga|Xq4GdjK&s-R1UP)D>E4$K{@6E2l5sif=uiR zQl2Qc9gduwOsr-FVjfdbe{2iFMrJllMaPl1xCQqiPROMsNa2O@7#!jG38e-dL2I3$ zl(Zu#X#;3k`?iP(p5oMGgou!>$eNl>&&v2;o6iCzJ%N$~B^+wK5DVSH!*z?*<~Xva z)U~UvcJb`!o@^X00i&m`O`h;+kEB3n8{Y2hfN`LXV>33rss-YkKpQW-0MHlo3d!2eWLB?jB(IUxA=4|G_}h)m{b?HNJP#^$O-8 zHU1aj$m4nml_~l^P5YCTc1-)Hd9U4(UjN*`ru=iKDK9zm^?da9kBlRy1k01h?-RSC z8V{&AyBi6~d`K96h!~KYu@e%~O`@gBE^%N)zNTY9x+Q;EA+8Y>1Hv|99Rrf1Sw0Fg zlc&5Q#BKZ@QuUa98ziTgy+j9c#{zm4ejGRBO3l5k1QRD*yj$vw?jBgT-Q(hxf47?T z13~-1L>T#%y%_o7teVTPHq1^ja!YIBma)n*4!Gacoz0R#RIkLr?1~I55IfXT zJeBAZ2O?wU3S@P!X6-vQPraT}fKSb_+4u`c?MxUUXeFC1AsWf@Q3zt5FWX9I=Ld@p zS}HtbXrSnAiJ=P=9S9)cTAe#Xjv3Cn9n(^1n25rm!L;yE{;xFnxieE-XCX6C!f8JX z_vnCBa=bJJPf5;2rf#v`LN@We{Mj&K<#$jil7&x!3%hv^1V_fd8F@$0=VE?9Xf`$M0U8S`SZI{(NOyROS2X zKkUoa3*!As0n)Joq>Ut8Kx;tv>jjam+mQA&G??%C;XL(k8f2Yi2PE5=IR2_ik{yUP zgw8{X#n8(VD!|H^CF&2!DR6ZsqXpQ*g5pc=(GC*&g(}0(XM_y5XG_8#fhR_|58vmQ z4FMKHy~;c&ttzJeYpw{}>LxK}u(aDMdtGlQhpkR=uFz`H6j6(0q0}CpV9A?-lH(;L zHeGlG=CD;OL)`7M>Xs0N8KBn zLBMD?n7JjoJ=5>@QjIE%y)q87;jZKua+Q}v7N*HueV}8w6d<0(7^?Id&*FMakA^XP z9REsx#vtnHy@o`01WS&=)cZLP$CC4KENvdT)8=6f9XOjYBn2%=v9EFIB1ZFpj-i_l zoW&R<{k^7#SM_L^harsS10BQv(1EiU!xPCdwCXFyaFDAHbPQ_&=b6WV+L@!oDF~ab zcXFuR{7qWYgvkFfN#r*q2_%avIFvUotL!g2QI}#=|DYKa>H^eJl;l)_60#KcSS2fA zQ@b>SQi6|gE=>apbb2w(<<|=KUGER-NqT93a zELz4&%Q)_m_cP5t#oClwe;OB{*PiKH68&cM{^EPG;GdzjublM7PgtB&`tg~*tv~tO zcNp6bU@)Dg9Am~fucQD=NsIZO3ojmB>P;Y6-b=tIjZ@VQSs+e^7(tIuLn?~ zjJ$94#T9tpzxw_x0DB+%w;1O|pZZRcFX3v4C}Q)$;A6Xy(GgffhUMQQW}lCMt!FGS zK_L2GrsOVs4#_SC6q7xDcXEOE8N2gQ4}k9;<-$Ur&ZzkFN%{G-oFV>Q;x`iA*$((t zrh%_J&~%x*j=`O=z*{&`7=5AiSF~cHEu5JJfuikN?F|&|4063)5r_mo57FKqOTEsq zI=8z^1qGeL^#0CBT4&&7Z)i^TvSl25=l;IIY|>w={*BGiJs1FAj^sSAvEk)F)5Y#y z+Ulbph%aXx%S&h!M+ekW)@=ACiynqEcB)E7@8Qa4V#%InHqLSSF>j+inb8v*Dc!04 zBa){;Wgw0l_1laP>rV(puCa?OU)5g-NN%D+Qgix(HV45hLaLSnS}l?DdN@^2eyuun zXltNkSCHc%%!M7Sj?w5YWcC=V-L9aqxpz7LqPi7ywa1p!LOy$! zBwxCa*mAbw%W>Q8A6d}wCgL3v!;LzY7}sGh!}9{k>_bWo{CnUk$eiy~i~>0^+Oj#a z`W1He+2qY&8+zq|`gR<8%gxYn&Z?Ef?HTs#oFlB*B^X`5Jxd)=C;7YUk0bI)esNAy zun*S+ob!RY+RMJkXKxhH7cB<#>R9_7>UW!Aa3%t#+K%0kf)Cfdq|j4xrf@X0IlqP5 zfRpL)fTKF>zi`~wS=69fmoLw@>3991J4CyL;pei&v_ZCMk^v=5(j%bYzN*X-4FbXp z`>@LOlw9BK!||r{^TYd@KS3oiQ->6)oeaWhUW3z+yJjHSnJq~UuW95Vgk45E8MRP;ltbn9D?DxqH)Q_*qBB2GCu;?v=`N1 zt~)BiHU3e>2QMZ8h{Z{Zif1Wq1t0UcSFmIk2RU?F(0ULyCC}gBQ`p7!^ztPnZ&}D@ z<2a?_UR^=|hM<3|%D0v5g0vLfMPjNo)%RI-M|3ZaseWHfzr8Q(wkd{@>_ng>4*S_a z?ExcxQXjn1C2`mbwWoI>;O`3fx2cWD3J6ZVmFmE(WCwo5hyu>Vmfe+rLZ1!V^k&vz@-fNOcce#=w5|9Q%Oddl~{)O#fl*lW|aRF8A4LZT+Z z&Us{}$YN~iWjDOsWmdJ|ZC>$n;9kyG;rR$!CYDWsKa>#}p%;&4Vii(KtZaJrd zbQSVwwB2rZ7Of5tNmKMz)g{zvws5v-SES&gj-$pp&TnFaa%<+4$bE2uV}|8CdTie3 zf|0q!C#(*_UJt?X8+|~FER94byb^T6S(%oTml55QORA0Nwp?SA{Z>(D(Tbv@9lMHN z;mGrjJ)DbY=P4EuCSCe+>maH5TRCHVa^wqh*&s}I?>DNil#Wt~9C>FSrEm1fUR2ax zb;;b~a|1>DIqgR3I>PyM^pRq%nQ|afK0pvJ{sie4#t2_PKoh)!^NIprOvsCsHW!C8O$&3R1IQ4RpYh8;xgyj1st$+~X#U zL9*$D?Pwq}ZJ=ehD(29dW!Z~^X2t4`;~gCK!uEY{c{q|8;*1@GXOhjjM$oLD49^YK z`U*L!qvj6ID8l2~a9$%NXQH1`xuSAKf$yCdZWWT$tV$# z{l=0nVl4bD!QZ^>c1ig`-~VYNAuR3;bh-bR;K$s}Sss3H)f+!}@NV(rENeY8eteLX zz5n>ZIgf5R`s}-xFV~z#z7+m(l6WZ$M5N2t6x$H#vQuAa>GC{o67tgpl2WWuPLK4& zOXPknS;-rA;@2O!h@2WCU79VIp$#BfiFZomyJIMo@htK-4G~e2eYEx4F5>i)pdGg& z1>`^8mK*eo2&uUc$^As|8xSy%&E%1)DGnd%(uuo7q+~E~JJpJ+KV)rMUEf;RpP2Z>S|35NTEWR$rFn+H|V<3qH< z)LbA_J&6@lk9(17F)mW(6MDK`Z@B+^)9ucuIXRz+(48~q6MUy3$#@cDajyavf>t(& zra-_1WrLL-2t>R-#N3?2N9Tid?&GqipGEm~5?Pj(FYW&tdiD!FL&2J!2Maxu+xm3$ ztX7TQ^sLqmQ5(;mo)c|*^qgq?wDc@X!%6fk4}~({B|ZD~@HIWB_uv%tEJHnso_YAc zP0s_PaetDYvxJ`KzFT@ufc$-%?srMgrx?;1>3JX%qY&=v=M+lF;~kRLO)^=q3&Af|Y5#d$2Rp@pAciPxLi5x` zclASJ0wq6_icpb5Y|w57suW%-M5UY%&hdn)ti%$ovRX(YF9~HSAVjl3GI^2Zt9g~m zZIKA)9Ah>#p(09wtm@0;59z$d;9bSPR?HVZcL_^2`QH2FBcYo!hRMklRP-|C#1|mv z#z^#=$zRTo2@T+FAQO zis|5hc3yHtu}8TgKAmtGt7NxTa@;D}#IpDn|05=-5IHW7S_$7WA#}>QJo*YNGWXj5 zhrDxvkE*yH|85?TK;Qn(s~}au=Ux^NP{TtZ|L>XE-E6`eL)+iy&*wvS z?!EIkbLPyMbIzPOgW+8r8!$OEAWc9htjs&qxms~peMqNh<};*%;+!pt+X(3`x5%WR z-UgO5)DM#C1@#PGX{ayLDXKe$R3AfqkM{Wh>QOpHGfy&}y`eUFr*ZvNog&{VdeRH( z-=%QB@yG@dw4{TKs0~#pNo^ht%H7GH?I^X!Iz-+; zN(3Px6c;g72u}7Ih6eGW&%(mMfcf!d$Wo&wX7;;oL-f-8z3n@mcPeF7T?N%$s?pC!9ArHWnhg9LdhN)__#_U$yi8_ejaGxkWQ z?J3A+rs%Y2cRG#yTJM41EW2t|><_7+L8kbEaRzy;1ihQfEs4(c1%BshoLYA&r_-td zfnhuSC*F)VD-NkuhT5^K8pw_vPx;F4wTk___Y{&MwKPHPmNYRrL++%(q9ieN3JH7W zz6PPC^jooJm0>zD8vlfLD??Nvqa*R*$|OGAP!#5weEIZjC30!cj!RV6MCZLPnZ!)$ z6n^$;sSRRND^*fnHk;SWdG@!tyhb=-;<_iZX_WB8#C1debx&axQ^ESO}0{&g}@ITU4%03?udib;`JM;m&5{HRT+qxRCgPy;^PcvTU;MkHjUNT4B zFto>gmCmW|H-!q5_isu7KAF8&!=JB*KkwA682-FV^Jn46@Mlg62!9rCoyMQtuQ6Kt zny$a@<{hNUQs){!Ruf43bPRh5BXCs(>a<`^%VAGy~gDO!7p{o zL_c|5pqK1I!e_>15R>uV68v-Ae)#91&F?iyazQE>r4UJf)S@PEDsU50hClax#fpch z3*S^AtHN#};|(ab%$+GDKvy`Ip~aOw)@1HMVBuY=GBfwJ0E@^;-Sp(vDFaL$!an;G zg(~WL5dddG7|Q2e?k5xdBIs0#YTToY^^Ien4EfOre?>mol165b3+EF zO1b7$sWGl%h}AWhjZ;;eIk{xhRngsKizG-2Ivw2R_mN5n#+^+;-;tbqqcavCMZZBu zQ~J$tenr2L6GEcjjO15{yzC^rOamn!;hB%2Fs>95n2lfJ~me?g7AKCourm7xWPQ{XIng^y!l>_zQ_{R9c%1!Xl-0${_r% z*B~e*{t)JmUr(ToYW{rCt6^-8&B}&blm5f|s;37>*wW7={66gz`V#cgc3Zo3xdwSSF z#l~KPrOW{T5pH*~CLo|&rBmSe!Gtoy0V64&$e}Anx-uil7kS7K^Xir#6S;rMP!M94s^df;o$a1AbLY608-*9b1 zF>`kTUQpgy2_s4w@6`0BN)-D*?k<*yQukkigLE9Ftq1P65T{s{bG!RatU=DeBC67P z|2})KpriLHN-`Cst)p_$K%)CV0*F1<)qVG09J*!9+9fs?>zfQo0IyMi3OMD52_)0W z-TR2V2?o3MC4ue9GrV5K%NpNgFw@$T(_osI(*u(m7$eWma}E} z+=^~_Qsb*c2-tMW_c?+}<~?}&1zGMW8r1p^_T-+|T>rZU%za8=n9cmZPS5AGNC3=e z3}k~{pWsC%lUgG7Ds}<#ATxJ^$X-dIOG+`LHfS=|A{P>u613cN_cs2+ljDzU?qWeI z=_UXyNV(k$m20Rf;9ouHXFuiLb0k30e`3D6uL)a{`vMg@`v8+}gO1;{&+(Jn@cOL5 zb`=lqpz!@5MgAlB-a9v{C4St$ZHk4#|2_xkEd(KUzti@=d+nD^SGugp)%D}`9XArg zD#FD!=(5*|kx#|0x{!D#4d|_Yad+<>yUI<)uG%TFs|rNrlo(E;-1?QWD)(0^9Tjag zs zVYkc`L|#s4>s2D6A!Sr0wDqclR8gh0b>0u*`zU?~@mmon`H-{R5^&6z^OjOR)Jgg@ z<$b-JQw?}O^m{j?ly}aiYH5 zO1bIDc9e2cB@wmrWY&*LDt8r1x$7^}4SIS>;o+T|=Kj6W08oM#&Ar5A^K_VhhV-dHOHq2h+5b3UCJ`?NyOD8jK?OeUtk^ ztf4i9Rg5jRHgj64JM`7PqVxPMO^8zH0qU)CGgN-ch7{I z$@I~z6%LCbj!o?Sao9A=(jJhJ;J}B{f8ns7AP9Hc;}kRL8)C}ba**q1yTmi^OMFXb zhW~qLC0`h^vakMkjjpVphkZ`EKN1>J_N)n5CUP)GSbpc+qDsfh5tksh?S{YLcsm#6 zhic5anYmtx=luj{b)rXA6Ar;L0t+r80C=73-?8dgxwx{1CaD;yLr|p2-MLZa{@m}n zy6U!jFR~2(f`v)_TIc6{Hle5h~pojM#wR8G}c&%C8b!4=4*RcV7rs`NqUQm^>w7U+g zpuDPpYF;N)x)GUA?nj{5)s$a4i4vVPFOCpmn-g_ zn}|9{G|J10qti1Z%|>Mm$BaVUC8~L7T#7s+c9$-ZYoZq*T`X;QKY1@<^pquy86KmO zy9(F#=l<@Nk2B?jf52W^H7)Nh%e%R2EvHe4$)HZ|+p7ZhYaF#`X3*-_de%@Or|MNx-u#E*m{G9LhnryW$}JKaEUx zBT{IBKiIFvABR5N)zGN;my(>Vl8pcgb?{u#>v@w>C%eCY38GK!cand3TK-5^C}?@t z1-)yaSodm5^5)b4SI?&taWH!PiFah+Bwe{8LB(?Oe1eS6nwIATy{jZ7rjnOa5l!HU zoR3}Z9B037uS$^gyF$_sHa|kp8wa+y`MH~OS7|E#zm?UL5C8|-wE&Fbt``}x!_!Ci zK20Cs+nt*>zVf`H*Yo;b&;8TrL-L={>si*|B>l+uZ=^j7+smQ8ZW`Jkw43rL)#sf# z`%a)B6@KXgZg({ciC|tyY}RHNW*|BlT5H3k-O$#b+bS~c7of8@IJDZ|gjb3`S{r9y z{?)SKb1ffdcwexltzJRM8{f}`{N-4D^!P_-5t)@^@ze7DY6&620sM|!_&|`RWdVDM zS-)29a8-x<t26C4Na+h$}5q(dBHvC^KD+l%I?}C8cLJxcN zm+2<`jV1c)(%%(<+!p#PYlrk#9WFgYbV+OgmMFO9e+F%Cei}V9^zlFO$BnC(1j}0G zKHT%WJGs|$Ua#kq)972ui;R$@f8qfQ4tn3@#4QA?!k;8g{3qqV^Cq4@X~JQq_g8K` zV0z~Sc29cGmY`e*M(_XKW%o?)3g&crr@t=!JwSRtkS_0!-VdaXz0H*aDf?eY@5I(i zFnE0@(FGFq3Aq^-e>^PS;sWmI^_)px7>L#kZdfRxx8d;}$jX_T&+o`2#E9Qs>^H3E zVCY8^mQO-qRZm-bcGRarngyq2{l1cbU0rKfg4igwb9&T|C8r*`B9#KoW>vJ`LZr@D_Tdepr?fWtK`%5fhMX(G*^An`qHC%)gh=kF8i6W^!o`THq1CB7@q zrL_8c=zrJwoSV{w7A{?hbc#l3G`<2=`=gf*wzrGi(xT)RIlPOS*YI9KZm}^2A+~&+ zfy9!MSE9#Xcq2_GC6(C$5mi(mFTcGaVE+>trJ1#~m+H5!hw8VYx9a!*eR&<|NL0T= z#Gwjsv`Gmu|5;=z)eoYG&(-=L$%N{s^*MRg?g8D;r}dbBh(6GK_k3OD7N^ZWDgRtr z{+{y86_k`|r{|=3@xs}?{CBtv!7K|p<1vcdRD?N1TSczR7e1R?Ew(bwyI)X@#cmbX z31uPO%hAxSB+TfIi22*)CI;q9^|VfAg;BYgdljzYtT6F@`?u`kP|E6{J<=x*JUIco zt15Nd0?5$)l>@5w2S(%F*tYaB?5pt_5$|d_KAuS$3tZl*L1L&h=7}#K?A9~kkgzmy}Mkw1|T6H+aI`7A;;e18PRJ*g`C6QOC|4uhFbiq z)c8l9RW!V>{GS00-T5V4j@T#mUcX#C*PVZtnnU}_e@l=250ZcHbq{3V67yN+!+R99 zG7Eg-qeTFo^;| zwzCdr{lilAODMpxX$&i1?^O52BpBApYlUIGlVDiF%Iu-OfV}~B^+)UwTn^K1|A3no zCb_A3iFxV5!-Jcz$u6+?;|l(Nd3f4*h`rjwiT{V_L$dz8FoC#D*W_M#JwG^@Fzo&0 z{Md+(d;0vqr$^?8I*-8lM&<|iZ?O|8^Wz=DYBN9HVScD)AJ+2UmB+|MK%9B zjx|M{yOJefCk!yqR0hNCURz!irl?rueEFJWv*+$1>xrqX1?gEIg+KPL)sn?V)mkoJ zleIn%C+VH_=dyCBtar)RWY%GO$hsxft+z;}vfjW0>qvLSvW}QKFYCyb6xeU2gFQq#Af__Z~)mE-abA18gW~z&el62XHugL$IzPjFa4X=^yrr8s7n?-9j!p`kDx*(9)GHVUs)7Q5gTJH^sUa$bH4k?Q$)}{{6&v{=gkeI<@}r zd|9vOTYEi=dXt|2PraU3_Imyx{aMRDPL7u`Ro;Yh%1 z%)PoBRq6Mxe3x8ue|(>hSH?lX+xP9CFC9zDfBVH3?Yk0*B_Yp|->u>CFyQ5R;1X~i z+bffZM-M}@Up#w1KKY z=tdQ|ziyLujy8)>HV(vk}BWA+SyJSIy6S8EPrmBeX49J zIAx#aF%h*gRht-3n^;)(UaNdrkkzA26`27Ng?|H`dv%&VE6-Q;dY<0v`O03;wY{Ea z^m@KF?b#{Af+fHVdnp|qhw_v#@1<%|ro0E>ks24fSJ{n;GQemMq%RLo8;W5b%RG7Md_58jt?Yr0qB%<5I zL}25F^~G|wN6ZA=VZlC#j&@Cy3gTYtfEB4jJ|bpkvo_7ZtY$RMLq+vRZyC&iA7xV0 z5wEeRZMRq9YnKJ>nk`)trs4y28`!IId84|kzEDp6n^aN65 zl_AGFss{OU-wD_s>hH|vw|SSxI}uBWPVpXr8BDvR(z{tq*Xo#&1m)9kX#aSD<3{}B zlh>}*$vOP5rCjIN_LuA*_dOgPO1>0)+@zWiIKD!v2OJyqVG1%yP_@GX$7fP-l&U5K zj`x&FCv99F5xb5$`7mCm`W_$JJ6Z7I>Jb8t2TAq7$0h2M&_}LL^*tQFSHir&Apr@Y z6yP|YR1Y|gR-XipXI1t-q7R8escBUO*Q?N=K#zY_^e906L8k!f^4>%{EJd_!eNVLU z+$2BSsprvjO)Y?=&;IO(e(yO<^c#5$aRHvR#{ett9g12t2a5axw#oVIy=475$QJ*e z1iy;Jl#C??#64Ht)+_&r{p1%KO0Qpn^6jiDm!TSPodDE!~au`9P}CdCnV1=91Q(zkds7*O#kOnIsrfWLvaryXOH>#DW}GK zJkxvBcfj*ILdiq#-#SjVB>J~EK6z-2<1!)Kq>fqSK zrz>;+Crv;2^ze-mIzJ@%GAMcI<9B5@eeP}i;=k#=zbThR>DUBp{p0<8lY}MUnx{N; zdRCFkb0e!QJ4@X_j~@Ra7w1acJ;LnOupG-_PxL1?1Z4kG2iQZ0muPwUq6eeJ;IPs{ z;<-v=&g=YtArY!T!q4gR15yV%a^v~v$bLD;Qf==DI(a_#dwM;ssN0FiBO8vSkiuRf z6)0_1k&B6|{RzUFT>V9gY-jS3R7Uu8hH;=;Hx1cAsv4leOAb~Cj`DK1%286Z6%M9X z4a$AP?1+&N(*#;O>dUFs-YwN$Vg$yCApQiE(=w6eu7^s%ftiT5V$3~O?vqre#U-Y9 zr7~*HkSj!;$=o2?DlJ+A{KML~DNq~b(@nSj6Dx{TpnyDq!lH3tAPP&z8r7%Ba3M*S zcHl@Z;3Eg{B6XN`lsu&t_n`xTSpgh5hmsapCFaYmM1}C?`M_$9XuaYfj4&{H3b}RZ&ZMUBsO}X!rde#xV_2!8wuEISr4`<@>|dN zkSN;{OyjzWWc+!#;qu^n_vne~dUuk)u`hxC{Sh1XN|}%_ z?1PmkF1so7rD=&L_qNh*%0CW$hMQCRv6-o^dtEQq{M=7Qv&;SY#BRQrC{!G8uhM{| zx-TjjTdKR_(5s82pqr``JE?96sY8UW+kc=%!%215lRCuezNhA~boPW)bsa!_h}Gq! zI@_RAKsWNBs#A(0&J_%Y(iC6T0K$C!pzJ0B>JN2_x_^Esh>Yhbc?{ao1O8TOz$;TD z^p!)YSXCFf4%wd>qIaLvwn%!UxG&O})_;=p8v2Qm-@oqk5+ z`%~AqMS$wV`X=;oeNUoxrNPJa;ZR|Z+dr}b-2O3GvEi;@^ppXJ7VurTF-!2<{T25O z*l)9gt*!zo3~~<$#?O#1r*c}}+@PE%+lM?()1PX%9zkc5F^WIkN8{B`Doh`*y^!>$ zf_km!x{96^?0@c-N2O`;SNU{UDNfa|=hu1!xD=E9d1`_BzFwe8JCn=Z(cCT1QrEJv zU&}kPcb&U4_an2ZSbPgoE8VHOxG?`zMK5c{cW@QeQwZ>==qjCpH6MQ{72Tg=#dWFW zXe23?ql1I!jTDZ=ngwh?bPK72uITfriUy}DS^&p7kcwnSK7nxAtiS7O%E>4ijrXJw zCYP;h@XC85tS~i%w#x{%tj*5dp1ZlXxDrdDOblVVs^}r0Eb?1n+uhzVE$@oNO>9HI zy7(i>hn*Qc*sy=tu0670C57g7yz9=ORy{ug_IkHbEe(xoy^!a>^?L5?_578z^+obe z@Adq@y`J5)XM*u$i4+x69qr+~E|0Km9 zx>?P^wig65|IYS)lvtb&qJP{+Fa*5r0Ux-Aq{~2Y7_;(sNMnr$i;v&Q2>u)Kzd5m( z91uQ)wA>{cgKo3@ekxi!H8~c0o1XE9K3xNMC6T%J2DmS=VSSl$pB8IFa(DC^ZYV}d zD3%ERBhVJhh{7n&3gW0B=P}hC_0HKiFO2nVU11JeA~SN4@K1G^{YB9VTe*#M2SUi} z_UrgneXeCA7g_EQhl1$P&zdWCSkcq#$7Oh`r?tzW&4B& z!Jqi#j_dV2wAb_IH2x|1ThpEqCpllUGU#2$pt%ivIe;59)6c*3v@fVYooX}xCVh!I zfd<69aJ|~imv{)y3?Do-5w?>U>jVePmz5)w0~;-7V?N)RT(q@g*y}=5ue0?IT=sU1 zW6)wj^jeW~35p<;S;Pf*icB$3#9MIl#uUbZ0b}kCs7%ZbY#arhEBF)r(kX!q&so!g zzwrdc-BvcuR5UmCLsQ#=5F=&i$>!k04Q8uxmY_hxQ6AO zghO>;*t`A{r?T;*be3+1YI1W83tj-?SxA+#OYhOwI3Q3xl8DC_uEAb}y;~dv@D`vB zxx)p^m)z(g(R~I5ayLo z=+=Ad+wc0MZx1W&U3QqObSfi!9+37`-%|GA^!`1p=}6PN4(ZkgNuZ%fKZ{r{;glQ~Y7>0nHzd&m1yueY5uymlAtws;l+% zV*l{oL@v3MvOsy>e+zmRi)E3xoyaw!1zuMIXr}bRfTN`X*Hk$2q@KsqZ|uFP=gU-| zB(^4N;J$dwfvoRxUBewTSWA4?Zhr~6E+V<36=+Hi&l+g*<+|gg|9#i~33TwF+85=D z`|J|S8y+vC%6Ro1en!i_^}&qK5DK7w_1d#bA*@mP6KMGM z#X}B6#z4ey7l>a(5BLQVMjB*LXdj z_RC93B;S4o&jUqTRM&Q(AYXDojUUL27m40277m!4Kz~#8wcq~VC-bb&`u~Wo?Lhl~ zqrfQtQtMT({b%$;9KEl?A%goHZbB(k`XL%0YN7ahi-y>(9wybmA9GLN!Ki`xds73? z#%r=$4OHiQVg31P(ZJx5XEf^j!bFTYSzQh&ZlZUR66sAgp7C8LSbF)3p<1oe1qX`^ zE8@r&l^?k>2>N?!aXq!5o*Dp|Q4~-o#Y+(#ft!~Sm-E%3m?gv-0gxTilsxl@(j*18 z;iPth?NSZf2n`Xiy_~q-Fbw(h0c`0?ikx8tJQ`W36h8q#{W_Hq zKC4fF+Fk$EGO>Wx?ehB)qT+6#CGe&1-jK1pD5=BtJ-%Mk5;Kjg)x!zCt|YY^PziiJ zmy&m{OUS#24PQ^D^f5WZ&!7U@#)Rh5gZ7j7O6iP~k~(AG;0w7cFQH{5{G0CbYuK0t zf7J651Xk!2P_{zfyCLwin&7^enxV@RGt_7tOa6qyFhH4C#Azj=HT+K5W`t@gQnT#y zdzxie==ztX2>Lrog0AWlf>!$rX;Uq71rk_K{x8D5$o$c~ys^>YCDIEqqYakpyTtU6 zBQXF(x+TF*yPSC83N&tDVL|T>2B5Ze;8%p%hLlJWK*`m8v zil^2iZA=p-K}Ot&mOLBUDYiKmZ7zMG2x0&#NG&y?D@T>PtvZ-r@c&( z)6^8HK)*Pwefx(iPt!j~=W(dxPk+ z|E~FegWN1Z{Gh{(O+#H^u|JXi0H(;I6ubvapFg0;?)Hnr+~GU6XolzJr|dWT(X|es z^TXv*#Dkunoq*Ce{NWgCI{5b2a(zTE`{sX09(-RBkCF$|_*Fcj>}!X0u?Y7S{oix& z^naPq|NdE7+HN12_o(Z;Gax{%zy7=U)4vqS9d`Z{R?{_o%b*vD3cEO1gXZvvTph&2Z8~l2(1eSQ1ilwQs5k463{XTMtDjZC9V^_eay$>#Gjh+0 zx>2S4d@d`=m3IxdT)J>4T{wKk+|+evmbbx{0~V@`kz(5ex)GE{)124lS(&O5j$nqozt^wp6nZ8x71 zO6xk3VGYLWvvzfvPor&n^lQuBLLld^2{{ehGD5dJEjeSik%!}F&UwC|d^^&@{|H)f zOE<(ukC*chcmx@dS1|TicFb}#oR*US&e6bGj_yp*NkGVRGqnfFC;bVMPaw7G7fIh2 z;%oL7GsB}m``{5HB964Q9^3T&U0w3ql=!Vn{I1l$bZTnsdD0Er^6XZlaXdBv$^LZe z^OV>h6X~|t7@dlprhiR)QEYZ9V@<3v@%h%oZz%D5js7+5w%BDPBVG7IT?5dbn+9xs zL(&Ru{W5oTm2RjjgR1_{*w&g2pD^z|^aEqGJTVuxfO(ik4SrLRR?^Y2gHNLeM&rML zTk;ec-;*F7YRK3dhBWKE9;x2ySYt(&6Mr>OtfAUSvt=*lib0`F?nJVPPa{YBe@iAT5aC>N zo)B?!?ff@MxN{Y~)X1d5#M0!xU*m=`EC<}Eko zEF;je#m4bem=UKogT5JD)5K5+Z!%O&*~cVgsFyq`1cL!%-o(Q4u0(Ep@!*J$2Pz1HuX2=>X%kSo3~?4lYS@< z=NorPtUh~-y-C&b39H-uJz|2z^bx@Q{^{I-!-(D*`whpZ+)N-=I4KdFoGTM~HfUgD zDVF_RHRTv)2x>~KGm?1R7K`g->@9ww9p)87XD=eD*o3==N;%KlUb?}(98^LqQ<5ac z(P4YpiXEK`K;Xk5ux0z_THMcimqB- z)C4}LzPXiR1QlnX7ieG2;62Yt^HWb+XIxIJe?+E7=4qh(lUsl6UPzO|+X_PgO_)Zdw89WZ^XIba&@eVTxgVg+ z6RISJTh6GQ&~*^S4^QKEuer-(Kis~Ps&ye*>LaB<6&ngrb!FaTn-TkFb|2>5x|~q3 zLa%i*b6D)ZM%Mb72|1&Lhjclkh73pXPVs|k`;(x(HujA%2!zeyyDOQWImvY!+AAdl z{oENiyUxK+QLW=v>}h6KlB${eh$^rnHC^*d+xd;HY-BZ3sc)xJSEN$UkW$T{3UYwm zWa44g#f25GU)BJRF=s0)LoLkh>`;bN{7kVlL9KUC&Tp@iYal8mw}=|CGfC-pr=(IR$yZhDu++O_NGT8j2UtSic8V=$MowhI?N^j` zG3Tx5q>Lm65{-9F$meYjzDJAl*50zmteL&u3eA$eeCMoRq~X8oNLZ_7x3avP6!KYA z*|1efBF?~Xn8D2oh2tzR%bp6c>X5M7ww^5XO3Wap=Q zt~CCG4|=_m^`w<2H5#lZ&ye=pTU)w5*Yf^n&1k_H!tGvZXv=axWPamMGOoaM&d)Dh zYCc^Ea^RIpYTup=oHO(q3dVR#Ug>jDr$bE354_L3?{G8R5zD zb1ta1SJcA5&m&WTBqqiFHA*I)Vc$qm>B*F_GNA_j5l4jB?2lkT+l3#=G>csZLzwM8 z0hF3QjaScd`Ide*)w2uV)z78sc}MDbn0o%1^s@V(#G166?7%}D3T;@Fv(U7kvz$S- zJWep}c9a3!8))2WczUV;VKm;(-=Jeldsa$mpQId@aM{&iHUA%F_Crw(OVN6OyWQp@)A7eY*+~YeLY;2h#SS zJ!Iy$Xwu9ujrr{)#%DM6FrU9w=R1 z-VrdWU*(+11zF}vW&vne?)NT_G~Ygi3@o)~`2y3ZUS4aD?{|^J=QcBH{h8ylO51DO zAYf^avg5OEa(Hd_t8GK~@RZ6svtPVUxyN+NH!1%Z%YH$J2Ayd|ksxCyBDu(1y`omc zsgI~wSYK_e+@h)C!8^zQ@>dM1Q_cAPOoj`Tnz>ea+-UrmC(HQ`Tfvv)lwE*fpk2Kf zbfzkBQ?W6h7T7gxHs(+9U5?OU%xgD|InDfE5}dZinzmUaLSxQz(F?mor1idNWrmCN ze3J>h9oml_$AL+aW(e~U^uA|#TN^&^3a^23s&_fBCG?yEZAl)UGnN@4Tlp4Pe_{RK|j9D`lltS(-Gv>cd z4V#TQ4AuPA{BM_e2+CyQo(BngqSyBaRo2TKU&{A;-;!Xc-dDu>;eFZiz9Pac?DBPb z+{z^qru`3N&Z}n0BF-NLy{oNEj3`{ZYBat;O#l+~0pilo^_)DBQ$HwO%D6-17Kuf% zL54hZhQd!p=i>fhx!&Rn{Qt5DkT8C)S^oa*1I+Suv$6w?Z_gYhJ!@F(4S3%UcsB&S zACxb?wN2_j!pfZDt56-6X5zn*^I7R)fW(7GFSb`z+nbtW{TtSJo%0%N{0L-(VLcDM zE86U3N;&-bm-KSv0F{O$qmFS`B9^IsSbdnx6 zaKS_9wA$GR(!Z1T(m$i|%Z!lfqw3ycvY$GSYfAZ@%hP z9l6qa^%Likg7OP6gq#2ibS^0>zo5v798H?8Oq2?7Fms3SY(6cV-PE$3B!jlA(e=M4 zcsxznWh!%ZPC#5pnBTD<^SUkjvKOI3{xxM6CL2~)p}?`0WA3YwAcw%eoObe)R0ln^ zDIH_$$JqM{t@|x+o8?`o5Ae?@6r3Q~;uvHO|# zQBFo!#{8wmoCN~yl1lGlV_s{?0+}k1R7Gve#!PD1rF;gOsN9T>>#DZnmG+KGdsQ%c zMW(o)58?k;D^WNqQM`l5m1xUTd{#VPPNws^VOvh+KJM(d>l}WO(@4 z9Pe+x*6@zhF}%2%EFsHhFt=I^y@Xw`DPT_g0qt`4Z2Ju4BY7+J}At7X5 zKj>Xq9UWe8Z>nvHaS*WCU$QL_y}b*3wXDgglsOLDstDTKc+Qrz zrO=GJ;o&;6(^A+{@|VKZ7rSxwdTBHBcX<3L#Xl6jTC)US#o%j$!j~(Eayd}Bgxk-& zV;#TD`Fe20A(d}w`eZc-$_d0ET-)(NJ)pMgLt^X~V(*N@A`61(-m>AAAf2d(8SzOU{ z6?Z_l%0)TjqFMdGhfFLf7;dXkK5W$ zy*|@&jvw?BSXKF-MH~r@6L4_&m6{qBS*WjKpQ7l>ks=e%TqEgE*pye*gr1hiFP$Qi z%ki!Er>Y4*-Pz9@e$pc1RFUKuNCC?kQz3fWFDmU#N$s#}dHinX7xwO_7z{C9|B~NI z`*{(kW{Ca!exAkjU8jDZ^a(Sw>}P$m`4uDgW9s)wWhak4EN%+uR-sxshbn3mOz;}t z4J`FMzbQqXL7xN6gdV8`W;xdyEMIFhejYw-Ih6=t7vz*pMgaRr70CYkk24UiXCQ!0 z@y*bxm@&6q#Ifs*c^hCm8;m*YB)Ut`?)2O5Ba;x-+L+TK$D(1*3oDTiz=9~dm3A!l zV{Ey)7EWbZ-i_pF;GXx_xmyOgcsz|&B4z}QIXu=BbH4h^!SZ$ADXxT5SeA3jR5H*j zzwZXs(@HdTWXWT#(|)1GFC_N&It6$FS=iMDSz><|WQzU$m+CixJnZj}%lG<4G6u?C z;apHqKAAPTOJt7=ipnRmMvD5m1Rzr9Z(rO17k_ZW)l;Ca3xkkJf2{7l5*tga)d z(1V$|nEw^RV#Skugnae$)snCD5o_?RzRAjPiibIRT2Rm><_kwG#pn5^cjc>ag&2z( zr3{MC9_am4xr!2jENmtyzFa8pSFDj>Sra z-f#MA{7td}>8x;v6|2+G_Nh1GaPa^+?QXo?HQQ$9gvga;F zKw`EQ%PIa5_H#C3@1T0>Z&)*=VcU>UiRILfU`{e=I4wuFO%Yop>#G8AG4r#mYmKtE zJK4hoE@qcu*)6ea2)<8Ur^q|4F2$CrVancePll)Vq{%t8C(Rg8YZunqGcp*=Je9FY z2q^YAYYSypkP(&=D$q?yv(lb>8CB2j`EKFtN$?xFAOS=k->eFv-wS)CqNYSe*|C?2 za7JW0qp?MOIjUB^l)r2=3f(!`j}nVO_uOa{Rl;ictMuLzD#TD1I?{3)iZn7p{gt_> zYq@2gasqWY+1F6?F>kos$-Z1t`9|bb)x_>4oI%@uq&t=!yHDVuPZwRX&~he?kXBCX zZiVx$QU~TDlt_%|+5HuK@7vkC7J5DLzc3YlqpIo*-KT=}J4e04heQPp%kmiw`>1wa zb;FAVqFBg#c>L{X=rgnsy2?83_%BML#&XWer`=O{&`@RmSs*{FNI!k_CxNyzbQ}yu z4ZA>;-vc6nhq1rt5_gGY*3fnHA7@YtcbCSp=uzC}{Gy7d5U^j6`w=YrmE?Sw4h|nD zqaPl-Qc;uNH(8|2rr$x}3Da0h>~oE1cK7op5S`ke@L$^kgfECfogRPr!^%EwL~r8h z=`!kweNI8&%r2c}FC@exAB=hTsBB}SS$`D#)wZcW6?6%aV`>&k^CA+{MF5d`Uz6jv z-$c0_2xFVh&ULrp z9*x~<8>2cA7yB2stz4hl#QNddon7&lpbR#&Zea9Fm&PuAhgZ*%m_$PFXT<-w8^14x z6vBkZ6v(Qaqn^>q@h!Y*cypIkzQjK2QC?~GeY{K*XV4`o`%mD^!s&(i-9#=M$-$S@UI76%m4h?S->IL%prwGJH(vT?7U>nEijGZEs}&Bd5_o57Qc}{=+7r) zcqEbiClc{vlJW({AB;d5^}7T~p>vIS<1(T(U9}B6cHW5I(TsQ|pSKuaY~ErTm$bx! z0;N&BjW?~7<>dvOD? z$)*ng;&^}{-THwsB(v7IR)9CI1yta^mM+MTfX|NzM+qAfBkVcfIDctrv$~^bs`2F| ziH@soN}qLE>AKPID=_wfbp7#RVo&{Yi{boQzq(|JWxrgydOqejjgw!HV~df0`d#|> zl>7J%7zIlM#)V7i>B3rYx>Wb|xnD_NFKF9hOm5v`3~xSNDlyJ!Ygp*5)hb~9$AZgn z+ur*{ho&+Gr9ZW8Su%+U;A5TcAr;;jhYzg~Il*H@#A1k+|7K3^0#vSAdk893#_6j1 zSo}eehlB~gB#VUX^C6Uc>7+ZMyoSH&3L0fg9jAtnRnghTI{O!S{gkw0M2_GuZ?lYu zcwE>mrR^xPw3!TOS(-)Ovq*YVZe^E<7yc7BR;3PrW%u0_h|)t=G#JTK#~?WMf< zLB(Hij&6wI*3p_}110-FpP|Xr`fJR)Ly#bo5PW2iB!ac)sa+t~jZwUJ;gP(PGBWOo zG9+v5OkL!%Jru!vEWJHt#;CRXOL1LDq?shYc-kY!a#&1@WA&`;@Hoqk2r&d%M2kb5 zn*Ga4oOy{x{gzpQy|mUOv80Te1{0lP-r6~9y=m!`AiRfshht?ET_W}K?50+seZMb)w_=jT(Y zyxLx*96K6hD>^kfu8=1HJ`d{LAv6UB&xDWplxA=Q)QjK~*wCuH2kCYevYa}o(rElZ61ppp z$o^~TS|jlR)MQIS`nWq@=54P@J5na?Kb1YF$9yf2_wC8~Dm$6G&DRHbx!3s`l8>qR zK4eej@lDu!`Q`HQ1q6-G-_nox)*L%KSCg0}4L5S1V zno+A*NQV0x-fH=*cm8|#nE#)9&A*s0*uDdZN6&bL99Z<56nl9}sNXHs-?M!3UCm$h zos|AAajDg&1yW-T;*#r#2o)Xlk7L2WS6)eC;AygH`&<3`nQ$2K_na!f+T!r6Pp(H| zv47S#f`n1LU5rf8zst1Z?UTMDRptTTWcB+8-wgSU{;zNp5epi96{^@KzfrsZ&AlJ- z(PK}@35{Y_+a0k-NV3E?<314kDQS#XycS!?o!AJl1zIfTiB>Q=sa8;Q1VTP&pe(FU z0;O1=qt^gH`3=|^pAoXu^vjt#gSHEMPIA7Tk)n~ ze^h21#zsLW2>GZ1ggj2q>FYJhiDI+j@wZ`SBtKiKvFlax%^*m*lBBSEF~I2x5&(b# zX-`lf(24<00m`!gDh{v;j`~H?DUpA`#}b8)KgZTGAFA!mqPHjuV%Lx4OZ=y4((vrr z2@$wR)Z3FSCs%%tRenqe5d*~{l<_djk~1*2;~|msSHXUYE^;^Upy^8<7k015qR$5G z7sX#HU@w|z|C3E_`?;q@A!4cF3e0DO7R(80g_9bpQaPEvGoJ%_t6Q1 z?Uk)#i@O?{`!`*ZV^|AXwq-Vr&Gp-Ba%2A7O<;34&I_zKkquUxl=HNX9nAj$IiXY8 zwDj6BWhoA2#SNU|V$muu;tIi&Ck}qh`%Hhbhx^5c)Xvu5x)6Be+W>+BnXLiC!=HgU zA=B(!gv;t0T~k{AWL-wGt^x6*G=Jz>-#|2Ws>+x8@>G4T)TeFOp*_@>zn}W@*p;KI zAyVHURbLzRZQCn+L-teOpoWh*_xr7afc*`8gu+7u_H9MR-B`IjN^6U4L^xNY)K+N+ zJls17z6s8WT8B#4@m}S$H~e;))$$f{>#A5wGBf(zIBej#WJa+bE_)C^rApSj$cCh8 zH#8b9IB|gaM2=aq0`u9)e)}bV$+Evn&0F7q!zK9lXm(*t`&B}TcDyO+K<@I$(phZh zVj>QdwliMT$o>Kx07Y%?#DV6YsIi?IOa1mM{*w0e8vPy*bsS;ZtEIlTBpt|InXGRl zt{{vT^$l0`jgk8D%s*3K2lb8g+i&jTnYqo>78j>nHt4BH z`AJ%IN(>z%sjzx*>1uv%8z6?rkgp60Yh-+A_x!1J0_av`Q<=n#8vE(UVJ~-Vw6}9j z25x&JI^OZyOFMSuZmeh;Stxl8NOaipj+mqevSoy4N5{KdeA=DoD<-FCh-RJJ(2`?!G)*#^&K^)v z+-5InIy;j^y}h8K>Gr`LJBa6klhGu?Y_750j&1fTzdg2q^jPl4 zS!7xErXB_tne?q=2l79U|AY81jKJW3KL3Y!+Q#BJiPd4Oz{t-~{Zk}A?vb+KHgsi# zj;gd*;tO!vgIEoJl9I1lJzcF8Uc3hrsHn(DOJ}hglzg9^mhR_q&jU*=(YJNr@@0|6 z1);Pvb{D2t-d-thzsg&&Ppr>r*pU-LJrGx?*`>{<-E7vcSp#f-9AE4fvt@ffF}UR} z^XD$`N3#|S*iA!v<(8e}%%<_)(b0m46re09#Ws><<}UX)nTR(nSz7bG zOEsOCZvqcnDePp8CfeA!IkmmoQG^Qum5jLvyB-YFP8hLSCt4bANWy zc`xs}>3L#lbK(YMr##Yi`&4MqCGZdRw~Iqk>FU3OhBW_gUJl{^1wyQq8RDN+vJe~O z>Jpc~?Z%v?l(FECq@X2Ww%S^jj99O8XxZ zwYyc&UPuRvMM2JUyr*T{et8>A3O02yM#|@6T@NUB$BGoXHnRHmQ!KlUfc4zyw8_d0 z1Y%A8;{ON~YB z(w~bkDJq+Dr?bhkbL z+Bh97u3iekOZ7d{2KOZKVL-(K-T(mmzV=b7fFS9+@;&! z673sv@wgK4U}!oJT8Gp?h&(3M4WfC0um=c3GzbID6Gsz|WSit8=Ix%qfx=CrqLbzb|I8Pyv``e-BFh;NL~%k>5@RlKo+miBo2}?jg>}@Fdb0_J zhTWzD`tuih%_g?cQ;!*DQ>NLP0dtee;c#pONaZM98ZFX4u7r`Bqz3;zN66;F0{bJb ztBObS&MbMscJ0?XHo&I0cD&_%jcXc=xfc$UZu*_kh32qk?yQRDeWv6kd%NFm>v*4a zlpD10YiTMcQ@*{G?0IAzy05IKshh%$Mqw|*mQZd8lXQ?&e1yHQ-=OQ82@>A%mf!n^*~IOdU`SBajixbzCpzP|xfYCtNg=A$Y$_E*oj4i- zJU37Ex#T(Seg^;DeV!`Zq$mC6u(Nyn`Qm|A%4R|V+XE(Iwl?NN(Q)I<}OWsM+t_ z>8s<{v}5)T#!0La#UDyG&M7kH6$!IK(k=lAlhgZ;KZe|3E&67S`u&4%s``CVv?EI; zpY_RQ+m`)LQM{&;6vbkWlDnTZ<^r!API<8sV0Ke3S-@jCN3ff~y`3GLG!Qx^N{0@*%IfP(&{ zphPQCAfZeoOy`?y)zvh0A`qhOk@6t54ql7Or=AJW1t_2*+ zjgX-vW6*vd^PR2W7A5X+MDfl|5Yn zvW1Bi3-cNgn=a+VRq0 z7m=@*#@sgKthbW#F8i^oV`CW*zPuz~miDlZoZs?hzP+3y4wG<-gv=(~eu){qsmtWp zyH_;Y%IK&vvmT?C$8-D1X7p#AA%RyeYl-LEuLq;&mCEWdKu)Iy%iF^rY+a2HN2#~v zt^7drfzL?Z%JOZ2rkqf2rHJg_h4DYjK2{n(-@W}yWhK+?pA{X&A)%%FX#YBKzL)kh zy4$}lqi6es9@PM32mpUl0HoHF-P^yoNBd1_?Q;~bcmJQr@;lNzi)DNGL)HB!vU)b3 zY&}a_e^Ph9dp$GHOAf$92H<=~VA6!!ZxawiTQ6-tC+e$Y7fg)>>7sfFmZ2DftrG0E zY{<9Yx1t5Jtmu>>T!*%7whRaV&y{hxQ10T$w8}fe?$*~h<1;I><(>TKlV4V2=v`4= zzJ{R*G}Ry(OwI`9FhrT&*7(mwy)dW9lI>@mOx%ZoE~U3T7cTm zp~aH0BR6 z=A7pnX-!*#;e`Vw?c%w)z{;FZg#Y;LFG+*4n;b0|aJrD@tPS-WOq7Y!DSir<^Z zmF-a}jYGWb2}?37{MQtY=2hW0p~=#iH#(~ui}2@rnNtWA<}(6ab#zoy=~DQ!Sq}?m zLVYa|{i)0gjMpa2EnvTXPBi$Jtl7!gy$t*5*45`kulY-s$^0G{z2`W|UR}P;v=PHj z0chqAb9_Pk4}xwzsEvt19iPQGSXm;A4rC=!oxWSbzR0#$nYgdYB07mKGIN5Z&6wlz z!2#o499svkSH|<+Cuh|BlvyN%)7@<=t9RGI6=>_#eM`Duk?Q}~_tgJz2K!wJ?z$}e zp+-PBqZb0$U<(3qaQl6X$SK~`a+3n+6mKtpxO~oNdydE(Nq%;$=CR)uyX{%M6@4b{@~&0hU6puul74r!yqlPKcT8G7 zGx3gC8C`@8u((o4`td580m-U9o5-?;&gx}-QfX&GL@DcR%?}+@|E7m-5?1Hf&iZ#f zYY6Ak>S43O$+Q>niB$QP&^OUQ!eLn333YG3WM|^2o6}a|gQ%dYv#eMyF^^D#%1WD+ zJLrU*y5~``2W`13!^8H0jjP;fU+5Uisc(`J2=^CR_N(F=I`dp7lSYf+k!5wy7ulKd zIkRP_*k4Y8KhkK(QQ|7oLX649v6pagaJbolwEHb)2lKP;?KkX9H^hTpkDSc9w|7y~ zqe=OOctr_O3ezzPwTM)NDncK`?j(kj3gM2{)&(-{9WR$bgT?3UHYCdF#i8R;_>q7- z_3sFV%=*QiA{dw;h+lvCI!+kTHLmtE>))2{gfCD!+ZuTp*$_U93*$MIjd7)-82CX- zIH$ag^B8e%G;~Y^HeeLHONGpT!Xk-(f>JbR4-zoJ?mg_KQ)APNV&}-t zR&VGt;CHsv2Y%0BZKt0a$6s-dWRoB?)LyPpTrW4O{;?+b--R8u%8QE&(SiZk$LChW;w4p;9Z7z<2S4&f%4@6QhskU_!Ijwr&G&h zlA5P_Jdb-RF@BU3J0t#v?ytZr?#y`ta({{5ZrO-QQdaR({8L{}Od!@m(+ZY*!e==( zWoCIzO?b2*&l~zIHSlB>|u&V0bHxvjSBVC3Ym2%cwGIy5+r~ zD0HiWLhj-vS`_>J`{J^tyj_&`#F<~#gQA&>nTA&Uu1aS}FdBqpP_0KeKWL)8TCYmt zx22L_jW=1&*Tni&;XI+gtEB!O@{N`~@e21MJ)ZP`I_6=SG8IzBlKBGfx(4qH=E+p< z6M_b0Ici)>!nwdN0?b^Jrc>c(J&uTfZnb>>hRVq1*Gv+|{NvO>le;MfT{tEtPL`ar%7I0!~W*Iax%-%)vA0;nGI&VLU zLrNpfk}cj3SYS{9$$=gazx1%zx{Fv_TKq3PbGi5-#F)GWBy0>j*=}LeLgxG zI?7YB-1K%(_&Vr{T*iE^exFx!hP}AtpZ21uZX2*%%8dgk}8to4_?h6GRRS7o?I zDBRc4arj01?e|(y3?rx|9OgDTL|w~Z6hWm^d?)btJfBY%m(Rz<6~euNqR^|XQ=GDp zA9%K+2qV(O!XT5*;Y_#ey3sOlJkHy0dSj*7yqyK+!@ne5Cwu~DO8?>eZ{_+JMk9NF|Wrt6e_2O7-+L&U?JEq7P<43o%$M`{+vh}4{hUXW%y6OjdDlk6~ zq%FH;nz&yrL&oo#eLtwM7bFONW}A~4|9$uTRBeTh=j0j&Len2U(wb%#TP0?ZYW;X= zoiHR!S+zdQw=vi(%5g{kau@gy;{UJPsdVaoNh?9zZ~2Tbkd~LA|Dbc!DJsttA^(t& zzcM4Tkcj^gD}D^RoS7mv(m2WkwxBAPQ;f%1t>oZC=8P;OEwbmZpPk15| zRLoVia;oG?5}ld!0i}_%x;Kya81_RXE6aZ>3@mhYrM*097-d}v+AGYiAJ&n<{SqbV z?8{r}>=S=ZlF%`{O|HMu@n!LcdeGAf$=sOAysjrbvL6BU!_S~()44-4ES=UI3qp6V z5y%X0QkujSuoVIx*9h8WS*{ zNcMu*qEFs6`B6PWCE(K{Xz!&b991vIMj#9xDqm2Gtn0Elh%)kMAR(r?TDh;3Fh z(X7w_EBb95#rgq^X)oid)6fK1O>-c6VWvqe5>s|?<(jT|hMC)9Hte9&u}~3-%+Qhi z_0rX2rGtK(N!$BJPI>Yn{Ca1LH9f%&r-49x0?qN?sL@wL|1e)9tAKzw@ntKD{haz`*c1G~nD>=ho1L<2Gb);<(+>N` zt~U&++)}8j5C>ah9*4hU9C&Pv{{^tz>*<#K%KWugxNi#OuW&g+0e=(MZ8_hA_-N)J zXq=AnipVA>MhLZ7T-td$sjdp+p4RBd8>EGZoZ8-+nO%X{8X`*pbAk7vv3h=S97x&@ za$ZC*PA}dB-!j%13PjW2#L*T42nCz6)O>7WKdd>6QyJlps3qL&d`D~|14^596Hp7Z z_H}UskkvpPAhTCB$pn`Bt?U+zsbYLDX87!H)4%vC1+dY01`lwWw?BY+jGLphCa$gS z;lFhfi^#1Pvxorx5mq@yD|pw@Boq@HO=vL-zoZb>_@zhuj*be>emae5z~4dzX3VA6e8eW zJ)cnGNY0Ze z7P~sfjn6Xt@(w*AbX@XX4)5Z5iS?kgz2V(mPfw-mKlxnU`H^X1iuTFqSF|Svt+4t#!aV~(Re)%PE7$!eP#}($7a>V3T^|j zxCmrw5oRCtN_L;GK(3y!k^z+F#$XKiCS|3@$lnxTsGHxxQRtfmu???5sdy@_sUbe(e=Zia46;8-2Le1N| z&YuB_ZMk^aE$2_#dhU$QaS7Gez1|PHa+6nr7XJG8IQhsqdo~tsV8UvC;tu5v_$0$` zZ{|F#o0obnWd)k;enMUP`!HFNmc~w{tU4;K`jfObi*x1qY04N_%8+^g9j8n}^ZiC> z79%tvM8i|-P(Z>LmbTZ;mA;x%>bWzyO3xVo9yp0FtltL~zeW% z;o-2FXWyqEU9nex2khPQFtVCuZ__q#^J4Q74!jZXR~RV=>BNh@%o#hBFrU!j**U^b z8F7(ih#kyNG2w*yDT?{%oFc!r5ca@+0{WLN=lmSYIYQLW6N1x#zlz72oJtOK#U9`k zBc#rYqY2{X9Kng#lQ3YI_C^!6T;^c0xpk2wjL2jFaV8asBq{dP`ggj}A-i*$_WMLT zI|tL=dupN%(eO7;ki3LpLXRJ#Lw+gO*;S%c)M(uT!&Wln7d;a-WKwJ$#tSPt0X=zp zY%pnD2suwG=g*^l-^HSeToNR8DciTeAaY%ifINaJa_Q^P4cz`xkQMY@%wNCn63aO! zCzky$ShD>lG6vO(orS5ByCrtU2I{wCe&x>_8zD~;Vf9LAhQinQ&Y=uOnj)`9m!WX( zIts)-BCDU6IcS-oDTz5!N~zi6;c7GnNXANqW*CQlofY1ka2BUYcYztVgl}o%kAXw^ zpF^YEuI!8bem!&Iw~|NECyl9)aj^zkbYFx^i@7XW0)3&l3EaoNAz$yMRB5{#m4!Pg z5BxvY-UU9Y>gxN?BpC>oI8hUgiW)U)uvim~mI&Axn8b+&8w+AotXL?;TcvfPu|-Ha ziRSb;8pXC~Z68~0Yg<|`RS?vg01~iT0dFW?&}uznL=lyn)p@_az0XV%v_5^`|39Bk z=A6CvI{UizT5GSp_S#y1L#Xd%Qi^&*AXoZJ5LOFh!|5!JnysZ5#{zaYV4AorB8aIZ z<_=9H8LA~ug1b;KQ_IUirwgO@i1Y0=%>C7#1nsDiw0=SFl*&I#vPJa(zOM_xx zv`!hcJBa->#x;p|(O4avJ56p45;^pu?8~l%O-^(db`b=hn^1oo8gmzpCFmp+DJ(Bk zP3g$=2C4LLVL3m~96Zn|N}pe3b4VF797(UUF@1lr{jK%li~X^ST$_2qW)aRDaV zUwD=k4MsK0ToH4Nyq-yNI;!*2NCKJu$J&iB(Taku(>Uf_$&q|Z=Tm2NLO(VfF=6yc zetOWRCr`sdYyvy30vw(9rP`F(U3%4!j_nH$G#{Z@ z(ng(6r2PKG6zC0{7~wwATAMc{C#-GP?jat&-eyZVk_->U(p)0n%&qv>{ws-Wv+g*x zGk?d#)%jal@(yjs6N&Q<`wyUUg?FF`xEQcJ>BSN|({W_al8>fvJpU)S7|21WI+^aK zUz$UG=NqRLiEg7~Ym{7E^I~(KRD3ntn*WI#$J3M1k5T_D$scMMO_%*Leq^To=99lK zU`fX(&(D8qKz_~t#9KORefEgXrcM?==>H0;^Bt;_88~|WSaxl<=L9e_;W_b4^gloC ziOSjrj~WR~?%FozRMIKK)}*f2+({NbmqP4Zhf`V8vsegb>N7yz4(6CbTCKc9hiC~U zCZwHDbGh7O^w1TTWjtTW?c#ETaSl-OyR3{~GhLTGtr@r)jJ@ZZIsngNi#6`Hm}_!Y z-JowS-U9-dTYG&w1^odslUHdz6hcd`w(ZAi^{N{XixBL{Kh!R1pYw18tWm}?!s(jW zsJ|&$dtYfGX#`s#G_Fw$Eu$#kYBz+Ut5fIFsa=Vd;zL6nk^$WCs0s2g8y_(tXQ#5$ zYAZs15lS!;kW6nY|5yFMjvDfIYE5AM6ko6bH> z>S#XC=o5T>K2tO<73oSzzhPr1fm1tCLZjS|nJWlfyc3*w@tHa(KHMxkS#AH@49d^6 zHi*?c!PSQ*e65+2H9fddqS6w;pcoV&0Sw}%ToJ%f$6q?&mI5=s-NM)TR*Qm>-f>Ye z>EKR9xMum`-M&;j>dpBlV6lN)Iq*67BFXg*CysVobY;F9*ao*%weW6D(T_FnE_fE$ zKM%+%vYd`_3xA*}iVJ%9`BQOn#WNYEn?Kn>?`1P_TPnmDC(<~{wKvr85?XqLv?-yb zKa(OwZiDIP@sEok=(vHUFS7$9^H3n?X(?I|tJ&F%{oxx%Z?G{vEj&02)JR>kM*}}P z3*X!Pp7D;6ogcFOCe>D7PTrc7yB=V zIQ8-!82Y$%VT|K#NBox`rZ>~FIke2QN@B2j!nhjQ(_RrT@oV9KGvatrTN^(^8e3M* zdD7Y@N9|o(^UQ+d>XOAd(Q#)MFE~>AkMhGMP?gE0aG6o264{W^3U88N2?g-yzjCW} z*7yB6Gk-GniMLy0MEBs+&Y=6U=8BK_wuzj5y=#zdB4@qiRBA@P)|l2Dkj1E$o2^8} z+=Loii~A`S3{cp^>SwN*Jd=|!yJJ1C=f?74R*Ze_d+Pd<=Q&3nbN^^3;m4u&TQ%uw z?iXqp`_6dm|1T58nCptVXu|AgHae&g9xYh#aL&qm^;tH7on5ugX6uPLJ!LH2JJ!4M zkI*+>%qed8hQZk)A7_!*&xpmwAvXR*IlF(g1#Fl9>x7V5?H^x1^Et|4<}@Vp(K77z zen45WT$Im6WG;m2GCrs4-}81DF|nk(0VlA!*P_Awt9nzDy1LdqrGDnq>O^nGWdROZ zOhcX^15;A1$O!8>vhKUnYvo~7qd4m?XmBh0q~CyEqVxU^S?{r@Q*RX{kkB~S66>ID zxVg$!uS(uUP3=7C1F0_rF)V_}xM;7#>_r;+sNU^T=b%MTFO)Re2i1xcRDtany={-< zd&>|tH^-a=ZpL+UtLY+lKJy(O`LgMPx&lNVfAb=fBd-SYc2WM*7^vA@w8vnv%9w21s-jp*Z(!Zuw}Ny_1!!xjp#tH8 zl)ccWm1amjY!NF9S8b;)8X^`_^DtI_M!c+1+zk!R)8-_)c-kC}o;Lt67wIpGI^YiS z2(@ogPHxG9)6^r#)v=nNND8s*zr;U3)yh#sxDu4I%1(}N6qu}bwx{?iF4ib^ zwy~d)DN&y-v-_ zLeY&Wa|%V6d+Yqz?&tCY#Jw`OHuqE1m%4^e%6;${Qv zHC5llt|F%1wo`L+t}Fw1s(^0+_#wJM?LvIc>QnHHI+=85ZT-xVooAp*j-)p`UC&aH zs_wpLIG@_J(Z1vUMC&o9Ymp5v&4gv)4(#tU;X7>j=b7+bHhf(syx4?|$q4H+r|SV5 zo@K^}@ZB~%H50zqhNGGALpEHU2|r@Pl73Bo-8NjD39qu@{7iU_4a+;bfq&A5-^_&9 z+3>SAto}qo*7(;+Y+T2XZS{wY!@ycLS_C-#)j&=!pMpLWiw5=ep5w!WEIfO7ZqY{J=S$j{EZ&NtyAmee!mV0nM8Jd&xt$c*V zXCn#be7#XDm?QIdkfOu$*BkAI-mFSiZ?_wjwBGJ2-|WLJE>}ZCHylYN<&;PY<0j*B z=xdv4YqVTz8B!|V;r|W(U-JD}Ma!F5CbD%JX6qcmO7?EEnPXS-O^d#n-8Qd$Mh@FD z4dpYIt9h6r%qqVU`cSu?l`#HMDQap2i3c@wQ*GdFNCi*2){vVUD{NMdVK2aw)b-a zvm=;pDXL=G>sSe;*V#HP3)0~9LJbrZeS-hT;nai>XK^66a2>C>B>Fh;F-cF#C(%|M zE^Wu*()Lir>VD9a4+;Q>*R%q*UYSA_PiKHQFJpm-8}RLJ+_jiu(hJ8@nCVjuNodKl zvYkr)5llCp#S#opV0Ie>oz}GBrjsFBa^_Ghds{-u7*GJrV}ajO0D+%Z({7MVcLX(s zZVZrYd@8hRd_$L8#W)Ccxz&m3EsJ=UXA$r6EaF|BMZC)`;-OSmrwvk~Xum1(ZlxPM zcoK_B4>!+gC%8B7=KLyJE7o@h@0!TnTTE_xy^9Q%@z3iby_$hph-x8c*&8V8)An_S zd96@vcmM16`(O7SDOdy0)gK$pzPbyU5SiSIc*P}F$$_r~P%j)#e9jU2{9fW&m>mxp+%7X5jC_GLZ=9?!k+eY1;73qa@DQI~f>}^>t zKk0>~wwecD^)eet70-k!{ti;57nTvt{LwVxj-R#c-f(SoxG24FBMHj_`|Hygyrvi4 zVSbzX;b(`=?yg6Jp}(zP2d5j0`H2A?CaBE7KH)~`hmeL~iI(qjZZ zbJQb_d(vkboYfxW8*@U$2F$DFMQ@1uf z7wTgazb08eKgoB`MY1Y>_-|kpo)c{ z>yy=$+Ht18nY1qQnR)hHPR-|)H>YK68lHbCzvO1>Dk4B#e1GejyeDX zgx80Teu^c5u1t9AnYWzOj`d|D5A9o;k)LUOEW$=%bljBUd2JfW#?%WipQw8Yt=JN} z;Ryn?B((JOQr0tSP{etMdnM$`9)lRnU*hFW(d5N`Q(n`Kn7QcA)E6Dt4cd`~!!>G^ zgCcWYc?Gpw)w44fdyC}s4y0Yvd3{5X$K;lRrA|B;9XBFg$kuW^7QyJCV?=Y9+OX#) ze;BcUM4aB9&+^pH#M?t9ge0r0mZ^KAqj5FyKE6!owkSo7*G}AcwfSqN>*oDR>#B-K zVpX7a+;@vZ*UL^+t;QVmlN65BX!uMTj*gMz`?leeX!tugB4s3L^&5f2TZ0>|CaKkp z_0DT*@6Flva?ruv)0A!X`kiX@s0b2%fmx3vR$^AQA8}X)_zd1gk!d%SJA|-bR4@AqvS}Q`587{p~+7uWw@J@JTsRW z8Z%ovsb}6a^1j>J#T-jEe#RxCp~))@K?8Y3*Ub1&L2{sjVLIMTys*=^(p$u*nSCn5 zkD&FpoU97qE4rHL;T?tX54BpL$izc4C;_#6tk-N9@Sfv6h(gP|LpejCr^JArB3P^U z0I*4)2yihQucV%6Q;jqWMcy9}y&Dk6g6t!Z{vu!sbAV9OVKuP=?}>AvMy{(!?{9kV zH2}(j=(z@VEv{F8W78Djr)k+QK2YRcYts~=zX2?)$h+94iBb4zmO<&eGi;h7Od5?| zxD&Ah7q4g6*hspZZNDz-ALB`uGqUSO8KZ*$$ekVU0fyJtuLvB5$qj00eC1&(qWI*5 zM_AX#k_S&lIl$JLd+gSy@Pb+*{r;gDt-eOb1zIW%cSI!p92$wuTqQ;iy;!xD%OL5i znEVjWHdzKQRFAhTZd3?z9&x3-EF;-8cln8jez98X2y;VHX~2;z`l0! zV#!I3#AJK8H<9hoUc>rrM&SbgS)?aO*=u;Z0=S*7t_ur_@92+CGf&TbF_YUf> zH?fFF1$q-&pxd`QcoS@ILW^?!^(M3&w{LgzrlNZj_h#d?I2Zk=%Go$Axb@e|X`;-V z7TNmiO{~ejX<@BDb~Sqw>$1_(Etomxyx5!A=m)s}ld0Od1#l?ubk=N;B6H3hC*JOa zqrS##$pA8QfnovO7~ztN9Y z9e5dHGpD`s#aCeOWO7G`Klm7S*CL|}uU zV8Y}20{4sG&QoJc!K23W! zu&gviHFHg+8~plrq=d$g{Ykt)B}26L3+Zi!u!@Kcq^@VYpds0VQ2v^G0yBj2r+WVn zgz{>emYK%hdbXxPzUfrt+G;A|7M^V$Mj>wm;;H40>`LBxw5ja3mDo?lxy4w9a24|L zjq(w(4rs$2EL}oZ`Yx&iwvOFck#}S+_gL#D5N+~rABw2Bl0-@#sa&0hgz+g^;L$q0 zN7|kQ5OGes-{Aru69$j*wZ?Z&vhaW>LArQ{^oxCafrQlx&oW`w;F6s)6T(W>?I%ik!sTI^C$2<1#8o+O`rRiUtHJ$xklrhFm3H7=62z&7E&?D)I z@C5yY+7E`Ty89#NbRMg>Q;SA#Wo`V`bo->n+~&MQs0<>L{H0(ym_c`NfdH#D^heWcowvLrcBmnMoQAUquAUzr>R3sO z{qdBNa1J*p4`;8AiN%U(Ulr$?eRH>H`-jG)RSIe-H z;~lL|LCq~@;$m_sEW5hcy{Oc!AC-F0e4E&*qN(HcrjE`E9eE8oKVmYcJjhx)DbH2n|7~ByU_Oajy0s+noWDir0oXd z$nO!#OPnIZ9G3`nTuDUgaDH@UM-I`35vN*qa(`oqtUs(A5=6Y2wl@DkGXBu!|Xj*btBKwq6t_Lc_Lc#)PiRx&+I$H9pe#h&YvBv*>UBsObOf@y8FsSgEMMIXTf$}IzEmYKgHf> z&}}bI59FNY=5I7woY2x1mD4gLHdAs$GM|%}OR58@RrvPt@dK6nbZWLTkkUCVQQOdx zs|&_GVu^RV?$*H})0QemJzVTIa=_P$b=sP!TAP)bb&=IPnhpucen#*7_;qNJ*_$AX&Ko<8t2NIorHi`}xZZl&OBJdwgmPrQzR1GXf@j zEDzSDmr|YHgxO=FwGn0_izK^}N%O2^Eu?Vv4rtlzal^N4tY7yQJSFp(4!fKQ9%fo* zq)SN`7;BwR@$OKn%!2p?xNBm~a3|Nh=t=cYaNFoyYXay`H4rV#?m(=JeXwvbn_%9$ z)6^w)??Uq-y)ee(bDJ6dZWxk?=qVP4{2s8@?t^90XhN7Aa)fpqQ86td$g@n~X5(e> z9-H>nsy0Yl{iASd4E?(-?@(2t5pafUF5@KK=_9J6P~+E7aodq9ho0Ss_Swr_D8;M{ zc~+8#>CeqDCsR6-OzKZe9q)L^9~nQo!r;N;9*YO_erWJuUp!!YMHb=)3-J>l;#>>y z!AC&6ca6#891AhWhZt)io)*ND7UCESQRhSKXCeM9h(B70f0G1CmHQAMU2W>&3Zm0O ztg#TeKEwtKagiWqTZr2%#O7|>mU}J4se*`Fh>I=6-+YK0EX0w5INU;nEyV3U#HAJ@ zPY^j4Vs8uaLm%Qa3-LO~YrI#P2K1>aKwFx8hzbkwm>?dp5cgY%lYEFF7UGwJxXnWR z*g_Qh5O21a{`ip~S}cUJr<85bZt>C;7UCR1OtTP`7Gj+bafgNYnjoqzM9@O~#fO-0 zAxZ?XkA--VBucs7hnQ|5KHLVx)*qSH{@FrY>_ePvA=V4x9~NSPg^2kOr555IK`gcq z->?uz`4HQ2#)e#w6vR&~#HW8V^~m=jp0yB{2x5+fING-54FJ_2_gjd1LDX4@k8LU4 zK17#=I9d?p7UDw-@hczVdln)H1bt9I0p58wYTE~V^gd|Ja9?LXy2$^i#zL$EVp(qg z9A@$kJyn+reKoj08HIi8+ZV?0H+@ zdIgt8%YYW`AwU}3KZ@-t;A8{<&mDqsSg5le5a(64&5(C-l`x#@)FrF;s&|*G zr%-T2@KJDMf_&MS3U$i1H|lIc$ABF;?jG^TomaDBK^^L(`RDV04l9C9p&Rd1t+lyk zw$vn}H);QChOGRs?K4LpRb{y#6(}x9d8~9^7~Sja9Q}!Q$c)KBWXC6w(T|h)f;-VC z{W&svH6Guiqa}PlZfz1iQ8K3)zspE*!|Qj?rj*9Gf zHFYY0{rC`(D-I0y7))!7%`b-pbkI#H@$%zm)4|m;(dPOwUQe1$WI0X~?@A*O*okC;j-^H^1P1GVg?E)6V6RCj%#?d}8kAE*1s@d8@RjlnAeZuPD1 z?YHLSvrlpRvK$s2?jy@`uv?Kq6~DbX2y>wLer+oSQY2(EF7rCEN#iuoPY(b-p_)k%@-T=#U9|fs!INU16`ZRJU-Y*gjDBV-2h__|t$U_+EcZgeMt% zdcfk-Yr>~dhdQsVM|XKP)Wlgi*?Amq4?TT{GJ3^o{woOhyd?Q5VGBMQd2qi&lxV$^c}?~mX%ymJ(tfjf=&3L>4; zVY!|00O!_h#^e=0A@JX2Gd++uAfKS}!3)=t_=$t7Vd@~n{aiJ2`#;ZBHF9wYv1Iy* zOxx8s`P&$Hg@H7tj$7*7{2!A~bVU9i`M-@Lt+k!eTyAXeihBBRFdEGb(w1EAtm_`q zFb?PQp^o1Ry^QR{;FZM!{y^~TrUQk&28;3<%E#6R9&gBFF$a+-M%hs=CIZf42N?_4 zZc%cDLEHMkE2#s&2y?UY-TyQF<4n>2EB(V%d>{dQ^uHs391Da1$~}S{SA^QN-S8hN z;4OnF;6aSk@j_Jwyc!C)BH)g{56z9m*$3`3IQxLXSuoS!YL9Rg%&LM&eGR&3=wS6p z7E68H0850W4kjwXq#R+Qfd`*`$iavNq;Re}e<0u&V;p%3y|51tycl>bIqDE@(}nKU zxg&pKP;2D!=!lWG)jACwLL-QtJj`|!{ofEhxs}F}Wy6<|z2p}n&j5LE5B!+}|J)45 zitY(>MF$PtyS>~a2>IK}!}+*p%b|gf*MAynKL?^0<0Em|#1{OnEH>XEMqo0-l?+_B z#fTU6yvP30ko7y0)uqYtCpFCM4eWppej}OR#zn)iIfI^8k4cemkRfb~y0^56Ue>woZ9=VR9#2Ct zZMQ|*dMp~Q$dJrZkxxT2^N&9@Ilk&tOumGSi-ckMKb|-uABvfOzmxw}E>WeMyD4Af zu@t2I@-L!a&3Ec_f2Lfx#}5YS`{9+nA%+7>IL^VMYDx59sY&VK6_G$sgi96>3c%4i zxA^ARqPh{qKZ%Yg{xRO$j>FN>*<{~a;FG#OpVW=jz=p-5VMhj6V^@C%RS>@#zUg=OJHlO+$re+CbLjW9s2kKc0RVXXu6w2=8DJD}uJe^sp#{=bMJe*HK-Q>Ipya;{&mWOfE_&P9G_!I_h z82tHW{dY~inYOYr;}p(ejVR}f zVa-H!LqpzTQ-D8O5}TM3W%Yrb`ocmqVB(3W#19nOU#Kbzx`QPrQbT|F8aqywNx0&3 z^*30`1;(zeP@6eFol zO2#MTG|b#SDOo+9Niq%+p*cbgN+%*K>ey82#1Yl^^S?ae?BIftNM~iF=lz0k=iIz- zXJyZOMYWw*ib+zK6i*;*f6phVoMuJX+tS#IR8T_4KZgfuE%>u0y2Vsxgj5EFdjNTl48g2 z_r;|SD9}`Z28KJEbHbfpvxQzk3s0cTXy-MwZUO&4qJ=*S07UDq;{OU-cm+nX%&tk0 zg8d*@E12LPM*<&35I^x&FnQ*ib?%ry(#*OMV}27IG3NfL^Io*`vLVsV%V`g{K3p=4 zf10_ah&CE1~Q8uLrILk>$! zr@CCMPw=wak`FL2$E+;jannD?Ex|72#eWp|GcWOx3oZqKkgJFETP_&mEiCCl!r2eCU%=6#Un!__rXEocb*7BupK@0g z`HZp0Fh+CmSV9QM3}f{BpQrj<626*PA9z)03}b}SXvFFMaugrO2$5ioC}A6X9@-G# z3KhZX$LEd4tM=!3V@UQxd*FL12+&1=8uV74pz$Ie(m;#^Kfo>LRSDr@K~8>oY-W4; z9lRp01zv>;<|A8Hb zLDXT@?!4An$~qaAii?l1_$LKb(vz#X3SbjmuHj)|==6#1_}j=~;)wA#j~IWO^9j&- zJ@0FU%v-Rt$u5s;wud@Sqj$ByEs{QlA4p9DU0(rz7>PN2NCBy7Mh1+h3X(|nhGgW8;hz~zm*bf;Eo`Ur z)d|Mg9-UkvXo{EU5wDhR6osISx2W&;b%hR7lxF$abgdegSdWprkv?%K z1(K`NM-BN8Ga%_Yj#EJ%;hOde=y&mJhB(Vy=z9vL1f;-Yc! z`MU<nT8fv6V~p;|~T3SaI|fXpq7 zh6Wj;WMq<2<{-@2e)&o=8{|H`p=8+Xq1>992>KaoAs6RLi(@IfNv=ool&>hEe z;ifwG_M1eFST-2yrPK=63_kht*9K;#Fey2`M520e#A>y5uc(CRqP(SPG*Be1?1wl&1}W#E}hxawCHBJ4KxraO3sR&Zgm=O$f{gk%;0bfJ6J$;F(@bBL_B5p!JTMAq!@x#;?LW-k zFXLa;d(Pg>@MmW)0_CVOrzzjjUCaL!?_v^5mYjzy*)q~;VZe|j$3gEq&NQ=G+6p_H zp-cX3riVcDV#J7nb6Jj_zKDJG&ll~F`rFkZ$!li6G+|CtwbDg7)a^l;?r<0v0_dJ3+JCYbn@jt8xwd>3&$2QEV2_1D| zmo>r;F~n%dgmb2ya~Ah05F5H~15rd&9Up2xornqNoOKSb@9OJh;p6|q9$^_*>e)SI zux5_P$XqGsS~AC1|I3rBE2$hshB{_58dw{K^FvG5jhmJqy8bL15yQao#c^Cxe|?k) zOcNtAO++LX2_@Ja*bw0whmNBxc(i;-U{lS;P{)1>W6Obs6!xh(X8b19pL5nUdw0Zy zvuJLp!}`vuW1UqwIawE&oIE49uQaQ#$2S)#+}9M#o1C1Bj69`6vP8$TWN2MZhdQu< zwfdcIbq)q=7@=W@ATewH7GM7!ZbI`L+_RywXP4<*ChQaaPOZaL?^qnj z_x+C7CMNS+n3!R=u7F2n`s_+M*Jf9_xxn{xT_Ak<#{bCq+m_~elby{OOAqhl`*hAH zH3zzdy#K|eMY$HkFKtjU6@5Qf#qm7RP!6emtXS(a+XnWxxgL6r?%zT)9#|jCJH0G* z1U(#cFDQt)p~-Sa^$u>#y!xB5gSnU#$zOi|aRdT&?c9Qt4h;0ip_!Unl+tEQhJW_= zHzP4OFXfUpJ2I|*NT_2UUO`rs$GMu+WSQRMcPL6HxzqAxzDZ?c1-(#Z#vup4%=B)h z8!J^OV?AoTnwELPf6I6BdOFnNF4V4LCyI&GNo3eXw@Mq(q{~qnz4^c72#mQLrO5!> z%TXFbP9b$k1^K|zZ#n9Ugu$u z6>}C))E;No8-hB2w`?z=D;GUt?p!jf3MV<2pgX>#z~?zJha1-N?rZYuGoPaqnFIm3 zgRcWy{JS6KjvgP|>lAe-X%es1+n5aOCd^@I2Um zmgworFL-Fsjq3PlShFp3&Qse$W7hlcPdfV#2(2LX@6OL9+$ff}0`sE`GfT-+?#&PS@F?p`I2k9vE$&F z+kp`W_r)Ld4aL83Z=iVupG4Nb-@Gl+!`lzi(s^~MQn(FGwR^r=Kr=mZ#ExT>%4$L@PB9z`-f@`jy=)M=Hp#d#JuBv zrl73OD_eg!jPqi@gGb4r2RSXNhD)UhQ@&K1^#)-WHXFK?o1f|B74>c1|7MLHvy1Ec zwjLWY+vN3aD-^1?a;v+yQxtKFoGu}Rdln9y%(9*6t{hzHxcl=2Z6mnM?#f|gwFYUZ z+1T8hnZ$;r-p`PSt`+MYFj+(GLutu?37hfw$8K{hSvPh-4l!pUF0<>xJWJyhq3eFy z|Dk2kqX$HYQFlDU!Ao_|Sa)K6??fq&asu4bQir0e4oyW}ICUQo*&-l2*JJ|b`zsA; zhxxR&49jii^jpc9_>_(%kNpXDkTGW(LgV*P0a}1O1JL@O0oWz$$~^$`LmfIPNiKcw z8=!m)k~2W&>Y_|mwyfti8K}Mf*$tL2& zp%ixl(JySP;AOGMtzH#!xVLsBTT6J7Q5Vf#?}e6b;O%7o$A|8D0U0B7Pw!)( z7)z!Na6iM*`7XADEx}lzhu6l`3=Ba1J~Xs=ksq*f#zdKiUTjK-A8BYRVr)Bts_q~4 z>%8CdcG0l+2{5Oe<%6TZeWH|Lp$HJAYeTRGZT?$oFIW+0>%P~BH`^CEM8NyEd54?9 zH)1bQ@=6m+=rqMMCB}M{ivJVwu$bbX85T3SfeaQAl`+^t-j#i!EaN$*E}>L@-=+cW z9R{osjrXu89J@OBo!!7oHU&%2je7sWJs&2dD_d%k)vt(VI>A!`LD!4TrRN>!^QYiR zM8>&#*}p9ybPz{o4nBa$s!eP&BVdAY$`p;0?|*c4a2FRLaVq#jJ@~8I)c5Rw{c_3c zp(VlRNad@7m1Y9!+ z+!H?hh4A#>SRqQ85Cv>8o^>#Ic3$vw1qrL_eQSa#O&yP6e5_8pX5%dtl2hyid=twOOrr`4|!LNb%!`ZaRLz^>el5) zoc!`$pn4sFGm;~p5=Dx-!3RFZ&1>L^$mnkD%5bom=MCAP z%W@WSWpl*bicXz2?lJ%5-{UMf%9nEwC`+ib2RZ~5nMr0f>qE(hMG4*Dbb>LL)&HjE z1Nu%LpkHvCpbMMgM~hH|mh4;ePV>8oNlk2StztH0<$T80(u-v?sH?Z6gxq|I9>)YO zWgyQZr_wfE+#c@yiu(7Sjb`hpa~|pLB}EuRhmg}_fwf+t{ac z%`lO574H1Xjx<*o8MnZBUcHTGyZ3uxR-1x-%B!}KNbB>t#B6>kqWSw2ue=nNsLtT# zkdK0639d8A7Cc6{n=m}sC`72%7VIFB(PMMG1C_ITh8fEd4KwS?sy28-Y@8X<5OI}N z8_f8;S8QO-*a|ib>`TNY>Y4)H`d^CC6~6HyFo_ynpp@k9RYkZW6@{$AeBUC@(4&;@CAMt%04mm% z65SoZpDf~(g_cY>p7Okdsmto%QM__q*VI3Fxa!YLniLK#NkcHkRc(jI?d7j;K&^lP z+>!W0UK`)njWluiU}SHki7axw%b3&HKuO(Q^V)(9Uh-vidf`8|DbKa>1HJZrdFu@> zBSL?@!9V$LW~zScf<5^SSkC%$I$NdC>&B{0p(WeKeZT0Ml9>B_c&e^c&97^n@CX+R z1mgQzp4}*(9V5Rc{6%v!Oxe)T5^nTD>CrjW+&GCAyE9sjckAFOI#xzoannFDovM>3 z@rQWPG|KS~!CQadANJtCpRZ5ZHK=00UqOAMo%usrCmd(0Q~bH=Ko3=)VFT+Er7B1G z)wzec{AJa-5tnnOI{ou`8XYo4mwdb%8~6RnYmT4}wV}s0^1mK+D^xx*HX1061{(8Q zC;Xh70|H!9vXQ<)M{MY~>H{6vvw!H@<04_iANTt)zo&FRPFXB@;tmd4w2mJVh*y2C%ed#Wb!VXYZDle%lgYe?`=0ml zk*aG{&G-%M%30lC)RlK+M>eWD-(>w?mVpUlwgT@mN!P}Yd|33^&)@5N&d}45CVgZn z`}qQDe%s*d$}Z-Uxu32Q$62c5P<{?8;OFpR{2VcypYjp$`dE@JOyi);c`3AHZ7g|} z%n9&YNHt6Lq zc(3y0+_-TP*Y`?BxVGn?kP-X!$smpm`!EVub+4XSP_TO9FmZ)F{Syklw_638M8Rjy z`2Z^U=X3dIMNs6;FG}CDJ_BUbuCvYVwPAK%Wyp-FPP3cc30P1oBV}38eMMeTCOzS? zwz6A~zS=0(8`hwrN)8^Vs{2=+@oX{C+?qzxp(ZKOswn<&T+?aa^xBnqb#$9l@Cpb7 zv3F-;dyzWqJFy^(`4h_n_Gp{$&P;5txm8FI!0N1;d37eS3J)6dNoP`+S8*_Mi1Dhc zm3W=Yt8p*uBo-+#8C+}<5_j0pd>gvghRSRxEKNl+$XPV9NW^T2p&;*saUy02LdAI( zfMhxFl3OQ=zlcaEj)+bZp_Se0LgbUD2hzig{1tN@b-H&K5LtQW=LGhUU;5$gwLwx{ zGv|uEOZ1_2w!>hRQ9W=ay8y}VUx7a@A}(XK0|8Tb#vI)<2lwi=4Z#U3af)!%>6MrUfjkjH0O8R81v zy9Ze4bG=hn5NcmY4XZXxc6RCz-gBg&h~nIpy?6noaD|${vrJE~I!^DyTjrwe6wZY1 z*>NO~Rwu8X7!~gPsK^=19evImqg$TsTv5u1muVzecZ9{%&>^VNNa2l=!qNMh17(Ap z#Uns$yv_&^AB=~@u|~An%a9pILHSfP69woifM(`~*R2n3Gy~S(-^s%F1!I;qX2rzv z$2;l?p~z|`HXB^UoR;4NjPY{u;qOAXbcdF7@3B_OQXq}Lb%{upWnj%%CPhqF6`hG@ zyA(Ke*}%m$m2VPe;Iz- zJaNZk@bmA$f}bWbLrggI$dGd57ldk4@eTBB zv_3T=^?jvYI0Irb4z=59U3lxYeA%l)vO~uZ7Afo{*JxmRV(!DL=tDmf4Al>MRV9)?_; za|&p*$>*Ph>j_(l^txe?j~*ddc6&$so1RHf7i<7^Dua9`&Tnk$&z0x6pDIsD0=})f|%^*O^5ysstgn3 zM#X~$oo=Qyw^#?+3pac z@EwpJuBQPBR>osvnJ+Vt6V;eg^pPPZi>Zy82VPvhoN(VPqYUVKW3fNI1;a4 z>#T;&>e>eNyy>sA&E)aRBjL1x3p|8C|0bT%2( zP4bXj&4CB)tLDHDEkKypubbCIW)5T-FO1u+rpr{r{*rmkQgh}=ht7Wra znk*ca_#8ggt=a=0KmPH5N#7~IqN+P_b$)I}d+XL0G~kzm8b%(P#qV+K0+ zM=I_*m_|-&4rDS*j}yDgLhV1-$JSm87$6h7L!tIJdExt)^A%=?>^U~I61&+*Uq!t+ z_FA>6o?`>pPvEh7OX!xBT(_ok>p$&2Y$X?Z1B^euzyaNykA3UkiN}X{zy8Um>AQ2| zQ)-c5y2x9=9p};sEZ4sChS1--ykdB9PE2CwOcJ@q(YtDj0SbR1&^-X5+ISAm^bJaI zf>#4pi$8{!__S(Ex@7MtPQ0Gd2%w*D+nukTNaWLG$~|9MQdIl@kgkp|YjEC~?DX&{ z2h;GrGt*1S{d2az1`KF?o3pj5i#cUOV(+93CI zNWrWr5O;-~vdP?Ro<3%BzHKXE*~;!TPm8Jk%@Ial(6&3M{CLmLVYpa5=%OPAzd zDT-6L{x#v`eVV)yi-&C=!X)^&@P?JWTlfyiLa$SRPJPd054{_JAEEXpVogiH&A;Nc z)(O7CN2!PbZl{I9x$KNjmi&(?v9L>zq&*ywF4^A9O{Kwh#p#mGW9Jj5_)CbO%eu+K z4PI;mnwaV5m|luC(1lT@1nc-ETIo)3f&#&D_7g$6!Q*Yf|Gw}zLD=#^9mV$dWXD?P z#Pq9VdhDnC+N;6c32*Tpbx(YQN5r4rn%!T`ryg$bI-;4~GfYo1*^URXw#y0FXkO&M z*7QPj^tREv4Ds`(E&kM;DY6tVl?#|ppAx&vL+uBUQDS#psN-bRlkSPFWM8!fo79fC z32QZ!E$MjylwzXeJjq+6H)6zUo@~8C3YQX@*iA)#%djSP7l%4LwjI2;yV$JT;slQ) zBL|1a8LY&eviGCUuVM4mEfFs3y;(<4aNprenbN2C5jit@V1)X%r$v2 z4Ed8&f}tfF++Y&Wsi zt-cN;CRA-Qm$(0o@zX}@edanbB2Q;p>u9DTZ?`jMlR2dEH_-tiugk0-yg%VKn!%>j zn_d?FeY9H&^K{8QS1=}T6L2TYB>|9hsN)5~1Mq=44Ayn@5F1PS2RnRbJBn}2XOe2-WPt$~JPHrc-R5&6)HHq{s$fsegYPQl zE4P^HeZ^MId>nBuDvmg3Vw@duA|q>^3yTPG;yN;lXBp4()Pr_gA3F9uicI~EpttkK zV$`spDE3OQYiKoX(joqii$(t2;F6aNCR@^&W!D#w2z~X|oNj<_`a+;{0a~toNrOP% z?UV)o12h%eiP^w_`IIcYk?3^EPv`o5VWw0{9>M$PqkG~H0CFeH((kbs^UDl6k4GvF z9D734rxQc9)X(Lj&@H^3q(_BR>5@n3!qkHldUtN9%rTJ7K$^Bu(BEHV8|kTFy5v_BBge(*l1DD5z%zll zJGXhG3PV5F_gipD!>2!9g(><=Jq3ALu8OJ!s|$&dOA}S~R-V4(@hw%r7b82`OnUQI z{bro@x%!rzLKG`l@AtdSzFtS1FP0CZ4C;Fj^-Y(2KwmG1P{4l*tGGZRT{2XaJ{>?g zB=qO^c|i3BkK_yeRjtipYU&pnoPqiP-%rmR{BC_pPVlc^@v&GgBJPCU-{V$-y)n%j zyAR%g5Z0g5&kI&GvbTJy3`IWAw(avQEzALN8E>?k!p-`~DSU7vEz^?7u9t$pRTx21 z7AHiy!LCafg|!Nq8;-L2inE;;rg5i{UB<0yb%W>erC3)r1*2-Qo_oCDE(RhQV_T)< zq$|lfS$HB3S*sqTrBw%ZD8Zf=M5|Zw8)~1UubmVBMu5in3Np9kSA^;7-|K-Yu}MwX zQ?-~bxr<(r4PztqzEq%E2nl|U;Po;?FFcu`<{8#gpUmZxdVRt>uP5=ESW`woE8imA z_$dMUauY?&mfZWKKI{!%1fafb-W2qu@~PPOezdt#@;24 zIegF|Z1>B#z@j_ORK6Bapa0X0i;MwTa5-S+ejcxYWM-hT^<`v!%_rWfqci@eWM)vS)! z_(uOj(j`xWsF)%cwLs82QYB^20PL?2t83=NdEZLG%yPO!S3V+_zDF&+j-0&=T9Ff( zW(*6?jyg~K==}^Q0Xj)x295+i{hTr11si6hpR2KFt_jQv-Pi`LABP9x(2XoKa+XP4 z_pbez52cS2hVj!BYF|X6OzN6+B4~!Mnn|9zSE3ge$2&=w5lO7x3uRQahyOhIn2svX zN^}p6hU&LQq=^3tzKo)QZJ~R1LtExyDaTNfMiRX?c_r!NwmPZVwoBw%vxX8`d4D zPZobw#WWf~>OnI@H~gABY=4ThHDVr*@&Szy#vbf^?#&f{f#XrZbmMNI2%FMCL(Q7z zx9bD%#sYn?@R-9Dg+6@>EirIAHguY=bYuCuhAT~WwtAO;l#_E>vf)@((_5E=rW{)R zD3a(6!~*YoQ%KYK$yl`J5!0sm`}X1si!#%dPp_T
    Different font layouts
    + + + + +
    ASCII_INROWASCII_INCOLTCOD
    +
      +
    • ascii, in columns : characters 0 to 15 are in the first column. The space character is at coordinates 2,0.
    • +
    • ascii, in rows : characters 0 to 15 are in the first row. The space character is at coordinates 0,2.
    • +
    • tcod : special mapping. Not all ascii values are mapped. The space character is at coordinates 0,0.
    • +
    +
    Different font types
    + + + + +
    standard
    (non antialiased)
    antialiased
    (32 bits PNG)
    antialiased
    (greyscale)
    +
      +
    • standard : transparency is given by a key color automatically detected by looking at the color of the space character
    • +
    • 32 bits : transparency is given by the png alpha layer. The font color does not matter but it must be desaturated
    • +
    • greyscale : transparency is given by the pixel value. You can use white characters on black background or black characters on white background. The background color is automatically detected by looking at the color of the space character
    • +
    + Examples of fonts can be found in libtcod's fonts directory. Check the Readme file there. + @Cpp static void TCODConsole::setCustomFont(const char *fontFile, int flags=TCOD_FONT_LAYOUT_ASCII_INCOL,int nbCharHoriz=0, int nbCharVertic=0) + @C void TCOD_console_set_custom_font(const char *fontFile, int flags,int nb_char_horiz, int nb_char_vertic) + @Py console_set_custom_font(fontFile, flags=FONT_LAYOUT_ASCII_INCOL,nb_char_horiz=0, nb_char_vertic=0) + @C# + static void TCODConsole::setCustomFont(string fontFile) + static void TCODConsole::setCustomFont(string fontFile, int flags) + static void TCODConsole::setCustomFont(string fontFile, int flags, int nbCharHoriz) + static void TCODConsole::setCustomFont(string fontFile, int flags, int nbCharHoriz, int nbCharVertic) + @Lua + tcod.console.setCustomFont(fontFile) + tcod.console.setCustomFont(fontFile, flags) + tcod.console.setCustomFont(fontFile, nbCharHoriz) + tcod.console.setCustomFont(fontFile, flags, nbCharHoriz, nbCharVertic) + -- flags : tcod.LayoutAsciiInColumn, tcod.LayoutAsciiInRow, tcod.LayoutTCOD, tcod.Greyscale + @Param fontFile Name of a .bmp or .png file containing the font. + @Param flags Used to define the characters layout in the bitmap and the font type : + TCOD_FONT_LAYOUT_ASCII_INCOL : characters in ASCII order, code 0-15 in the first column + TCOD_FONT_LAYOUT_ASCII_INROW : characters in ASCII order, code 0-15 in the first row + TCOD_FONT_LAYOUT_TCOD : simplified layout. See examples below. + TCOD_FONT_TYPE_GREYSCALE : create an anti-aliased font from a greyscale bitmap + For python, remove TCOD _ : + libtcod.FONT_LAYOUT_ASCII_INCOL + @Param nbCharHoriz,nbCharVertic Number of characters in the font. + Should be 16x16 for ASCII layouts, 32x8 for TCOD layout. + But you can use any other layout. + If set to 0, there are deduced from the font layout flag. + @CppEx + TCODConsole::setCustomFont("standard_8x8_ascii_in_col_font.bmp",TCOD_FONT_LAYOUT_ASCII_INCOL); + TCODConsole::setCustomFont("32bits_8x8_ascii_in_row_font.png",TCOD_FONT_LAYOUT_ASCII_INROW); + TCODConsole::setCustomFont("greyscale_8x8_tcod_font.png",TCOD_FONT_LAYOUT_TCOD | TCOD_FONT_TYPE_GREYSCALE); + @CEx + TCOD_console_set_custom_font("standard_8x8_ascii_in_col_font.bmp",TCOD_FONT_LAYOUT_ASCII_INCOL,16,16); + TCOD_console_set_custom_font("32bits_8x8_ascii_in_row_font.png",TCOD_FONT_LAYOUT_ASCII_INROW,32,8); + TCOD_console_set_custom_font("greyscale_8x8_tcod_font.png",TCOD_FONT_LAYOUT_TCOD | TCOD_FONT_TYPE_GREYSCALE,32,8); + @PyEx + libtcod.console_set_custom_font("standard_8x8_ascii_in_col_font.bmp",libtcod.FONT_LAYOUT_ASCII_INCOL) + libtcod.console_set_custom_font("32bits_8x8_ascii_in_row_font.png",libtcod.FONT_LAYOUT_ASCII_INROW) + libtcod.console_set_custom_font("greyscale_8x8_tcod_font.png",libtcod.FONT_LAYOUT_TCOD | libtcod.FONT_TYPE_GREYSCALE) + @LuaEx + tcod.console.setCustomFont("standard_8x8_ascii_in_col_font.bmp",tcod.LayoutAsciiInColumn); + tcod.console.setCustomFont("32bits_8x8_ascii_in_row_font.png",tcod.LayoutAsciiInRow); + tcod.console.setCustomFont("greyscale_8x8_tcod_font.png",tcod.LayoutTCOD + tcod.Greyscale); + */ + static void setCustomFont(const char *fontFile, int flags=TCOD_FONT_LAYOUT_ASCII_INCOL,int nbCharHoriz=0, int nbCharVertic=0); + + /** + @PageName console_map + @PageTitle Using custom characters mapping + @PageFather console_init + @FuncTitle Mapping a single ASCII code to a character + @PageDesc These functions allow you to map characters in the bitmap font to ASCII codes. + They should be called after initializing the root console with initRoot. + You can dynamically change the characters mapping at any time, allowing to use several fonts in the same screen. + @Cpp static void TCODConsole::mapAsciiCodeToFont(int asciiCode, int fontCharX, int fontCharY) + @C void TCOD_console_map_ascii_code_to_font(int asciiCode, int fontCharX, int fontCharY) + @Py console_map_ascii_code_to_font(asciiCode, fontCharX, fontCharY) + @C# static void TCODConsole::mapAsciiCodeToFont(int asciiCode, int fontCharX, int fontCharY) + @Lua tcod.console.mapAsciiCodeToFont(asciiCode, fontCharX, fontCharY) + @Param asciiCode ASCII code to map. + @Param fontCharX,fontCharY Coordinate of the character in the bitmap font (in characters, not pixels). + */ + static void mapAsciiCodeToFont(int asciiCode, int fontCharX, int fontCharY); + + /** + @PageName console_map + @FuncTitle Mapping consecutive ASCII codes to consecutive characters + @Cpp static void TCODConsole::mapAsciiCodesToFont(int firstAsciiCode, int nbCodes, int fontCharX, int fontCharY) + @C void TCOD_console_map_ascii_codes_to_font(int firstAsciiCode, int nbCodes, int fontCharX, int fontCharY) + @Py console_map_ascii_codes_to_font(firstAsciiCode, nbCodes, fontCharX, fontCharY) + @C# static void TCODConsole::mapAsciiCodesToFont(int firstAsciiCode, int nbCodes, int fontCharX, int fontCharY) + @Lua tcod.console.mapAsciiCodesToFont(firstAsciiCode, nbCodes, fontCharX, fontCharY) + @Param firstAsciiCode first ASCII code to map + @Param nbCodes number of consecutive ASCII codes to map + @Param fontCharX,fontCharY coordinate of the character in the bitmap font (in characters, not pixels) corresponding to the first ASCII code + */ + static void mapAsciiCodesToFont(int firstAsciiCode, int nbCodes, int fontCharX, int fontCharY); + + /** + @PageName console_map + @FuncTitle Mapping ASCII code from a string to consecutive characters + @Cpp static void TCODConsole::mapStringToFont(const char *s, int fontCharX, int fontCharY) + @C void TCOD_console_map_string_to_font(const char *s, int fontCharX, int fontCharY) + @Py console_map_string_to_font(s, fontCharX, fontCharY) + @C# static void TCODConsole::mapStringToFont(string s, int fontCharX, int fontCharY) + @Lua tcod.console.mapStringToFont(s, fontCharX, fontCharY) + @Param s string containing the ASCII codes to map + @Param fontCharX,fontCharY coordinate of the character in the bitmap font (in characters, not pixels) corresponding to the first ASCII code in the string + */ + static void mapStringToFont(const char *s, int fontCharX, int fontCharY); + + /** + @PageName console_fullscreen + @PageTitle Fullscreen mode + @PageFather console_init + @FuncTitle Getting the current mode + @FuncDesc This function returns true if the current mode is fullscreen. + @Cpp static bool TCODConsole::isFullscreen() + @C bool TCOD_console_is_fullscreen() + @Py console_is_fullscreen() + @C# static bool TCODConsole::isFullscreen() + @Lua tcod.console.isFullscreen() + */ + static bool isFullscreen(); + /** + @PageName console_fullscreen + @FuncTitle Switching between windowed and fullscreen modes + @FuncDesc This function switches the root console to fullscreen or windowed mode. + Note that there is no predefined key combination to switch to/from fullscreen. You have to do this in your own code. + @Cpp static void TCODConsole::setFullscreen(bool fullscreen) + @C void TCOD_console_set_fullscreen(bool fullscreen) + @Py console_set_fullscreen(fullscreen) + @C# static void TCODConsole::setFullscreen(bool fullscreen) + @Lua tcod.console.setFullscreen(fullscreen) + @Param fullscreen true to switch to fullscreen mode. + false to switch to windowed mode. + @CppEx + TCOD_key_t key; + TCODConsole::checkForEvent(TCOD_EVENT_KEY_PRESS,&key,NULL); + if ( key.vk == TCODK_ENTER && key.lalt ) + TCODConsole::setFullscreen(!TCODConsole::isFullscreen()); + @CEx + TCOD_key_t key; + TCOD_console_check_for_event(TCOD_EVENT_KEY_PRESS,&key,NULL); + if ( key.vk == TCODK_ENTER && key.lalt ) + TCOD_console_set_fullscreen(!TCOD_console_is_fullscreen()); + @PyEx + key=Key() + libtcod.console_check_for_event(libtcod.EVENT_KEY_PRESS,key,0) + if key.vk == libtcod.KEY_ENTER and key.lalt : + libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) + @LuaEx + key=tcod.console.checkForKeypress() + if key.KeyCode == tcod.Enter and key.LeftAlt then + tcod.console.setFullscreen(not tcod.console.isFullscreen()) + end + */ + static void setFullscreen(bool fullscreen); + + /** + @PageName console_window + @PageFather console_init + @PageTitle Communicate with the window manager + @FuncTitle Changing the window title + @FuncDesc This function dynamically changes the title of the game window. + Note that the window title is not visible while in fullscreen. + @Cpp static void TCODConsole::setWindowTitle(const char *title) + @C void TCOD_console_set_window_title(const char *title) + @Py console_set_window_title(title) + @C# static void TCODConsole::setWindowTitle(string title) + @Lua tcod.console.setWindowTitle(title) + @Param title New title of the game window + */ + static void setWindowTitle(const char *title); + + /** + @PageName console_window + @FuncTitle Handling "close window" events + @FuncDesc When you start the program, this returns false. Once a "close window" event has been sent by the window manager, it will allways return true. You're supposed to exit cleanly the game. + @Cpp static bool TCODConsole::isWindowClosed() + @C bool TCOD_console_is_window_closed() + @Py console_is_window_closed() + @C# static bool TCODConsole::isWindowClosed() + @Lua tcod.console.isWindowClosed() + */ + static bool isWindowClosed(); + + /** + @PageName console_window + @FuncTitle Check if the mouse cursor is inside the game window + @FuncDesc Returns true if the mouse cursor is inside the game window area and the game window is the active application. + @Cpp static bool TCODConsole::hasMouseFocus() + @C bool TCOD_console_has_mouse_focus() + @Py console_has_mouse_focus() + */ + static bool hasMouseFocus(); + + /** + @PageName console_window + @FuncTitle Check if the game application is active + @FuncDesc Returns false if the game window is not the active window or is iconified. + @Cpp static bool TCODConsole::isActive() + @C bool TCOD_console_is_active() + @Py console_is_active() + */ + static bool isActive(); + + /** + @PageName console_credits + @PageTitle libtcod's credits + @PageFather console_init + @PageDesc Use these functions to display credits, as seen in the samples. + @FuncTitle Using a separate credit page + @FuncDesc You can print a "Powered by libtcod x.y.z" screen during your game startup simply by calling this function after initRoot. + The credits screen can be skipped by pressing any key. + @Cpp static void TCODConsole::credits() + @C void TCOD_console_credits() + @Py console_credits() + @C# static void TCODConsole::credits() + @Lua tcod.console.credits() + */ + static void credits(); + + /** + @PageName console_credits + @FuncTitle Embedding credits in an existing page + @FuncDesc You can also print the credits on one of your game screens (your main menu for example) by calling this function in your main loop. + This function returns true when the credits screen is finished, indicating that you no longer need to call it. + @Cpp static bool TCODConsole::renderCredits(int x, int y, bool alpha) + @C bool TCOD_console_credits_render(int x, int y, bool alpha) + @Py bool TCOD_console_credits_render(int x, int y, bool alpha) + @C# static bool TCODConsole::renderCredits(int x, int y, bool alpha) + @Lua tcod.console.renderCredits(x, y, alpha) + @Param x,y Position of the credits text in your root console + @Param alpha If true, credits are transparently added on top of the existing screen. + For this to work, this function must be placed between your screen rendering code and the console flush. + @CppEx + TCODConsole::initRoot(80,50,"The Chronicles Of Doryen v0.1",false); // initialize the root console + bool endCredits=false; + while ( ! TCODConsole::isWindowClosed() ) { // your game loop + // your game rendering here... + // render transparent credits near the center of the screen + if (! endCredits ) endCredits=TCODConsole::renderCredits(35,25,true); + TCODConsole::flush(); + } + @CEx + TCOD_console_init_root(80,50,"The Chronicles Of Doryen v0.1",false); + bool end_credits=false; + while ( ! TCOD_console_is_window_closed() ) { + // your game rendering here... + // render transparent credits near the center of the screen + if (! end_credits ) end_credits=TCOD_console_credits_render(35,25,true); + TCOD_console_flush(); + } + @PyEx + libtcod.console_init_root(80,50,"The Chronicles Of Doryen v0.1",False) + end_credits=False + while not libtcod.console_is_window_closed() : + // your game rendering here... + // render transparent credits near the center of the screen + if (not end_credits ) : end_credits=libtcod.console_credits_render(35,25,True) + libtcod.console_flush() + @LuaEx + tcod.console.initRoot(80,50,"The Chronicles Of Doryen v0.1") -- initialize the root console + endCredits=false + while not tcod.console.isWindowClosed() do -- your game loop + -- your game rendering here... + -- render transparent credits near the center of the screen + if not endCredits then endCredits=tcod.console.renderCredits(35,25,true) end + tcod.console.flush() + end + */ + static bool renderCredits(int x, int y, bool alpha); + + /** + @PageName console_credits + @FuncTitle Restart the credits animation + @FuncDesc When using rederCredits, you can restart the credits animation from the begining before it's finished by calling this function. + @Cpp static void TCODConsole::resetCredits() + @C void TCOD_console_credits_reset() + @Py console_credits_reset() + @C# static void TCODConsole::resetCredits() + @Lua tcod.console.resetCredits() + */ + static void resetCredits(); + + /** + @PageName console_draw + @PageTitle Drawing on the root console + @PageFather console + */ + + /** + @PageName console_draw_basic + @PageTitle Basic printing functions + @PageFather console_draw + @FuncTitle Setting the default background color + @FuncDesc This function changes the default background color for a console. The default background color is used by several drawing functions like clear, putChar, ... + @Cpp void TCODConsole::setDefaultBackground(TCODColor back) + @C void TCOD_console_set_default_background(TCOD_console_t con,TCOD_color_t back) + @Py console_set_default_background(con,back) + @C# void TCODConsole::setBackgroundColor(TCODColor back) + @Lua Console:setBackgroundColor(back) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param back the new default background color for this console + @CppEx TCODConsole::root->setDefaultBackground(myColor) + @CEx TCOD_console_set_default_background(NULL, my_color) + @PyEx litbcod.console_set_default_background(0, my_color) + @Lua libtcod.TCODConsole_root:setBackgroundColor( myColor ) + */ + void setDefaultBackground(TCODColor back); + + /** + @PageName console_draw_basic + @FuncTitle Setting the default foreground color + @FuncDesc This function changes the default foreground color for a console. The default foreground color is used by several drawing functions like clear, putChar, ... + @Cpp void TCODConsole::setDefaultForeground(TCODColor fore) + @C void TCOD_console_set_default_foreground(TCOD_console_t con,TCOD_color_t fore) + @Py console_set_default_foreground(con, fore) + @C# void TCODConsole::setForegroundColor(TCODColor fore) + @Lua Console:setForegroundColor(fore) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param fore the new default foreground color for this console + @CppEx TCODConsole::root->setDefaultForeground(myColor) + @CEx TCOD_console_set_default_foreground(NULL, my_color) + @PyEx litbcod.console_set_default_foreground(0, my_color) + @LuaEx libtcod.TCODConsole_root:setForegroundColor( myColor ) + */ + void setDefaultForeground(TCODColor fore); + + /** + @PageName console_draw_basic + @FuncTitle Clearing a console + @FuncDesc This function modifies all cells of a console : + * set the cell's background color to the console default background color + * set the cell's foreground color to the console default foreground color + * set the cell's ASCII code to 32 (space) + @Cpp void TCODConsole::clear() + @C void TCOD_console_clear(TCOD_console_t con) + @Py console_clear(con) + @C# void TCODConsole::clear() + @Lua Console:clear() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + void clear(); + + /** + @PageName console_draw_basic + @FuncTitle Setting the background color of a cell + @FuncDesc This function modifies the background color of a cell, leaving other properties (foreground color and ASCII code) unchanged. + @Cpp void TCODConsole::setCharBackground(int x, int y, const TCODColor &col, TCOD_bkgnd_flag_t flag = TCOD_BKGND_SET) + @C void TCOD_console_set_char_background(TCOD_console_t con,int x, int y, TCOD_color_t col, TCOD_bkgnd_flag_t flag) + @Py console_set_char_background(con, x, y, col, flag=BKGND_SET) + @C# + void TCODConsole::setCharBackground(int x, int y, TCODColor col) + void TCODConsole::setCharBackground(int x, int y, TCODColor col, TCODBackgroundFlag flag) + @Lua + Console:setCharBackground(x, y, col) + Console:setCharBackground(x, y, col, flag) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + @Param col the background color to use. You can use color constants + @Param flag this flag defines how the cell's background color is modified. See
    TCOD_bkgnd_flag_t + */ + void setCharBackground(int x, int y, const TCODColor &col, TCOD_bkgnd_flag_t flag = TCOD_BKGND_SET); + /** + @PageName console_draw_basic + @FuncTitle Setting the foreground color of a cell + @FuncDesc This function modifies the foreground color of a cell, leaving other properties (background color and ASCII code) unchanged. + @Cpp void TCODConsole::setCharForeground(int x, int y, const TCODColor &col) + @C void TCOD_console_set_char_foreground(TCOD_console_t con,int x, int y, TCOD_color_t col) + @Py console_set_char_foreground(con, x, y, col) + @C# void TCODConsole::setCharForeground(int x, int y, TCODColor col) + @Lua Console:setCharForeground(x, y, col) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + @Param col the foreground color to use. You can use color constants + */ + void setCharForeground(int x, int y, const TCODColor &col); + + /** + @PageName console_draw_basic + @FuncTitle Setting the ASCII code of a cell + @FuncDesc This function modifies the ASCII code of a cell, leaving other properties (background and foreground colors) unchanged. + Note that since a clear console has both background and foreground colors set to black for every cell, using setchar will produce black characters on black background. Use putchar instead. + @Cpp void TCODConsole::setChar(int x, int y, int c) + @C void TCOD_console_set_char(TCOD_console_t con,int x, int y, int c) + @Py console_set_char(con, x, y, c) + @C# void TCODConsole::setChar(int x, int y, int c) + @Lua Console:setChar(x, y, c) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + @Param c the new ASCII code for the cell. You can use ASCII constants + */ + void setChar(int x, int y, int c); + + /** + @PageName console_draw_basic + @FuncTitle Setting every property of a cell using default colors + @FuncDesc This function modifies every property of a cell : + * update the cell's background color according to the console default background color (see TCOD_bkgnd_flag_t). + * set the cell's foreground color to the console default foreground color + * set the cell's ASCII code to c + @Cpp void TCODConsole::putChar(int x, int y, int c, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT) + @C void TCOD_console_put_char(TCOD_console_t con,int x, int y, int c, TCOD_bkgnd_flag_t flag) + @Py console_put_char( con, x, y, c, flag=BKGND_DEFAULT) + @C# + void TCODConsole::putChar(int x, int y, int c) + void TCODConsole::putChar(int x, int y, int c, TCODBackgroundFlag flag) + @Lua + Console:putChar(x, y, c) + Console:putChar(x, y, c, flag) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + @Param c the new ASCII code for the cell. You can use ASCII constants + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + */ + void putChar(int x, int y, int c, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT); + + /** + @PageName console_draw_basic + @FuncTitle Setting every property of a cell using specific colors + @FuncDesc This function modifies every property of a cell : + * set the cell's background color to back. + * set the cell's foreground color to fore. + * set the cell's ASCII code to c. + @Cpp void TCODConsole::putCharEx(int x, int y, int c, const TCODColor & fore, const TCODColor & back) + @C void TCOD_console_put_char_ex(TCOD_console_t con,int x, int y, int c, TCOD_color_t fore, TCOD_color_t back) + @Py console_put_char_ex( con, x, y, c, fore, back) + @C# void TCODConsole::putCharEx(int x, int y, int c, TCODColor fore, TCODColor back) + @Lua Console:putCharEx(x, y, c, fore, back) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + @Param c the new ASCII code for the cell. You can use ASCII constants + @Param fore,back new foreground and background colors for this cell + */ + void putCharEx(int x, int y, int c, const TCODColor &fore, const TCODColor &back); + + /** + @PageName console_bkgnd_flag_t + @PageTitle Background effect flags + @PageFather console_draw + @PageDesc This flag is used by most functions that modify a cell background color. It defines how the console's current background color is used to modify the cell's existing background color : + TCOD_BKGND_NONE : the cell's background color is not modified. + TCOD_BKGND_SET : the cell's background color is replaced by the console's default background color : newbk = curbk. + TCOD_BKGND_MULTIPLY : the cell's background color is multiplied by the console's default background color : newbk = oldbk * curbk + TCOD_BKGND_LIGHTEN : newbk = MAX(oldbk,curbk) + TCOD_BKGND_DARKEN : newbk = MIN(oldbk,curbk) + TCOD_BKGND_SCREEN : newbk = white - (white - oldbk) * (white - curbk) // inverse of multiply : (1-newbk) = (1-oldbk)*(1-curbk) + TCOD_BKGND_COLOR_DODGE : newbk = curbk / (white - oldbk) + TCOD_BKGND_COLOR_BURN : newbk = white - (white - oldbk) / curbk + TCOD_BKGND_ADD : newbk = oldbk + curbk + TCOD_BKGND_ADDALPHA(alpha) : newbk = oldbk + alpha*curbk + TCOD_BKGND_BURN : newbk = oldbk + curbk - white + TCOD_BKGND_OVERLAY : newbk = curbk.x <= 0.5 ? 2*curbk*oldbk : white - 2*(white-curbk)*(white-oldbk) + TCOD_BKGND_ALPHA(alpha) : newbk = (1.0f-alpha)*oldbk + alpha*(curbk-oldbk) + TCOD_BKGND_DEFAULT : use the console's default background flag + Note that TCOD_BKGND_ALPHA and TCOD_BKGND_ADDALPHA are MACROS that needs a float parameter between (0.0 and 1.0). TCOD_BKGND_ALPH and TCOD_BKGND_ADDA should not be used directly (else they will have the same effect as TCOD_BKGND_NONE). + For python, remove TCOD_ : libtcod.BKGND_NONE + For C# : None, Set, Multiply, Lighten, Darken, Screen, ColodDodge, ColorBurn, Add, Burn Overlay, Default + With lua, use tcod.None, ..., tcod.Default, BUT tcod.console.Alpha(value) and tcod.console.AddAlpha(value) + */ + + /** + @PageName console_print + @PageTitle String drawing functions + @PageFather console_draw + @FuncTitle Setting the default background flag + @FuncDesc This function defines the background mode (see TCOD_bkgnd_flag_t) for the console. + This default mode is used by several functions (print, printRect, ...) + @Cpp void TCODConsole::setBackgroundFlag(TCOD_bkgnd_flag_t flag) + @C void TCOD_console_set_background_flag(TCOD_console_t con,TCOD_bkgnd_flag_t flag) + @Py console_set_background_flag(con, flag) + @C# void TCODConsole::setBackgroundFlag(TCODBackgroundFlag flag) + @Lua Console:setBackgroundFlag(flag) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + */ + void setBackgroundFlag(TCOD_bkgnd_flag_t flag); + + /** + @PageName console_print + @FuncTitle Getting the default background flag + @FuncDesc This function returns the background mode (see TCOD_bkgnd_flag_t) for the console. + This default mode is used by several functions (print, printRect, ...) + @Cpp TCOD_bkgnd_flag_t TCODConsole::getBackgroundFlag() const + @C TCOD_bkgnd_flag_t TCOD_console_get_background_flag(TCOD_console_t con) + @Py console_get_background_flag(con) + @C# TCODBackgroundFlag TCODConsole::getBackgroundFlag() + @Lua Console:getBackgroundFlag() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + TCOD_bkgnd_flag_t getBackgroundFlag() const; + + /** + @PageName console_print + @FuncTitle Setting the default alignment + @FuncDesc This function defines the default alignment (see TCOD_alignment_t) for the console. + This default alignment is used by several functions (print, printRect, ...). + Values for alignment : TCOD_LEFT, TCOD_CENTER, TCOD_RIGHT (in python, remove TCOD_ : libtcod.LEFT). + For C# and Lua : LeftAlignment, RightAlignment, CenterAlignment + @Cpp void TCODConsole::setAlignment(TCOD_alignment_t alignment) + @C void TCOD_console_set_alignment(TCOD_console_t con,TCOD_bkgnd_flag_t alignment) + @Py console_set_alignment(con, alignment) + @C# void TCODConsole::setAlignment(TCODAlignment alignment) + @Lua Console:setAlignment(alignment) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param alignment defines how the strings are printed on screen. + */ + void setAlignment(TCOD_alignment_t alignment); + + /** + @PageName console_print + @FuncTitle Getting the default alignment + @FuncDesc This function returns the default alignment (see TCOD_alignment_t) for the console. + This default mode is used by several functions (print, printRect, ...). + Values for alignment : TCOD_LEFT, TCOD_CENTER, TCOD_RIGHT (in python, remove TCOD_ : libtcod.LEFT). + For C# and Lua : LeftAlignment, RightAlignment, CenterAlignment + @Cpp TCOD_alignment_t TCODConsole::getAlignment() const + @C TCOD_alignment_t TCOD_console_get_alignment(TCOD_console_t con) + @Py console_get_alignment(con) + @C# TCODAlignment TCODConsole::getAlignment() + @Lua Console:getAlignment() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + TCOD_alignment_t getAlignment() const; + + /** + @PageName console_print + @FuncTitle Printing a string with default parameters + @FuncDesc This function print a string at a specific position using current default alignment, background flag, foreground and background colors. + @Cpp void TCODConsole::print(int x, int y, const char *fmt, ...) + @C void TCOD_console_print(TCOD_console_t con,int x, int y, const char *fmt, ...) + @Py console_print(con, x, y, fmt) + @C# void TCODConsole::print(int x, int y, string fmt) + @Lua Console:print(x, y, fmt) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinate of the character in the console, depending on the default alignment for this console : + * TCOD_LEFT : leftmost character of the string + * TCOD_CENTER : center character of the string + * TCOD_RIGHT : rightmost character of the string + @Param fmt printf-like format string, eventually followed by parameters. You can use control codes to change the colors inside the string, except in C#. + */ + void print(int x, int y, const char *fmt, ...); + + /** + @PageName console_print + @FuncTitle Printing a string with specific alignment and background mode + @FuncDesc This function print a string at a specific position using specific alignment and background flag, but default foreground and background colors. + @Cpp void TCODConsole::printEx(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...) + @C void TCOD_console_print_ex(TCOD_console_t con,int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...) + @Py console_print_ex(con, x, y, flag, alignment, fmt) + @C# void TCODConsole::printEx(int x, int y, TCODBackgroundFlag flag, TCODAlignment alignment, string fmt) + @Lua Console::printEx(x, y, flag, alignment, fmt) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinate of the character in the console, depending on the alignment : + * TCOD_LEFT : leftmost character of the string + * TCOD_CENTER : center character of the string + * TCOD_RIGHT : rightmost character of the string + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + @Param alignment defines how the strings are printed on screen. + @Param fmt printf-like format string, eventually followed by parameters. You can use control codes to change the colors inside the string, except in C#. + */ + void printEx(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...); + + /** + @PageName console_print + @FuncTitle Printing a string with default parameters and autowrap + @FuncDesc This function draws a string in a rectangle inside the console, using default colors, alignment and background mode. + If the string reaches the borders of the rectangle, carriage returns are inserted. + If h > 0 and the bottom of the rectangle is reached, the string is truncated. If h = 0, the string is only truncated if it reaches the bottom of the console. + The function returns the height (number of console lines) of the printed string. + @Cpp int TCODConsole::printRect(int x, int y, int w, int h, const char *fmt, ...) + @C int TCOD_console_print_rect(TCOD_console_t con,int x, int y, int w, int h, const char *fmt, ...) + @Py console_print_rect(con, x, y, w, h, fmt) + @C# int TCODConsole::printRect(int x, int y, int w, int h, string fmt) + @Lua Console:printRect(x, y, w, h, fmt) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinate of the character in the console, depending on the alignment : + * TCOD_LEFT : leftmost character of the string + * TCOD_CENTER : center character of the string + * TCOD_RIGHT : rightmost character of the string + @Param w,h size of the rectangle + x <= x+w < console width + y <= y+h < console height + @Param fmt printf-like format string, eventually followed by parameters. You can use control codes to change the colors inside the string, except in C#. + */ + int printRect(int x, int y, int w, int h, const char *fmt, ...); + + /** + @PageName console_print + @FuncTitle Printing a string with specific alignment and background mode and autowrap + @FuncDesc This function draws a string in a rectangle inside the console, using default colors, but specific alignment and background mode. + If the string reaches the borders of the rectangle, carriage returns are inserted. + If h > 0 and the bottom of the rectangle is reached, the string is truncated. If h = 0, the string is only truncated if it reaches the bottom of the console. + The function returns the height (number of console lines) of the printed string. + @Cpp int TCODConsole::printRectEx(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...) + @C int TCOD_console_print_rect_ex(TCOD_console_t con,int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...) + @Py console_print_rect_ex(con, x, y, w, h, flag, alignment, fmt) + @C# int TCODConsole::printRectEx(int x, int y, int w, int h, TCODBackgroundFlag flag, TCODAlignment alignment, string fmt) + @Lua Console:printRectEx(x, y, w, h, flag, alignment, fmt) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinate of the character in the console, depending on the alignment : + * TCOD_LEFT : leftmost character of the string + * TCOD_CENTER : center character of the string + * TCOD_RIGHT : rightmost character of the string + @Param w,h size of the rectangle + x <= x+w < console width + y <= y+h < console height + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + @Param alignment defines how the strings are printed on screen. + @Param fmt printf-like format string, eventually followed by parameters. You can use control codes to change the colors inside the string, except in C#. + */ + int printRectEx(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...); + + /** + @PageName console_print + @FuncTitle Compute the height of an autowrapped string + @FuncDesc This function returns the expected height of an autowrapped string without actually printing the string with printRect or printRectEx + @Cpp int TCODConsole::getHeightRect(int x, int y, int w, int h, const char *fmt, ...) + + @C int TCOD_console_get_height_rect(TCOD_console_t con,int x, int y, int w, int h, const char *fmt, ...) + @Py console_get_height_rect(con, x, y, w, h, fmt) + @C# int TCODConsole::getHeightRect(int x, int y, int w, int h, string fmt) + @Lua Console:getHeightRect(x, y, w, h, fmt) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinate of the rectangle upper-left corner in the console + @Param w,h size of the rectangle + x <= x+w < console width + y <= y+h < console height + @Param fmt printf-like format string, eventually followed by parameters. You can use control codes to change the colors inside the string, except in C#. + */ + int getHeightRect(int x, int y, int w, int h, const char *fmt, ...); + + /** + @PageName console_print + @FuncTitle Changing the colors while printing a string + @FuncDesc If you want to draw a string using different colors for each word, the basic solution is to call a string printing function several times, changing the default colors between each call. + The TCOD library offers a simpler way to do this, allowing you to draw a string using different colors in a single call. For this, you have to insert color control codes in your string. + A color control code is associated with a color set (a foreground color and a background color). If you insert this code in your string, the next characters will use the colors associated with the color control code. + There are 5 predefined color control codes : + For python, remove TCOD_ : libtcod.COLCTRL_1 + TCOD_COLCTRL_1 + TCOD_COLCTRL_2 + TCOD_COLCTRL_3 + TCOD_COLCTRL_4 + TCOD_COLCTRL_5 + To associate a color with a code, use setColorControl. + To go back to the console's default colors, insert in your string the color stop control code : + TCOD_COLCTRL_STOP + + You can also use any color without assigning it to a control code, using the generic control codes : + TCOD_COLCTRL_FORE_RGB + TCOD_COLCTRL_BACK_RGB + + Those controls respectively change the foreground and background color used to print the string characters. In the string, you must insert the r,g,b components of the color (between 1 and 255. The value 0 is forbidden because it represents the end of the string in C/C++) immediately after this code. + @Cpp static void TCODConsole::setColorControl(TCOD_colctrl_t con, const TCODColor &fore, const TCODColor &back) + @C void TCOD_console_set_color_control(TCOD_colctrl_t con, TCOD_color_t fore, TCOD_color_t back) + @Py console_set_color_control(con,fore,back) + @C# Not supported directly, use getRGBColorControlString and getColorControlString. + @Lua Not supported + @Param con the color control TCOD_COLCTRL_x, 1<=x<=5 + @Param fore foreground color when this control is activated + @Param back background color when this control is activated + @CppEx + // A string with a red over black word, using predefined color control codes + TCODConsole::setColorControl(TCOD_COLCTRL_1,TCODColor::red,TCODColor::black); + TCODConsole::root->print(1,1,"String with a %cred%c word.",TCOD_COLCTRL_1,TCOD_COLCTRL_STOP); + // A string with a red over black word, using generic color control codes + TCODConsole::root->print(1,1,"String with a %c%c%c%c%c%c%c%cred%c word.", + TCOD_COLCTRL_FORE_RGB,255,1,1,TCOD_COLCTRL_BACK_RGB,1,1,1,TCOD_COLCTRL_STOP); + // A string with a red over black word, using generic color control codes + TCODConsole::root->print(1,1,"String with a %c%c%c%c%c%c%c%cred%c word.", + TCOD_COLCTRL_FORE_RGB,255,1,1,TCOD_COLCTRL_BACK_RGB,1,1,1,TCOD_COLCTRL_STOP); + @CEx + // A string with a red over black word, using predefined color control codes + TCOD_console_set_color_control(TCOD_COLCTRL_1,red,black); + TCOD_console_print(NULL,1,1,"String with a %cred%c word.",TCOD_COLCTRL_1,TCOD_COLCTRL_STOP); + // A string with a red word (over default background color), using generic color control codes + TCOD_console_print(NULL,1,1,"String with a %c%c%c%cred%c word.", + TCOD_COLCTRL_FORE_RGB,255,1,1,TCOD_COLCTRL_STOP); + // A string with a red over black word, using generic color control codes + TCOD_console_print(NULL,1,1,"String with a %c%c%c%c%c%c%c%cred%c word.", + TCOD_COLCTRL_FORE_RGB,255,1,1,TCOD_COLCTRL_BACK_RGB,1,1,1,TCOD_COLCTRL_STOP); + @PyEx + # A string with a red over black word, using predefined color control codes + libtcod.console_set_color_control(libtcod.COLCTRL_1,litbcod.red,litbcod.black) + libtcod.console_print(0,1,1,"String with a %cred%c word."%(libtcod.COLCTRL_1,libtcod.COLCTRL_STOP)) + # A string with a red word (over default background color), using generic color control codes + litbcod.console_print(0,1,1,"String with a %c%c%c%cred%c word."%(libtcod.COLCTRL_FORE_RGB,255,1,1,libtcod.COLCTRL_STOP)) + # A string with a red over black word, using generic color control codes + libtcod.console_print(0,1,1,"String with a %c%c%c%c%c%c%c%cred%c word."% + (libtcod.COLCTRL_FORE_RGB,255,1,1,libtcod.COLCTRL_BACK_RGB,1,1,1,libtcod.COLCTRL_STOP)) + + @C#Ex + TCODConsole.root.print(1,1,String.Format("String with a {0}red{1} word.", + TCODConsole.getRGBColorControlString(ColorControlForeground,TCODColor.red), + TCODConsole.getColorControlString(ColorControlStop)); + */ + static void setColorControl(TCOD_colctrl_t con, const TCODColor &fore, const TCODColor &back); + +#ifndef NO_UNICODE + /** + @PageName console_print + @FuncTitle Unicode functions + @FuncDesc those functions are similar to their ASCII equivalent, but work with unicode strings (wchar_t in C/C++). + Note that unicode is not supported in the python wrapper. + @Cpp static void TCODConsole::mapStringToFont(const wchar_t *s, int fontCharX, int fontCharY) + @C void TCOD_console_map_string_to_font_utf(const wchar_t *s, int fontCharX, int fontCharY) + */ + static void mapStringToFont(const wchar_t *s, int fontCharX, int fontCharY); + /** + @PageName console_print + @Cpp void TCODConsole::print(int x, int y, const wchar_t *fmt, ...) + @C void TCOD_console_print_utf(TCOD_console_t con,int x, int y, const wchar_t *fmt, ...) + */ + void print(int x, int y, const wchar_t *fmt, ...); + /** + @PageName console_print + @Cpp void TCODConsole::printEx(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) + @C void TCOD_console_print_ex_utf(TCOD_console_t con,int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) + */ + void printEx(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...); + /** + @PageName console_print + @Cpp int TCODConsole::printRect(int x, int y, int w, int h, const wchar_t *fmt, ...) + @C int TCOD_console_print_rect_utf(TCOD_console_t con,int x, int y, int w, int h, const wchar_t *fmt, ...) + */ + int printRect(int x, int y, int w, int h, const wchar_t *fmt, ...); + + /** + @PageName console_print + @Cpp int TCODConsole::printRectEx(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) + @C int TCOD_console_print_rect_ex_utf(TCOD_console_t con,int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) + */ + int printRectEx(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...); + + /** + @PageName console_print + @Cpp int TCODConsole::getHeightRect(int x, int y, int w, int h, const wchar_t *fmt, ...) + @C int TCOD_console_get_height_rect_utf(TCOD_console_t con,int x, int y, int w, int h, const wchar_t *fmt, ...) + */ + int getHeightRect(int x, int y, int w, int h, const wchar_t *fmt, ...); +#endif + + /** + @PageName console_advanced + @PageFather console_draw + @PageTitle Advanced printing functions + @FuncTitle Filling a rectangle with the background color + @FuncDesc Fill a rectangle inside a console. For each cell in the rectangle : + * set the cell's background color to the console default background color + * if clear is true, set the cell's ASCII code to 32 (space) + @Cpp void TCODConsole::rect(int x, int y, int w, int h, bool clear, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT) + @C void TCOD_console_rect(TCOD_console_t con,int x, int y, int w, int h, bool clear, TCOD_bkgnd_flag_t flag) + @Py console_rect(con,x, y, w, h, clear, flag=BKGND_DEFAULT) + @C# + void TCODConsole::rect(int x, int y, int w, int h, bool clear) + void TCODConsole::rect(int x, int y, int w, int h, bool clear, TCODBackgroundFlag flag) + @Lua + Console:rect(x, y, w, h, clear) + Console:rect(x, y, w, h, clear, flag) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of rectangle upper-left corner in the console. + 0 <= x < console width + 0 <= y < console height + @Param w,h size of the rectangle in the console. + x <= x+w < console width + y <= y+h < console height + @Param clear if true, all characters inside the rectangle are set to ASCII code 32 (space). + If false, only the background color is modified + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + */ + void rect(int x, int y, int w, int h, bool clear, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT); + + /** + @PageName console_advanced + @FuncTitle Drawing an horizontal line + @FuncDesc Draws an horizontal line in the console, using ASCII code TCOD_CHAR_HLINE (196), and the console's default background/foreground colors. + @Cpp void TCODConsole::hline(int x,int y, int l, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT) + @C void TCOD_console_hline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) + @Py console_hline(con,x,y,l,flag=BKGND_DEFAULT) + @C# + void TCODConsole::hline(int x,int y, int l) + void TCODConsole::hline(int x,int y, int l, TCODBackgroundFlag flag) + @Lua + Console:hline(x,y, l) + Console:hline(x,y, l, flag) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y Coordinates of the line's left end in the console. + 0 <= x < console width + 0 <= y < console height + @Param l The length of the line in cells 1 <= l <= console width - x + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + */ + void hline(int x,int y, int l, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT); + + /** + @PageName console_advanced + @FuncTitle Drawing an vertical line + @FuncDesc Draws an vertical line in the console, using ASCII code TCOD_CHAR_VLINE (179), and the console's default background/foreground colors. + @Cpp void TCODConsole::vline(int x,int y, int l, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT) + @C void TCOD_console_vline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) + @Py console_vline(con,x,y,l,flag=BKGND_DEFAULT) + @C# + void TCODConsole::vline(int x,int y, int l) + void TCODConsole::vline(int x,int y, int l, TCODBackgroundFlag flag) + @Lua + Console:vline(x,y, l) + Console:vline(x,y, l, flag) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y Coordinates of the line's upper end in the console. + 0 <= x < console width + 0 <= y < console height + @Param l The length of the line in cells 1 <= l <= console height - y + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + */ + void vline(int x,int y, int l, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT); + + /** + @PageName console_advanced + @FuncTitle Drawing a window frame + @FuncDesc This function calls the rect function using the supplied background mode flag, then draws a rectangle with the console's default foreground color. If fmt is not NULL, it is printed on the top of the rectangle, using inverted colors. + @Cpp void TCODConsole::printFrame(int x,int y,int w,int h, bool clear=true, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT, const char *fmt=NULL, ...) + @C void TCOD_console_print_frame(TCOD_console_t con,int x,int y,int w,int h, bool clear, TCOD_bkgnd_flag_t flag, const char *fmt, ...) + @Py console_print_frame(con,x, y, w, h, clear=True, flag=BKGND_DEFAULT, fmt=0) + @C# + void TCODConsole::printFrame(int x,int y, int w,int h) + void TCODConsole::printFrame(int x,int y, int w,int h, bool clear) + void TCODConsole::printFrame(int x,int y, int w,int h, bool clear, TCODBackgroundFlag flag) + void TCODConsole::printFrame(int x,int y, int w,int h, bool clear, TCODBackgroundFlag flag, string fmt) + @Lua + Console:printFrame(x,y, w,h) + Console:printFrame(x,y, w,h, clear) + Console:printFrame(x,y, w,h, clear, flag) + Console:printFrame(x,y, w,h, clear, flag, fmt) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y Coordinates of the rectangle's upper-left corner in the console. + 0 <= x < console width + 0 <= y < console height + @Param w,h size of the rectangle in the console. + x <= x+w < console width + y <= y+h < console height + @Param clear if true, all characters inside the rectangle are set to ASCII code 32 (space). + If false, only the background color is modified + @Param flag this flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t + @Param fmt if NULL, the funtion only draws a rectangle. + Else, printf-like format string, eventually followed by parameters. You can use control codes to change the colors inside the string. + */ + void printFrame(int x,int y,int w,int h, bool clear=true, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT, const char *fmt=NULL, ...); + + /** + @PageName console_read + @PageTitle Reading the content of the console + @PageFather console_draw + @FuncTitle Get the console's width + @FuncDesc This function returns the width of a console (either the root console or an offscreen console) + @Cpp int TCODConsole::getWidth() const + @C int TCOD_console_get_width(TCOD_console_t con) + @Py console_get_width(con) + @C# int TCODConsole::getWidth() + @Lua Console:getWidth() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + int getWidth() const; + + /** + @PageName console_read + @FuncTitle Get the console's height + @FuncDesc This function returns the height of a console (either the root console or an offscreen console) + @Cpp int TCODConsole::getHeight() const + @C int TCOD_console_get_height(TCOD_console_t con) + @Py console_get_height(con) + @C# int TCODConsole::getHeight() + @Lua Console:getHeight() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + int getHeight() const; + + /** + @PageName console_read + @FuncTitle Reading the default background color + @FuncDesc This function returns the default background color of a console. + @Cpp TCODColor TCODConsole::getDefaultBackground() const + @C TCOD_color_t TCOD_console_get_default_background(TCOD_console_t con) + @Py console_get_default_background(con) + @C# TCODColor TCODConsole::getBackgroundColor() + @Lua Console:getBackgroundColor() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + TCODColor getDefaultBackground() const; + + /** + @PageName console_read + @FuncTitle Reading the default foreground color + @FuncDesc This function returns the default foreground color of a console. + @Cpp TCODColor TCODConsole::getDefaultForeground() const + @C TCOD_color_t TCOD_console_get_default_foreground(TCOD_console_t con) + @Py console_get_default_foreground(con) + @C# TCODColor TCODConsole::getForegroundColor() + @Lua Console:getForegroundColor() + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + */ + TCODColor getDefaultForeground() const; + + /** + @PageName console_read + @FuncTitle Reading the background color of a cell + @FuncDesc This function returns the background color of a cell. + @Cpp TCODColor TCODConsole::getCharBackground(int x, int y) const + @C TCOD_color_t TCOD_console_get_char_background(TCOD_console_t con,int x, int y) + @Py console_get_char_background(con,x,y) + @C# TCODColor TCODConsole::getCharBackground(int x, int y) + @Lua Console::getCharBackground(x, y) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + */ + TCODColor getCharBackground(int x, int y) const; + + /** + @PageName console_read + @FuncTitle Reading the foreground color of a cell + @FuncDesc This function returns the foreground color of a cell. + @Cpp TCODColor TCODConsole::getCharForeground(int x, int y) const + @C TCOD_color_t TCOD_console_get_char_foreground(TCOD_console_t con,int x, int y) + @Py console_get_char_foreground(con,x,y) + @C# TCODColor TCODConsole::getCharForeground(int x, int y) + @Lua Console::getCharForeground(x, y) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + */ + TCODColor getCharForeground(int x, int y) const; + + /** + @PageName console_read + @FuncTitle Reading the ASCII code of a cell + @FuncDesc This function returns the ASCII code of a cell. + @Cpp int TCODConsole::getChar(int x, int y) const + @C int TCOD_console_get_char(TCOD_console_t con,int x, int y) + @Py console_get_char(con,x,y) + @C# int TCODConsole::getChar(int x, int y) + @Lua Console::getChar(x, y) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param x,y coordinates of the cell in the console. + 0 <= x < console width + 0 <= y < console height + */ + int getChar(int x, int y) const; + + /** + @PageName console_fading + @PageTitle Screen fading functions + @PageFather console_draw + @PageDesc Use these functions to easily fade to/from a color + @FuncTitle Changing the fading parameters + @FuncDesc This function defines the fading parameters, allowing to easily fade the game screen to/from a color. Once they are defined, the fading parameters are valid for ever. You don't have to call setFade for each rendered frame (unless you change the fading parameters). + @Cpp static void TCODConsole::setFade(uint8 fade, const TCODColor &fadingColor) + @C void TCOD_console_set_fade(uint8 fade, TCOD_color_t fadingColor) + @Py console_set_fade(fade, fadingColor) + @C# static void TCODConsole::setFade(byte fade, TCODColor fadingColor) + @Lua tcod.console.setFade(fade, fadingColor) + @Param fade the fading amount. 0 => the screen is filled with the fading color. 255 => no fading effect + @Param fadingColor the color to use during the console flushing operation + @CppEx + for (int fade=255; fade >= 0; fade --) { + TCODConsole::setFade(fade,TCODColor::black); + TCODConsole::flush(); + } + @CEx + int fade; + for (fade=255; fade >= 0; fade --) { + TCOD_console_setFade(fade,TCOD_black); + TCOD_console_flush(); + } + @PyEx + for fade in range(255,0) : + libtcod.console_setFade(fade,libtcod.black) + libtcod.console_flush() + @LuaEx + for fade=255,0,-1 do + tcod.console.setFade(fade,tcod.color.black) + tcod.console.flush() + end + */ + static void setFade(uint8 fade, const TCODColor &fadingColor); + + /** + @PageName console_fading + @FuncTitle Reading the fade amount + @FuncDesc This function returns the current fade amount, previously defined by setFade. + @Cpp static uint8 TCODConsole::getFade() + @C uint8 TCOD_console_get_fade() + @Py console_get_fade() + @C# static byte TCODConsole::getFade() + @Lua tcod.console.getFade() + */ + static uint8 getFade(); + + /** + @PageName console_fading + @FuncTitle Reading the fading color + @FuncDesc This function returns the current fading color, previously defined by setFade. + @Cpp static TCODColor TCODConsole::getFadingColor() + @C TCOD_color_t TCOD_console_get_fading_color() + @Py console_get_fading_color() + @C# static TCODColor TCODConsole::getFadingColor() + @Lua tcod.console.getFadingColor() + */ + static TCODColor getFadingColor(); + + /** + @PageName console_flush + @PageFather console + @PageTitle Flushing the root console + @FuncDesc Once the root console is initialized, you can use one of the printing functions to change the background colors, the foreground colors or the ASCII characters on the console. + Once you've finished rendering the root console, you have to actually apply the updates to the screen with this function. + @Cpp static void TCODConsole::flush() + @C void TCOD_console_flush() + @Py console_flush() + @C# static void TCODConsole::flush() + @Lua tcod.console.flush() + */ + static void flush(); + + /** + @PageName console_ascii + @PageTitle ASCII constants + @PageFather console_draw + @FuncDesc Some useful graphic characters in the terminal.bmp font. For the python version, remove TCOD_ from the constants. C# and Lua is in parenthesis : + Single line walls: + TCOD_CHAR_HLINE=196 (HorzLine) + TCOD_CHAR_VLINE=179 (VertLine) + TCOD_CHAR_NE=191 (NE) + TCOD_CHAR_NW=218 (NW) + TCOD_CHAR_SE=217 (SE) + TCOD_CHAR_SW=192 (SW) + + Double lines walls: + TCOD_CHAR_DHLINE=205 (DoubleHorzLine) + TCOD_CHAR_DVLINE=186 (DoubleVertLine) + TCOD_CHAR_DNE=187 (DoubleNE) + TCOD_CHAR_DNW=201 (DoubleNW) + TCOD_CHAR_DSE=188 (DoubleSE) + TCOD_CHAR_DSW=200 (DoubleSW) + + Single line vertical/horizontal junctions (T junctions): + TCOD_CHAR_TEEW=180 (TeeWest) + TCOD_CHAR_TEEE=195 (TeeEast) + TCOD_CHAR_TEEN=193 (TeeNorth) + TCOD_CHAR_TEES=194 (TeeSouth) + + Double line vertical/horizontal junctions (T junctions): + TCOD_CHAR_DTEEW=185 (DoubleTeeWest) + TCOD_CHAR_DTEEE=204 (DoubleTeeEast) + TCOD_CHAR_DTEEN=202 (DoubleTeeNorth) + TCOD_CHAR_DTEES=203 (DoubleTeeSouth) + + Block characters: + TCOD_CHAR_BLOCK1=176 (Block1) + TCOD_CHAR_BLOCK2=177 (Block2) + TCOD_CHAR_BLOCK3=178 (Block3) + + Cross-junction between two single line walls: + TCOD_CHAR_CROSS=197 (Cross) + + Arrows: + TCOD_CHAR_ARROW_N=24 (ArrowNorth) + TCOD_CHAR_ARROW_S=25 (ArrowSouth) + TCOD_CHAR_ARROW_E=26 (ArrowEast) + TCOD_CHAR_ARROW_W=27 (ArrowWest) + + Arrows without tail: + TCOD_CHAR_ARROW2_N=30 (ArrowNorthNoTail) + TCOD_CHAR_ARROW2_S=31 (ArrowSouthNoTail) + TCOD_CHAR_ARROW2_E=16 (ArrowEastNoTail) + TCOD_CHAR_ARROW2_W=17 (ArrowWestNoTail) + + Double arrows: + TCOD_CHAR_DARROW_H=29 (DoubleArrowHorz) + TCOD_CHAR_ARROW_V=18 (DoubleArrowVert) + + GUI stuff: + TCOD_CHAR_CHECKBOX_UNSET=224 + TCOD_CHAR_CHECKBOX_SET=225 + TCOD_CHAR_RADIO_UNSET=9 + TCOD_CHAR_RADIO_SET=10 + + Sub-pixel resolution kit: + TCOD_CHAR_SUBP_NW=226 (SubpixelNorthWest) + TCOD_CHAR_SUBP_NE=227 (SubpixelNorthEast) + TCOD_CHAR_SUBP_N=228 (SubpixelNorth) + TCOD_CHAR_SUBP_SE=229 (SubpixelSouthEast) + TCOD_CHAR_SUBP_DIAG=230 (SubpixelDiagonal) + TCOD_CHAR_SUBP_E=231 (SubpixelEast) + TCOD_CHAR_SUBP_SW=232 (SubpixelSouthWest) + + Miscellaneous characters: + TCOD_CHAR_SMILY = 1 (Smilie) + TCOD_CHAR_SMILY_INV = 2 (SmilieInv) + TCOD_CHAR_HEART = 3 (Heart) + TCOD_CHAR_DIAMOND = 4 (Diamond) + TCOD_CHAR_CLUB = 5 (Club) + TCOD_CHAR_SPADE = 6 (Spade) + TCOD_CHAR_BULLET = 7 (Bullet) + TCOD_CHAR_BULLET_INV = 8 (BulletInv) + TCOD_CHAR_MALE = 11 (Male) + TCOD_CHAR_FEMALE = 12 (Female) + TCOD_CHAR_NOTE = 13 (Note) + TCOD_CHAR_NOTE_DOUBLE = 14 (NoteDouble) + TCOD_CHAR_LIGHT = 15 (Light) + TCOD_CHAR_EXCLAM_DOUBLE = 19 (ExclamationDouble) + TCOD_CHAR_PILCROW = 20 (Pilcrow) + TCOD_CHAR_SECTION = 21 (Section) + TCOD_CHAR_POUND = 156 (Pound) + TCOD_CHAR_MULTIPLICATION = 158 (Multiplication) + TCOD_CHAR_FUNCTION = 159 (Function) + TCOD_CHAR_RESERVED = 169 (Reserved) + TCOD_CHAR_HALF = 171 (Half) + TCOD_CHAR_ONE_QUARTER = 172 (OneQuarter) + TCOD_CHAR_COPYRIGHT = 184 (Copyright) + TCOD_CHAR_CENT = 189 (Cent) + TCOD_CHAR_YEN = 190 (Yen) + TCOD_CHAR_CURRENCY = 207 (Currency) + TCOD_CHAR_THREE_QUARTERS = 243 (ThreeQuarters) + TCOD_CHAR_DIVISION = 246 (Division) + TCOD_CHAR_GRADE = 248 (Grade) + TCOD_CHAR_UMLAUT = 249 (Umlaut) + TCOD_CHAR_POW1 = 251 (Pow1) + TCOD_CHAR_POW3 = 252 (Pow2) + TCOD_CHAR_POW2 = 253 (Pow3) + TCOD_CHAR_BULLET_SQUARE = 254 (BulletSquare) + */ + + /** + @PageName console_input + @PageTitle Handling user input + @PageDesc The user handling functions allow you to get keyboard and mouse input from the user, either for turn by turn games (the function wait until the user press a key or a mouse button), or real time games (non blocking function). + WARNING : those functions also handle screen redraw event, so TCODConsole::flush function won't redraw screen if no user input function is called ! + @PageFather console + */ + + /* deprecated as of 1.5.1 */ + static TCOD_key_t waitForKeypress(bool flush); + /* deprecated as of 1.5.1 */ + static TCOD_key_t checkForKeypress(int flags=TCOD_KEY_RELEASED); + + /** + @PageName console_blocking_input + @PageCategory Core + @PageFather console_input + @PageTitle Blocking user input + @PageDesc This function stops the application until an event occurs. + */ + + /** + @PageName console_non_blocking_input + @PageTitle Non blocking user input + @PageFather console_input + @FuncDesc The prefered way to check for user input is to use checkForEvent below, but you can also get the status of any special key at any time with : + @Cpp static bool TCODConsole::isKeyPressed(TCOD_keycode_t key) + @C bool TCOD_console_is_key_pressed(TCOD_keycode_t key) + @Py console_is_key_pressed(key) + @C# static bool TCODConsole::isKeyPressed(TCODKeyCode key) + @Lua tcod.console.isKeyPressed(key) + @Param key Any key code defined in keycode_t except TCODK_CHAR (Char) and TCODK_NONE (NoKey) + */ + static bool isKeyPressed(TCOD_keycode_t key); + /** + @PageName console_keyboard_repeat + @PageTitle Changing keyboard repeat delay + @PageFather console_input + @FuncDesc This function changes the keyboard repeat times. + @Cpp static void TCODConsole::setKeyboardRepeat(int initialDelay, int interval) + @C void TCOD_console_set_keyboard_repeat(int initial_delay, int interval) + @Py console_set_keyboard_repeat(initial_delay, interval) + @C# static void TCODConsole::setKeyboardRepeat(int initialDelay, int interval) + @Lua tcod.console.setKeyboardRepeat(initialDelay, interval) + @Param initialDelay delay in millisecond between the time when a key is pressed, and keyboard repeat begins. If 0, keyboard repeat is disabled + @Param interval interval in millisecond between keyboard repeat events + */ + static void setKeyboardRepeat(int initialDelay,int interval); + /** + @PageName console_keyboard_repeat + @FuncDesc You can also disable the keyboard repeat feature with this function (it's equivalent to setKeyboardRepeat(0,0) ). + @Cpp static void TCODConsole::disableKeyboardRepeat() + @C void TCOD_console_disable_keyboard_repeat() + @Py console_disable_keyboard_repeat() + @C# static void TCODConsole::disableKeyboardRepeat() + @Lua tcod.console.disableKeyboardRepeat() + */ + static void disableKeyboardRepeat(); + + /** + @PageName console_key_t + @PageTitle Keyboard event structure + @PageFather console_input + @PageDesc This structure contains information about a key pressed/released by the user. + @C + typedef struct { + TCOD_keycode_t vk; + char c; + bool pressed; + bool lalt; + bool lctrl; + bool ralt; + bool rctrl; + bool shift; + } TCOD_key_t; + @Lua + key.KeyCode + key.Character + key.Pressed + key.LeftAlt + key.LeftControl + key.RightAlt + key.RightControl + key.Shift + @Param vk An arbitrary value representing the physical key on the keyboard. Possible values are stored in the TCOD_keycode_t enum. If no key was pressed, the value is TCODK_NONE + @Param c If the key correspond to a printable character, the character is stored in this field. Else, this field contains 0. + @Param pressed true if the event is a key pressed, or false for a key released. + @Param lalt This field represents the status of the left Alt key : true => pressed, false => released. + @Param lctrl This field represents the status of the left Control key : true => pressed, false => released. + @Param ralt This field represents the status of the right Alt key : true => pressed, false => released. + @Param rctrl This field represents the status of the right Control key : true => pressed, false => released. + @Param shift This field represents the status of the shift key : true => pressed, false => released. + */ + + /** + @PageName console_mouse_t + @PageTitle Mouse event structure + @PageFather console_input + @PageDesc This tructure contains information about a mouse move/press/release event. + @C + typedef struct { + int x,y; + int dx,dy; + int cx,cy; + int dcx,dcy; + bool lbutton; + bool rbutton; + bool mbutton; + bool lbutton_pressed; + bool rbutton_pressed; + bool mbutton_pressed; + bool wheel_up; + bool wheel_down; + } TCOD_mouse_t; + @Param x,y Absolute position of the mouse cursor in pixels relative to the window top-left corner. + @Param dx,dy Movement of the mouse cursor since the last call in pixels. + @Param cx,cy Coordinates of the console cell under the mouse cursor (pixel coordinates divided by the font size). + @Param dcx,dcy Movement of the mouse since the last call in console cells (pixel coordinates divided by the font size). + @Param lbutton true if the left button is pressed. + @Param rbutton true if the right button is pressed. + @Param mbutton true if the middle button (or the wheel) is pressed. + @Param lbutton_pressed true if the left button was pressed and released. + @Param rbutton_pressed true if the right button was pressed and released. + @Param mbutton_pressed true if the middle button was pressed and released. + @Param wheel_up true if the wheel was rolled up. + @Param wheel_down true if the wheel was rolled down. + */ + + /** + @PageName console_keycode_t + @PageTitle Key codes + @PageFather console_input + @PageDesc TCOD_keycode_t is a libtcod specific code representing a key on the keyboard. + For python, replace TCODK by KEY: libtcod.KEY_NONE. C# and Lua, the value is in parenthesis. Possible values are : + When no key was pressed (see checkForEvent) : TCOD_NONE (NoKey) + Special keys : + TCODK_ESCAPE (Escape) + TCODK_BACKSPACE (Backspace) + TCODK_TAB (Tab) + TCODK_ENTER (Enter) + TCODK_SHIFT (Shift) + TCODK_CONTROL (Control) + TCODK_ALT (Alt) + TCODK_PAUSE (Pause) + TCODK_CAPSLOCK (CapsLock) + TCODK_PAGEUP (PageUp) + TCODK_PAGEDOWN (PageDown) + TCODK_END (End) + TCODK_HOME (Home) + TCODK_UP (Up) + TCODK_LEFT (Left) + TCODK_RIGHT (Right) + TCODK_DOWN (Down) + TCODK_PRINTSCREEN (Printscreen) + TCODK_INSERT (Insert) + TCODK_DELETE (Delete) + TCODK_LWIN (Lwin) + TCODK_RWIN (Rwin) + TCODK_APPS (Apps) + TCODK_KPADD (KeypadAdd) + TCODK_KPSUB (KeypadSubtract) + TCODK_KPDIV (KeypadDivide) + TCODK_KPMUL (KeypadMultiply) + TCODK_KPDEC (KeypadDecimal) + TCODK_KPENTER (KeypadEnter) + TCODK_F1 (F1) + TCODK_F2 (F2) + TCODK_F3 (F3) + TCODK_F4 (F4) + TCODK_F5 (F5) + TCODK_F6 (F6) + TCODK_F7 (F7) + TCODK_F8 (F8) + TCODK_F9 (F9) + TCODK_F10 (F10) + TCODK_F11 (F11) + TCODK_F12 (F12) + TCODK_NUMLOCK (Numlock) + TCODK_SCROLLLOCK (Scrolllock) + TCODK_SPACE (Space) + + numeric keys : + + TCODK_0 (Zero) + TCODK_1 (One) + TCODK_2 (Two) + TCODK_3 (Three) + TCODK_4 (Four) + TCODK_5 (Five) + TCODK_6 (Six) + TCODK_7 (Seven) + TCODK_8 (Eight) + TCODK_9 (Nine) + TCODK_KP0 (KeypadZero) + TCODK_KP1 (KeypadOne) + TCODK_KP2 (KeypadTwo) + TCODK_KP3 (KeypadThree) + TCODK_KP4 (KeypadFour) + TCODK_KP5 (KeypadFive) + TCODK_KP6 (KeypadSix) + TCODK_KP7 (KeypadSeven) + TCODK_KP8 (KeypadEight) + TCODK_KP9 (KeypadNine) + + Any other (printable) key : + + TCODK_CHAR (Char) + + Codes starting with TCODK_KP represents keys on the numeric keypad (if available). + */ + + /** + @PageName console_offscreen + @PageFather console + @PageTitle Using off-screen consoles + @PageDesc The offscreen consoles allow you to draw on secondary consoles as you would do with the root console. You can then blit those secondary consoles on the root console. This allows you to use local coordinate space while rendering a portion of the final screen, and easily move components of the screen without modifying the rendering functions. + @FuncTitle Creating an offscreen console + @FuncDesc You can create as many off-screen consoles as you want by using this function. You can draw on them as you would do with the root console, but you cannot flush them to the screen. Else, you can blit them on other consoles, including the root console. See blit. The C version of this function returns a console handler that you can use in most console drawing functions. + @Cpp TCODConsole::TCODConsole(int w, int h) + @C TCOD_console_t TCOD_console_new(int w, int h) + @Py console_new(w,h) + @C# TCODConsole::TCODConsole(int w, int h) + @Lua tcod.Console(w,h) + @Param w,h the console size. + 0 < w + 0 < h + @CppEx + // Creating a 40x20 offscreen console, filling it with red and blitting it on the root console at position 5,5 + TCODConsole *offscreenConsole = new TCODConsole(40,20); + offscreenConsole->setDefaultBackground(TCODColor::red); + offscreenConsole->clear(); + TCODConsole::blit(offscreenConsole,0,0,40,20,TCODConsole::root,5,5,255); + @CEx + TCOD_console_t offscreen_console = TCOD_console_new(40,20); + TCOD_console_set_default_background(offscreen_console,TCOD_red); + TCOD_console_clear(offscreen_console); + TCOD_console_blit(offscreen_console,0,0,40,20,NULL,5,5,255); + @PyEx + offscreen_console = libtcod.console_new(40,20) + libtcod.console_set_background_color(offscreen_console,libtcod.red) + libtcod.console_clear(offscreen_console) + libtcod.console_blit(offscreen_console,0,0,40,20,0,5,5,255) + @LuaEx + -- Creating a 40x20 offscreen console, filling it with red and blitting it on the root console at position 5,5 + offscreenConsole = tcod.Console(40,20) + offscreenConsole:setBackgroundColor(tcod.color.red) + offscreenConsole:clear() + tcod.console.blit(offscreenConsole,0,0,40,20,libtcod.TCODConsole_root,5,5,255) + */ + TCODConsole(int w, int h); + + /** + @PageName console_offscreen + @FuncTitle Creating an offscreen console from a .asc or .apf file + @FuncDesc You can create an offscreen console from a file created with Ascii Paint with this constructor + @Cpp TCODConsole::TCODConsole(const char *filename) + @C TCOD_console_t TCOD_console_from_file(const char *filename) + @Param filename path to the .asc or .apf file created with Ascii Paint + @CppEx + // Creating an offscreen console, filling it with data from the .asc file + TCODConsole *offscreenConsole = new TCODConsole("myfile.asc"); + @CEx + TCOD_console_t offscreen_console = TCOD_console_from_file("myfile.apf"); + */ + TCODConsole(const char *filename); + + /** + @PageName console_offscreen + @FuncTitle Loading an offscreen console from a .asc file + @FuncDesc You can load data from a file created with Ascii Paint with this function. When needed, the console will be resized to fit the file size. The function returns false if it couldn't read the file. + @Cpp bool TCODConsole::loadAsc(const char *filename) + @C bool TCOD_console_load_asc(TCOD_console_t con, const char *filename) + @Param con in the C and Python versions, the offscreen console handler + @Param filename path to the .asc file created with Ascii Paint + @CppEx + // Creating a 40x20 offscreen console + TCODConsole *offscreenConsole = new TCODConsole(40,20); + // possibly resizing it and filling it with data from the .asc file + offscreenConsole->loadAsc("myfile.asc"); + @CEx + TCOD_console_t offscreen_console = TCOD_console_new(40,20); + TCOD_console_load_asc(offscreen_console,"myfile.asc"); + */ + bool loadAsc(const char *filename); + /** + @PageName console_offscreen + @FuncTitle Loading an offscreen console from a .apf file + @FuncDesc You can load data from a file created with Ascii Paint with this function. When needed, the console will be resized to fit the file size. The function returns false if it couldn't read the file. + @Cpp bool TCODConsole::loadApf(const char *filename) + @C bool TCOD_console_load_apf(TCOD_console_t con, const char *filename) + @Param con in the C and Python versions, the offscreen console handler + + @Param filename path to the .apf file created with Ascii Paint + + @CppEx + // Creating a 40x20 offscreen console + TCODConsole *offscreenConsole = new TCODConsole(40,20); + // possibly resizing it and filling it with data from the .apf file + offscreenConsole->loadApf("myfile.apf"); + @CEx + TCOD_console_t offscreen_console = TCOD_console_new(40,20); + TCOD_console_load_apf(offscreen_console,"myfile.asc"); + */ + bool loadApf(const char *filename); + + /** + @PageName console_offscreen + @FuncTitle Saving a console to a .asc file + @FuncDesc You can save data from a console to Ascii Paint format with this function. The function returns false if it couldn't write the file. This is the only ASC function that works also with the root console ! + @Cpp bool TCODConsole::saveAsc(const char *filename) const + @C bool TCOD_console_save_asc(TCOD_console_t con, const char *filename) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param filename path to the .asc file to be created + @CppEx + console->saveAsc("myfile.asc"); + @CEx + TCOD_console_save_asc(console,"myfile.asc"); + */ + bool saveAsc(const char *filename) const; + + /** + @PageName console_offscreen + @FuncTitle Saving a console to a .apf file + @FuncDesc You can save data from a console to Ascii Paint format with this function. The function returns false if it couldn't write the file. This is the only ASC function that works also with the root console ! + @Cpp bool TCODConsole::saveApf(const char *filename) const + @C bool TCOD_console_save_apf(TCOD_console_t con, const char *filename) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param filename path to the .apf file to be created + @CppEx + console->saveApf("myfile.apf"); + @CEx + TCOD_console_save_apf(console,"myfile.apf"); + */ + bool saveApf(const char *filename) const; + + /** + @PageName console_offscreen + @FuncTitle Blitting a console on another one + @FuncDesc This function allows you to blit a rectangular area of the source console at a specific position on a destination console. It can also simulate alpha transparency with the fade parameter. + @Cpp static void blit(const TCODConsole *src,int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole *dst, int xDst, int yDst, float foregroundAlpha=1.0f, float backgroundAlpha=1.0f) + @C void TCOD_console_blit(TCOD_console_t src,int xSrc, int ySrc, int wSrc, int hSrc, TCOD_console_t dst, int xDst, int yDst, float foreground_alpha, float background_alpha) + @Py console_blit(src,xSrc,ySrc,xSrc,hSrc,dst,xDst,yDst,foregroundAlpha=1.0,backgroundAlpha=1.0) + @C# + static void TCODConsole::blit(TCODConsole src, int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole dst, int xDst, int yDst) + static void TCODConsole::blit(TCODConsole src, int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole dst, int xDst, int yDst, float foreground_alpha) + static void TCODConsole::blit(TCODConsole src, int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole dst, int xDst, int yDst, float foreground_alpha, float background_alpha) + @Lua + tcod.console.blit(src, xSrc, ySrc, wSrc, hSrc, dst, xDst, yDst) + tcod.console.blit(src, xSrc, ySrc, wSrc, hSrc, dst, xDst, yDst, foreground_alpha) + tcod.console.blit(src, xSrc, ySrc, wSrc, hSrc, dst, xDst, yDst, foreground_alpha, background_alpha) + @Param src The source console that must be blitted on another one. + @Param xSrc,ySrc,wSrc,hSrc The rectangular area of the source console that will be blitted. If wSrc and/or hSrc == 0, the source console width/height are used + @Param dst The destination console. + @Param xDst,yDst Where to blit the upper-left corner of the source area in the destination console. + @Param foregroundAlpha,backgroundAlpha Alpha transparency of the blitted console. + 0.0 => The source console is completely transparent. This function does nothing. + 1.0 => The source console is opaque. Its cells replace the destination cells. + 0 < fade < 1.0 => The source console is partially blitted, simulating real transparency. + @CppEx + // Cross-fading between two offscreen consoles. We use two offscreen consoles with the same size as the root console. We render a different screen on each offscreen console. When the user hits a key, we do a cross-fading from the first screen to the second screen. + TCODConsole *off1 = new TCODConsole(80,50); + TCODConsole *off2 = new TCODConsole(80,50); + ... print screen1 on off1 + ... print screen2 of off2 + // render screen1 in the game window + TCODConsole::blit(off1,0,0,80,50,TCODConsole::root,0,0); + TCODConsole::flush(); + // wait or a keypress + TCODConsole::waitForKeypress(true); + // do a cross-fading from off1 to off2 + for (int i=1; i <= 255; i++) { + TCODConsole::blit(off1,0,0,80,50,TCODConsole::root,0,0); // renders the first screen (opaque) + TCODConsole::blit(off2,0,0,80,50,TCODConsole::root,0,0,i/255.0,i/255.0); // renders the second screen (transparent) + TCODConsole::flush(); + } + @CEx + TCOD_console_t off1 = TCOD_console_new(80,50); + TCOD_console_t off2 = TCOD_console_new(80,50); + int i; + ... print screen1 on off1 + ... print screen2 of off2 + // render screen1 in the game window + TCOD_console_blit(off1,0,0,80,50,NULL,0,0,1.0,1.0); + TCOD_console_flush(); + // wait or a keypress + TCOD_console_wait_for_keypress(true); + // do a cross-fading from off1 to off2 + for (i=1; i <= 255; i++) { + TCOD_console_blit(off1,0,0,80,50,NULL,0,0,1.0,1.0); // renders the first screen (opaque) + TCOD_console_blit(off2,0,0,80,50,NULL,0,0,i/255.0,i/255.0); // renders the second screen (transparent) + TCOD_console_flush(); + } + @PyEx + off1 = libtcod.console_new(80,50) + off2 = libtcod.console_new(80,50) + ... print screen1 on off1 + ... print screen2 of off2 + # render screen1 in the game window + libtcod.console_blit(off1,0,0,80,50,0,0,0) + libtcod.console_flush() + # wait or a keypress + libtcod.console_wait_for_keypress(True) + # do a cross-fading from off1 to off2 + for i in range(1,256) : + litbcod.console_blit(off1,0,0,80,50,0,0,0) # renders the first screen (opaque) + litbcod.console_blit(off2,0,0,80,50,0,0,0,i/255.0,i/255.0) # renders the second screen (transparent) + litbcod.console_flush() + @LuaEx + -- Cross-fading between two offscreen consoles. We use two offscreen consoles with the same size as the root console. We render a different screen on each offscreen console. When the user hits a key, we do a cross-fading from the first screen to the second screen. + off1 = tcod.Console(80,50) + off2 = tcod.Console(80,50) + ... print screen1 on off1 + ... print screen2 of off2 + -- render screen1 in the game window + root=libtcod.TCODConsole_root + tcod.console.blit(off1,0,0,80,50,root,0,0) + tcod.console.flush() + -- wait or a keypress + tcod.console.waitForKeypress(true) + -- do a cross-fading from off1 to off2 + for i=1,255,1 do + tcod.console.blit(off1,0,0,80,50,root,0,0) -- renders the first screen (opaque) + tcod.console.blit(off2,0,0,80,50,root,0,0,i/255,i/255) -- renders the second screen (transparent) + tcod.console.flush() + end + */ + static void blit(const TCODConsole *src,int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole *dst, int xDst, int yDst, float foreground_alpha=1.0f, float background_alpha=1.0f); + /** + @PageName console_offscreen + @FuncTitle Define a blit-transparent color + @FuncDesc This function defines a transparent background color for an offscreen console. All cells with this background color are ignored by the blit operation. You can use it to blit only some parts of the console. + @Cpp void TCODConsole::setKeyColor(const TCODColor &col) + @C void TCOD_console_set_key_color(TCOD_console_t con,TCOD_color_t col) + @Py console_set_key_color(con,col) + @C# void TCODConsole::setKeyColor(TCODColor col) + @Lua Console:setKeyColor(col) + @Param con in the C and Python versions, the offscreen console handler or NULL for the root console + @Param col the transparent background color + */ + void setKeyColor(const TCODColor &col); + /** + @PageName console_offscreen + @FuncTitle Destroying an offscreen console + @FuncDesc Use this function to destroy an offscreen console and release any resources allocated. Don't use it on the root console. + @Cpp TCODConsole::~TCODConsole() + @C void TCOD_console_delete(TCOD_console_t con) + @Py console_delete(con) + @C# void TCODConsole::Dispose() + @Lua through garbage collector + @Param con in the C and Python versions, the offscreen console handler + @CppEx + TCODConsole *off1 = new TCODConsole(80,50); + ... use off1 + delete off1; // destroy the offscreen console + @CEx + TCOD_console_t off1 = TCOD_console_new(80,50); + ... use off1 + TCOD_console_delete(off1); // destroy the offscreen console + @PyEx + off1 = libtcod.console_new(80,50) + ... use off1 + libtcod.console_delete(off1) # destroy the offscreen console + @LuaEx + off1 = tcod.Console(80,50) + ... use off1 + off1=nil -- release the reference + */ + virtual ~TCODConsole(); + + void setDirty(int x, int y, int w, int h); + + + TCODConsole(TCOD_console_t con) : data(con) {} + + // ctrl = TCOD_COLCTRL_1...TCOD_COLCTRL_5 or TCOD_COLCTRL_STOP + static const char *getColorControlString( TCOD_colctrl_t ctrl ); + // ctrl = TCOD_COLCTRL_FORE_RGB or TCOD_COLCTRL_BACK_RGB + static const char *getRGBColorControlString( TCOD_colctrl_t ctrl, const TCODColor & col ); + +protected : + friend class TCODLIB_API TCODImage; + friend class TCODLIB_API TCODZip; + friend class TCODLIB_API TCODText; + TCODConsole(); + TCOD_console_t data; +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/console_types.h b/tcod/tcod_sys/libtcod/include/console_types.h new file mode 100644 index 00000000..68fa86c4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/console_types.h @@ -0,0 +1,261 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_CONSOLE_TYPES_H +#define _TCOD_CONSOLE_TYPES_H + +typedef enum { + TCODK_NONE, + TCODK_ESCAPE, + TCODK_BACKSPACE, + TCODK_TAB, + TCODK_ENTER, + TCODK_SHIFT, + TCODK_CONTROL, + TCODK_ALT, + TCODK_PAUSE, + TCODK_CAPSLOCK, + TCODK_PAGEUP, + TCODK_PAGEDOWN, + TCODK_END, + TCODK_HOME, + TCODK_UP, + TCODK_LEFT, + TCODK_RIGHT, + TCODK_DOWN, + TCODK_PRINTSCREEN, + TCODK_INSERT, + TCODK_DELETE, + TCODK_LWIN, + TCODK_RWIN, + TCODK_APPS, + TCODK_0, + TCODK_1, + TCODK_2, + TCODK_3, + TCODK_4, + TCODK_5, + TCODK_6, + TCODK_7, + TCODK_8, + TCODK_9, + TCODK_KP0, + TCODK_KP1, + TCODK_KP2, + TCODK_KP3, + TCODK_KP4, + TCODK_KP5, + TCODK_KP6, + TCODK_KP7, + TCODK_KP8, + TCODK_KP9, + TCODK_KPADD, + TCODK_KPSUB, + TCODK_KPDIV, + TCODK_KPMUL, + TCODK_KPDEC, + TCODK_KPENTER, + TCODK_F1, + TCODK_F2, + TCODK_F3, + TCODK_F4, + TCODK_F5, + TCODK_F6, + TCODK_F7, + TCODK_F8, + TCODK_F9, + TCODK_F10, + TCODK_F11, + TCODK_F12, + TCODK_NUMLOCK, + TCODK_SCROLLLOCK, + TCODK_SPACE, + TCODK_CHAR +} TCOD_keycode_t; + +/* key data : special code or character */ +typedef struct { + TCOD_keycode_t vk; /* key code */ + char c; /* character if vk == TCODK_CHAR else 0 */ + bool pressed ; /* does this correspond to a key press or key release event ? */ + bool lalt ; + bool lctrl ; + bool ralt ; + bool rctrl ; + bool shift ; +} TCOD_key_t; + +typedef enum { + /* single walls */ + TCOD_CHAR_HLINE=196, + TCOD_CHAR_VLINE=179, + TCOD_CHAR_NE=191, + TCOD_CHAR_NW=218, + TCOD_CHAR_SE=217, + TCOD_CHAR_SW=192, + TCOD_CHAR_TEEW=180, + TCOD_CHAR_TEEE=195, + TCOD_CHAR_TEEN=193, + TCOD_CHAR_TEES=194, + TCOD_CHAR_CROSS=197, + /* double walls */ + TCOD_CHAR_DHLINE=205, + TCOD_CHAR_DVLINE=186, + TCOD_CHAR_DNE=187, + TCOD_CHAR_DNW=201, + TCOD_CHAR_DSE=188, + TCOD_CHAR_DSW=200, + TCOD_CHAR_DTEEW=185, + TCOD_CHAR_DTEEE=204, + TCOD_CHAR_DTEEN=202, + TCOD_CHAR_DTEES=203, + TCOD_CHAR_DCROSS=206, + /* blocks */ + TCOD_CHAR_BLOCK1=176, + TCOD_CHAR_BLOCK2=177, + TCOD_CHAR_BLOCK3=178, + /* arrows */ + TCOD_CHAR_ARROW_N=24, + TCOD_CHAR_ARROW_S=25, + TCOD_CHAR_ARROW_E=26, + TCOD_CHAR_ARROW_W=27, + /* arrows without tail */ + TCOD_CHAR_ARROW2_N=30, + TCOD_CHAR_ARROW2_S=31, + TCOD_CHAR_ARROW2_E=16, + TCOD_CHAR_ARROW2_W=17, + /* double arrows */ + TCOD_CHAR_DARROW_H=29, + TCOD_CHAR_DARROW_V=18, + /* GUI stuff */ + TCOD_CHAR_CHECKBOX_UNSET=224, + TCOD_CHAR_CHECKBOX_SET=225, + TCOD_CHAR_RADIO_UNSET=9, + TCOD_CHAR_RADIO_SET=10, + /* sub-pixel resolution kit */ + TCOD_CHAR_SUBP_NW=226, + TCOD_CHAR_SUBP_NE=227, + TCOD_CHAR_SUBP_N=228, + TCOD_CHAR_SUBP_SE=229, + TCOD_CHAR_SUBP_DIAG=230, + TCOD_CHAR_SUBP_E=231, + TCOD_CHAR_SUBP_SW=232, + /* miscellaneous */ + TCOD_CHAR_SMILIE = 1, + TCOD_CHAR_SMILIE_INV = 2, + TCOD_CHAR_HEART = 3, + TCOD_CHAR_DIAMOND = 4, + TCOD_CHAR_CLUB = 5, + TCOD_CHAR_SPADE = 6, + TCOD_CHAR_BULLET = 7, + TCOD_CHAR_BULLET_INV = 8, + TCOD_CHAR_MALE = 11, + TCOD_CHAR_FEMALE = 12, + TCOD_CHAR_NOTE = 13, + TCOD_CHAR_NOTE_DOUBLE = 14, + TCOD_CHAR_LIGHT = 15, + TCOD_CHAR_EXCLAM_DOUBLE = 19, + TCOD_CHAR_PILCROW = 20, + TCOD_CHAR_SECTION = 21, + TCOD_CHAR_POUND = 156, + TCOD_CHAR_MULTIPLICATION = 158, + TCOD_CHAR_FUNCTION = 159, + TCOD_CHAR_RESERVED = 169, + TCOD_CHAR_HALF = 171, + TCOD_CHAR_ONE_QUARTER = 172, + TCOD_CHAR_COPYRIGHT = 184, + TCOD_CHAR_CENT = 189, + TCOD_CHAR_YEN = 190, + TCOD_CHAR_CURRENCY = 207, + TCOD_CHAR_THREE_QUARTERS = 243, + TCOD_CHAR_DIVISION = 246, + TCOD_CHAR_GRADE = 248, + TCOD_CHAR_UMLAUT = 249, + TCOD_CHAR_POW1 = 251, + TCOD_CHAR_POW3 = 252, + TCOD_CHAR_POW2 = 253, + TCOD_CHAR_BULLET_SQUARE = 254, + /* diacritics */ +} TCOD_chars_t; + +typedef enum { + TCOD_COLCTRL_1 = 1, + TCOD_COLCTRL_2, + TCOD_COLCTRL_3, + TCOD_COLCTRL_4, + TCOD_COLCTRL_5, + TCOD_COLCTRL_NUMBER=5, + TCOD_COLCTRL_FORE_RGB, + TCOD_COLCTRL_BACK_RGB, + TCOD_COLCTRL_STOP +} TCOD_colctrl_t; + +typedef enum { + TCOD_BKGND_NONE, + TCOD_BKGND_SET, + TCOD_BKGND_MULTIPLY, + TCOD_BKGND_LIGHTEN, + TCOD_BKGND_DARKEN, + TCOD_BKGND_SCREEN, + TCOD_BKGND_COLOR_DODGE, + TCOD_BKGND_COLOR_BURN, + TCOD_BKGND_ADD, + TCOD_BKGND_ADDA, + TCOD_BKGND_BURN, + TCOD_BKGND_OVERLAY, + TCOD_BKGND_ALPH, + TCOD_BKGND_DEFAULT +} TCOD_bkgnd_flag_t; + +typedef enum { + TCOD_KEY_PRESSED=1, + TCOD_KEY_RELEASED=2, +} TCOD_key_status_t; + +/* custom font flags */ +typedef enum { + TCOD_FONT_LAYOUT_ASCII_INCOL=1, + TCOD_FONT_LAYOUT_ASCII_INROW=2, + TCOD_FONT_TYPE_GREYSCALE=4, + TCOD_FONT_TYPE_GRAYSCALE=4, + TCOD_FONT_LAYOUT_TCOD=8, +} TCOD_font_flags_t; + +typedef enum { + TCOD_RENDERER_GLSL, + TCOD_RENDERER_OPENGL, + TCOD_RENDERER_SDL, + TCOD_NB_RENDERERS, +} TCOD_renderer_t; + +typedef enum { + TCOD_LEFT, + TCOD_RIGHT, + TCOD_CENTER +} TCOD_alignment_t; + +#endif /* _TCOD_CONSOLE_TYPES_H */ diff --git a/tcod/tcod_sys/libtcod/include/fov.h b/tcod/tcod_sys/libtcod/include/fov.h new file mode 100644 index 00000000..b3a0837b --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/fov.h @@ -0,0 +1,58 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_FOV_H +#define _TCOD_FOV_H + +typedef void *TCOD_map_t; + +#include "fov_types.h" + +/* allocate a new map */ +TCODLIB_API TCOD_map_t TCOD_map_new(int width, int height); +/* set all cells as solid rock (cannot see through nor walk) */ +TCODLIB_API void TCOD_map_clear(TCOD_map_t map, bool transparent, bool walkable); +/* copy a map to another, reallocating it when needed */ +TCODLIB_API void TCOD_map_copy(TCOD_map_t source, TCOD_map_t dest); +/* change a cell properties */ +TCODLIB_API void TCOD_map_set_properties(TCOD_map_t map, int x, int y, bool is_transparent, bool is_walkable); +/* destroy a map */ +TCODLIB_API void TCOD_map_delete(TCOD_map_t map); + +/* calculate the field of view (potentially visible cells from player_x,player_y) */ +TCODLIB_API void TCOD_map_compute_fov(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls, TCOD_fov_algorithm_t algo); +/* check if a cell is in the last computed field of view */ +TCODLIB_API bool TCOD_map_is_in_fov(TCOD_map_t map, int x, int y); +TCODLIB_API void TCOD_map_set_in_fov(TCOD_map_t map, int x, int y, bool fov); + +/* retrieve properties from the map */ +TCODLIB_API bool TCOD_map_is_transparent(TCOD_map_t map, int x, int y); +TCODLIB_API bool TCOD_map_is_walkable(TCOD_map_t map, int x, int y); +TCODLIB_API int TCOD_map_get_width(TCOD_map_t map); +TCODLIB_API int TCOD_map_get_height(TCOD_map_t map); +TCODLIB_API int TCOD_map_get_nb_cells(TCOD_map_t map); +#endif diff --git a/tcod/tcod_sys/libtcod/include/fov.hpp b/tcod/tcod_sys/libtcod/include/fov.hpp new file mode 100644 index 00000000..fc730905 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/fov.hpp @@ -0,0 +1,257 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_FOV_HPP +#define _TCOD_FOV_HPP + +#include "fov_types.h" + +class TCODPath; + +/** + @PageName fov + @PageCategory Roguelike toolkits + @PageTitle Field of view + @PageDesc This toolkit allows to easily calculate the potential visible set of map cells from the player position. +A cell is potentially visible if the line of sight from the player to the cell in unobstructed. + */ + +class TCODLIB_API TCODMap { + public : + /** + @PageName fov_init + @PageFather fov + @PageTitle Building the map + @FuncTitle Creating the map object + @FuncDesc First, you have to allocate a map of the same size as your dungeon. + @Cpp TCODMap::TCODMap (int width, int height) + @C TCOD_map_t TCOD_map_new (int width, int height) + @Py map_new (width, height) + @C# TCODMap::TCODMap(int width, int height) + @Param width, height The size of the map (in map cells). + */ + TCODMap(int width, int height); + + /** + @PageName fov_init + @PageFather fov + @FuncTitle Defining the cell properties + @FuncDesc Then, build your dungeon by defining which cells let the light pass (by default, all cells block the light) and which cells are walkable (by default, all cells are not-walkable). + @Cpp void TCODMap::setProperties (int x, int y, bool isTransparent, bool isWalkable) + @C void TCOD_map_set_properties (TCOD_map_t map, int x, int y, bool is_transparent, bool is_walkable) + @Py map_set_properties (map, x, y, is_transparent, is_walkable) + @C# void TCODMap::setProperties (int x, int y, bool isTransparent, bool isWalkable) + @Param map In the C version, the map handler returned by the TCOD_map_new function. + @Param x, y Coordinate of the cell that we want to update. + @Param isTransparent If true, this cell will let the light pass else it will block the light. + @Param isWalkable If true, creatures can walk true this cell (it is not a wall). + */ + void setProperties(int x,int y, bool isTransparent, bool isWalkable); + + /** + @PageName fov_init + @PageFather fov + @FuncTitle Clearing the map + @FuncDesc You can clear an existing map (setting all cells to the chosen walkable/transparent values) with: + @Cpp void TCODMap::clear (bool transparent = false, bool walkable = false) + @C void TCOD_map_clear (TCOD_map_t map, bool transparent, bool walkable) + @Py map_clear (map, transparent = False, walkable = False) + @C# + void TCODMap::clear() + void TCODMap::clear(bool transparent) + void TCODMap::clear(bool transparent, bool walkable) + @Param map In the C version, the map handler returned by the TCOD_map_new function. + @Param walkable Whether the cells should be walkable. + @Param transparent Whether the cells should be transparent. + */ + void clear(bool transparent=false, bool walkable=false); + + /** + @PageName fov_init + @PageFather fov + @FuncTitle Copying a map + @FuncDesc You can copy an existing map into another. You have to allocate the destination map first. + @Cpp void TCODMap::copy (const TCODMap * source) + @C void TCOD_map_copy (TCOD_map_t source, TCOD_map_t dest) + @Py map_copy (source, dest) + @C# void TCODMap::copy (TCODMap source) + @Param source The map containing the source data. + @Param dest In C and python version, the map where data is copied. + @CppEx + TCODMap * map = new TCODMap(50,50); // allocate the map + map->setProperties(10,10,true,true); // set a cell as 'empty' + TCODMap * map2 = new TCODMap(10,10); // allocate another map + map2->copy(map); // copy map data into map2, reallocating it to 50x50 + @CEx + TCOD_map_t map = TCOD_map_new(50,50); + TCOD_map_t map2 = TCOD_map_new(10,10); + TCOD_map_set_properties(map,10,10,true,true); + TCOD_map_copy(map,map2); + @PyEx + map = libtcod.map_new(50,50) + map2 = libtcod.map_new(10,10) + libtcod.map_set_properties(map,10,10,True,True) + libtcod.map_copy(map,map2) + */ + void copy (const TCODMap *source); + + /** + @PageName fov_compute + @PageTitle Computing the field of view + @PageFather fov + @FuncDesc Once your map is allocated and empty cells have been defined, you can calculate the field of view with : +
    typedef enum { FOV_BASIC, 
    +               FOV_DIAMOND, 
    +               FOV_SHADOW, 
    +               FOV_PERMISSIVE_0,FOV_PERMISSIVE_1,FOV_PERMISSIVE_2,FOV_PERMISSIVE_3,
    +               FOV_PERMISSIVE_4,FOV_PERMISSIVE_5,FOV_PERMISSIVE_6,FOV_PERMISSIVE_7,FOV_PERMISSIVE_8, 
    +               FOV_RESTRICTIVE,
    +               NB_FOV_ALGORITHMS } TCOD_fov_algorithm_t;
    +            
    + * FOV_BASIC : classic libtcod fov algorithm (ray casted from the player to all the cells on the submap perimeter) + * FOV_DIAMOND : based on this algorithm + * FOV_SHADOW : based on this algorithm + * FOV_PERMISSIVE_x : based on this algorithm + Permissive has a variable permissiveness parameter. You can either use the constants FOV_PERMISSIVE_x, x between 0 (the less permissive) and 8 (the more permissive), or using the macro FOV_PERMISSIVE(x). + * FOV_RESTRICTIVE : Mingos' Restrictive Precise Angle Shadowcasting (MRPAS). Original implementation here. Comparison of the algorithms : + Check this. + @Cpp void TCODMap::computeFov(int playerX,int playerY, int maxRadius=0,bool light_walls = true, TCOD_fov_algorithm_t algo = FOV_BASIC) + @C void TCOD_map_compute_fov(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls, TCOD_fov_algorithm_t algo) + @Py map_compute_fov(map, player_x, player_y, max_radius=0, light_walls=True, algo=FOV_BASIC ) + @C# + void TCODMap::computeFov(int playerX, int playerY) + void TCODMap::computeFov(int playerX, int playerY, int maxRadius) + void TCODMap::computeFov(int playerX, int playerY, int maxRadius,bool light_walls) + void TCODMap::computeFov(int playerX, int playerY, int maxRadius,bool light_walls, TCODFOVTypes algo) + @Param map In the C version, the map handler returned by the TCOD_map_new function. + @Param player_x,player_y Position of the player in the map. + 0 <= player_x < map width. + 0 <= player_y < map height. + @Param maxRadius If > 0, the fov is only computed up to maxRadius cells away from the player. Else, the range is unlimited. + @Param light_walls Wether the wall cells near ground cells in fov must be in fov too. + @Param algo FOV algorithm to use. + @CppEx + TCODMap *map = new TCODMap(50,50); // allocate the map + map->setProperties(10,10,true,true); // set a cell as 'empty' + map->computeFov(10,10); // calculate fov from the cell 10x10 (basic raycasting, unlimited range, walls lighting on) + @CEx + TCOD_map_t map = TCOD_map_new(50,50); + TCOD_map_set_properties(map,10,10,true,true); + TCOD_map_compute_fov(map,10,10,0,true,FOV_SHADOW); // using shadow casting + @PyEx + map = libtcod.map_new(50,50) + libtcod.map_set_properties(map,10,10,True,True) + libtcod.map_compute_fov(map,10,10,0,True,libtcod.FOV_PERMISSIVE(2)) + */ + void computeFov(int playerX,int playerY, int maxRadius = 0,bool light_walls = true, TCOD_fov_algorithm_t algo = FOV_BASIC); + + /** + @PageName fov_get + @PageFather fov + @PageTitle Reading fov information + @FuncTitle Checking if a cell is in fov + @FuncDesc Once your computed the field of view, you can know if a cell is visible with : + @Cpp bool TCODMap::isInFov(int x, int y) const + @C bool TCOD_map_is_in_fov(TCOD_map_t map, int x, int y) + @Py map_is_in_fov(map, x, y) + @C# bool TCODMap::isInFov(int x, int y) + @Param map In the C version, the map handler returned by the TCOD_map_new function. + @Param x,y Coordinates of the cell we want to check. + 0 <= x < map width. + 0 <= y < map height. + @CppEx + TCODMap *map = new TCODMap(50,50); // allocate the map + map->setProperties(10,10,true,true); // set a cell as 'empty' + map->computeFov(10,10); // calculate fov from the cell 10x10 + bool visible=map->isInFov(10,10); // is the cell 10x10 visible ? + @CEx + TCOD_map_t map = TCOD_map_new(50,50); + TCOD_map_set_properties(map,10,10,true,true); + TCOD_map_compute_fov(map,10,10); + bool visible = TCOD_map_is_in_fov(map,10,10); + @PyEx + map = libtcod.map_new(50,50) + libtcod.map_set_properties(map,10,10,True,True) + libtcod.map_compute_fov(map,10,10) + visible = libtcod.map_is_in_fov(map,10,10) + */ + bool isInFov(int x,int y) const; + /** + @PageName fov_get + @FuncTitle Checking a cell transparency/walkability + @FuncDesc You can also retrieve transparent/walkable informations with : + @Cpp + bool TCODMap::isTransparent(int x, int y) const + bool TCODMap::isWalkable(int x, int y) const + @C + bool TCOD_map_is_transparent(TCOD_map_t map, int x, int y) + bool TCOD_map_is_walkable(TCOD_map_t map, int x, int y) + @Py + map_is_transparent(map, x, y) + map_is_walkable(map, x, y) + @C# + bool TCODMap::isTransparent(int x, int y) + bool TCODMap::isWalkable(int x, int y) + @Param map In the C version, the map handler returned by the TCOD_map_new function. + @Param x,y Coordinates of the cell we want to check. + 0 <= x < map width. + 0 <= y < map height. + */ + bool isTransparent(int x, int y) const; + bool isWalkable(int x, int y) const; + + /** + @PageName fov_get + @FuncTitle Getting the map size + @FuncDesc You can retrieve the map size with : + @Cpp + int TCODMap::getWidth() const + int TCODMap::getHeight() const + @C + int TCOD_map_get_width(TCOD_map_t map) + int TCOD_map_get_height(TCOD_map_t map) + @Py + map_get_width(map) + map_get_height(map) + @C# + int TCODMap::getWidth() + int TCODMap::getHeight() + @Param map In the C version, the map handler returned by the TCOD_map_new function. + */ + int getWidth() const; + int getHeight() const; + + virtual ~TCODMap(); + void setInFov(int x,int y, bool fov); + int getNbCells() const; + friend class TCODLIB_API TCODPath; + friend class TCODLIB_API TCODDijkstra; +// protected : + TCOD_map_t data; +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/fov_types.h b/tcod/tcod_sys/libtcod/include/fov_types.h new file mode 100644 index 00000000..f53c8d92 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/fov_types.h @@ -0,0 +1,54 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_FOV_TYPES_H +#define _TCOD_FOV_TYPES_H + +/* FOV_BASIC : http://roguebasin.roguelikedevelopment.org/index.php?title=Ray_casting + FOV_DIAMOND : http://www.geocities.com/temerra/los_rays.html + FOV_SHADOW : http://roguebasin.roguelikedevelopment.org/index.php?title=FOV_using_recursive_shadowcasting + FOV_PERMISSIVE : http://roguebasin.roguelikedevelopment.org/index.php?title=Precise_Permissive_Field_of_View + FOV_RESTRICTIVE : Mingos' Restrictive Precise Angle Shadowcasting (contribution by Mingos) */ + +typedef enum { + FOV_BASIC, + FOV_DIAMOND, + FOV_SHADOW, + FOV_PERMISSIVE_0, + FOV_PERMISSIVE_1, + FOV_PERMISSIVE_2, + FOV_PERMISSIVE_3, + FOV_PERMISSIVE_4, + FOV_PERMISSIVE_5, + FOV_PERMISSIVE_6, + FOV_PERMISSIVE_7, + FOV_PERMISSIVE_8, + FOV_RESTRICTIVE, + NB_FOV_ALGORITHMS } TCOD_fov_algorithm_t; +#define FOV_PERMISSIVE(x) ((TCOD_fov_algorithm_t)(FOV_PERMISSIVE_0 + (x))) + +#endif /* _TCOD_FOV_TYPES_H */ diff --git a/tcod/tcod_sys/libtcod/include/gui/button.hpp b/tcod/tcod_sys/libtcod/include/gui/button.hpp new file mode 100644 index 00000000..c2e78e5d --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/button.hpp @@ -0,0 +1,46 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API Button : public Widget { +public : + Button(const char *label, const char *tip, widget_callback_t cbk, void *userData=NULL); + Button(int x, int y, int width, int height, const char *label, const char *tip, widget_callback_t cbk, void *userData=NULL); + virtual ~Button(); + void render(); + void setLabel(const char *newLabel); + void computeSize(); + inline bool isPressed() { return pressed; } +protected : + bool pressed; + char *label; + widget_callback_t cbk; + + void onButtonPress(); + void onButtonRelease(); + void onButtonClick(); + void expand(int width, int height); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/container.hpp b/tcod/tcod_sys/libtcod/include/gui/container.hpp new file mode 100644 index 00000000..86636fd9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/container.hpp @@ -0,0 +1,40 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API Container : public Widget { +public : + Container(int x, int y, int w, int h) : Widget(x,y,w,h) {} + virtual ~Container(); + void addWidget(Widget *wid); + void removeWidget(Widget *wid); + void setVisible(bool val); + void render(); + void clear(); + void update(const TCOD_key_t k); +protected : + TCODList content; +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/flatlist.hpp b/tcod/tcod_sys/libtcod/include/gui/flatlist.hpp new file mode 100644 index 00000000..66f10056 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/flatlist.hpp @@ -0,0 +1,48 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API FlatList : public TextBox { +public : + FlatList(int x,int y,int w, const char **list, const char *label, const char *tip=NULL); + virtual ~FlatList(); + void render(); + void update(const TCOD_key_t k); + void setCallback(void (*cbk)(Widget *wid, const char * val, void *data), void *data) { this->cbk=cbk; this->data=data;} + void setValue(const char * value); + void setList(const char **list); +protected : + const char **value; + const char **list; + bool onLeftArrow; + bool onRightArrow; + void (*cbk)(Widget *wid, const char *val, void *data); + void *data; + + void valueToText(); + void textToValue(); + void onButtonClick(); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/gui.hpp b/tcod/tcod_sys/libtcod/include/gui/gui.hpp new file mode 100644 index 00000000..eb80bb50 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/gui.hpp @@ -0,0 +1,64 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _GUI_HPP +#define _GUI_HPP + +#include "libtcod.hpp" + +#ifdef TCOD_VISUAL_STUDIO +#pragma warning(disable:4996) +#pragma warning(disable:4251) +#endif + +// DLL export +#ifdef TCOD_WINDOWS +#ifdef LIBTCOD_GUI_EXPORTS +#define TCODLIB_GUI_API __declspec(dllexport) +#else +#define TCODLIB_GUI_API __declspec(dllimport) +#endif +#else +#define TCODLIB_GUI_API +#endif + +#include "widget.hpp" +#include "button.hpp" +#include "radiobutton.hpp" +#include "container.hpp" +#include "label.hpp" +#include "statusbar.hpp" +#include "textbox.hpp" +#include "flatlist.hpp" +#include "slider.hpp" +#include "togglebutton.hpp" +#include "toolbar.hpp" +#include "vbox.hpp" +#include "hbox.hpp" +#include "image.hpp" + +#endif + diff --git a/tcod/tcod_sys/libtcod/include/gui/hbox.hpp b/tcod/tcod_sys/libtcod/include/gui/hbox.hpp new file mode 100644 index 00000000..d40b1226 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/hbox.hpp @@ -0,0 +1,32 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API HBox : public VBox { +public : + HBox(int x, int y, int padding); + void computeSize(); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/image.hpp b/tcod/tcod_sys/libtcod/include/gui/image.hpp new file mode 100644 index 00000000..69b8930d --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/image.hpp @@ -0,0 +1,38 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API Image : public Widget { +public : + Image(int x,int y,int w, int h, const char *tip=NULL); + virtual ~Image(); + void setBackgroundColor(const TCODColor col); + void render(); +protected : + void expand(int width, int height); + + TCODColor back; +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/label.hpp b/tcod/tcod_sys/libtcod/include/gui/label.hpp new file mode 100644 index 00000000..d5153f4a --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/label.hpp @@ -0,0 +1,38 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API Label : public Widget { +public : + Label(int x, int y, const char *label, const char *tip=NULL ); + void render(); + void computeSize(); + void setValue(const char *label) { this->label=label; } +protected : + const char *label; + + void expand(int width, int height); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/radiobutton.hpp b/tcod/tcod_sys/libtcod/include/gui/radiobutton.hpp new file mode 100644 index 00000000..65359ef4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/radiobutton.hpp @@ -0,0 +1,47 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API RadioButton : public Button { +public : + RadioButton(const char *label, const char *tip, widget_callback_t cbk, void *userData=NULL) + : Button(label,tip,cbk,userData),group(defaultGroup) {} + RadioButton(int x, int y, int width, int height, const char *label, const char *tip, widget_callback_t cbk, void *userData=NULL) + : Button(x,y,width,height,label,tip,cbk,userData),group(defaultGroup) {} + + void setGroup(int group) { this->group=group; } + void render(); + void select(); + void unSelect(); + static void unSelectGroup(int group); + static void setDefaultGroup(int group) { defaultGroup=group; } +protected : + static int defaultGroup; + int group; + static RadioButton *groupSelect[512]; + + void onButtonClick(); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/slider.hpp b/tcod/tcod_sys/libtcod/include/gui/slider.hpp new file mode 100644 index 00000000..f9297580 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/slider.hpp @@ -0,0 +1,54 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API Slider : public TextBox { +public : + Slider(int x,int y,int w, float min, float max, const char *label, const char *tip=NULL); + virtual ~Slider(); + void render(); + void update(const TCOD_key_t k); + void setMinMax(float min, float max) { this->min=min;this->max=max; } + void setCallback(void (*cbk)(Widget *wid, float val, void *data), void *data) { this->cbk=cbk; this->data=data;} + void setFormat(const char *fmt); + void setValue(float value); + void setSensitivity(float sensitivity) { this->sensitivity=sensitivity;} +protected : + float min,max,value,sensitivity; + bool onArrows; + bool drag; + int dragx; + int dragy; + float dragValue; + char *fmt; + void (*cbk)(Widget *wid, float val, void *data); + void *data; + + void valueToText(); + void textToValue(); + void onButtonPress(); + void onButtonRelease(); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/statusbar.hpp b/tcod/tcod_sys/libtcod/include/gui/statusbar.hpp new file mode 100644 index 00000000..fd6d6fad --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/statusbar.hpp @@ -0,0 +1,32 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API StatusBar : public Widget { +public : + StatusBar(int x,int y,int w, int h):Widget(x,y,w,h) {} + void render(); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/textbox.hpp b/tcod/tcod_sys/libtcod/include/gui/textbox.hpp new file mode 100644 index 00000000..b35d361e --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/textbox.hpp @@ -0,0 +1,50 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API TextBox : public Widget { +public : + TextBox(int x,int y,int w, int maxw, const char *label, const char *value, const char *tip=NULL); + virtual ~TextBox(); + void render(); + void update(const TCOD_key_t k); + void setText(const char *txt); + const char *getValue() { return txt; } + void setCallback(void (*cbk)(Widget *wid, char * val, void * data), void *data) { txtcbk=cbk; this->data=data; } + static void setBlinkingDelay(float delay) { blinkingDelay=delay; } +protected : + static float blinkingDelay; + char *label; + char *txt; + float blink; + int pos, offset; + int boxx,boxw,maxw; + bool insert; + void (*txtcbk)(Widget *wid, char * val, void *data); + void *data; + + void onButtonClick(); +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/togglebutton.hpp b/tcod/tcod_sys/libtcod/include/gui/togglebutton.hpp new file mode 100644 index 00000000..f2bc57aa --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/togglebutton.hpp @@ -0,0 +1,40 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API ToggleButton : public Button { +public : + ToggleButton(const char *label, const char *tip, widget_callback_t cbk, void *userData=NULL) + :Button(label, tip, cbk, userData) {} + ToggleButton(int x, int y, int width, int height, const char *label, const char *tip, widget_callback_t cbk, void *userData=NULL) + :Button(x, y, width, height, label, tip, cbk, userData) {} + void render(); + bool isPressed() { return pressed; } + void setPressed(bool val) { pressed=val; } +protected : + void onButtonPress(); + void onButtonRelease(); + void onButtonClick(); +}; diff --git a/tcod/tcod_sys/libtcod/include/gui/toolbar.hpp b/tcod/tcod_sys/libtcod/include/gui/toolbar.hpp new file mode 100644 index 00000000..129e46af --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/toolbar.hpp @@ -0,0 +1,40 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API ToolBar : public Container { +public : + ToolBar(int x, int y, const char *name, const char *tip=NULL); + ToolBar(int x, int y, int w, const char *name, const char *tip=NULL); + ~ToolBar(); + void render(); + void setName(const char *name); + void addSeparator(const char *txt, const char *tip=NULL); + void computeSize(); +protected : + char *name; + int fixedWidth; +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/vbox.hpp b/tcod/tcod_sys/libtcod/include/gui/vbox.hpp new file mode 100644 index 00000000..68daf2d8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/vbox.hpp @@ -0,0 +1,34 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API VBox : public Container { +public : + VBox(int x, int y, int padding) : Container(x,y,0,0),padding(padding) {} + void computeSize(); +protected : + int padding; +}; + diff --git a/tcod/tcod_sys/libtcod/include/gui/widget.hpp b/tcod/tcod_sys/libtcod/include/gui/widget.hpp new file mode 100644 index 00000000..2fa96ad2 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/gui/widget.hpp @@ -0,0 +1,80 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +class TCODLIB_GUI_API Widget { +public : + int x,y,w,h; + void *userData; + static Widget *focus; + static Widget *keyboardFocus; + + Widget(); + Widget(int x, int y); + Widget(int x, int y, int w, int h); + virtual ~Widget(); + virtual void render() {} + virtual void update(const TCOD_key_t k); + void move(int x,int y); + void setTip(const char *tip); + virtual void setVisible(bool val) { visible=val; } + bool isVisible() { return visible; } + virtual void computeSize() {} + static void setBackgroundColor(const TCODColor col,const TCODColor colFocus); + static void setForegroundColor(const TCODColor col,const TCODColor colFocus); + static void setConsole(TCODConsole *con); + static void updateWidgets(const TCOD_key_t k,const TCOD_mouse_t mouse); + static void renderWidgets(); + static TCOD_mouse_t mouse; + static TCODColor fore; + virtual void expand(int width, int height) {} +protected : + friend class StatusBar; + friend class ToolBar; + friend class VBox; + friend class HBox; + + virtual void onMouseIn() {} + virtual void onMouseOut() {} + virtual void onButtonPress() {} + virtual void onButtonRelease() {} + virtual void onButtonClick() {} + + static void updateWidgetsIntern(const TCOD_key_t k); + + static float elapsed; + static TCODColor back; + static TCODColor backFocus; + static TCODColor foreFocus; + static TCODConsole *con; + static TCODList widgets; + char *tip; + bool mouseIn:1; + bool mouseL:1; + bool visible:1; +}; + +typedef void (*widget_callback_t) ( Widget *w, void *userData ); + diff --git a/tcod/tcod_sys/libtcod/include/heightmap.h b/tcod/tcod_sys/libtcod/include/heightmap.h new file mode 100644 index 00000000..219e46f1 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/heightmap.h @@ -0,0 +1,70 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _TCOD_HEIGHTMAP_H +#define _TCOD_HEIGHTMAP_H + +typedef struct { + int w,h; + float *values; +} TCOD_heightmap_t; + +TCODLIB_API TCOD_heightmap_t *TCOD_heightmap_new(int w,int h); +TCODLIB_API void TCOD_heightmap_delete(TCOD_heightmap_t *hm); + +TCODLIB_API float TCOD_heightmap_get_value(const TCOD_heightmap_t *hm, int x, int y); +TCODLIB_API float TCOD_heightmap_get_interpolated_value(const TCOD_heightmap_t *hm, float x, float y); +TCODLIB_API void TCOD_heightmap_set_value(TCOD_heightmap_t *hm, int x, int y, float value); +TCODLIB_API float TCOD_heightmap_get_slope(const TCOD_heightmap_t *hm, int x, int y); +TCODLIB_API void TCOD_heightmap_get_normal(const TCOD_heightmap_t *hm, float x, float y, float n[3], float waterLevel); +TCODLIB_API int TCOD_heightmap_count_cells(const TCOD_heightmap_t *hm, float min, float max); +TCODLIB_API bool TCOD_heightmap_has_land_on_border(const TCOD_heightmap_t *hm, float waterLevel); +TCODLIB_API void TCOD_heightmap_get_minmax(const TCOD_heightmap_t *hm, float *min, float *max); + +TCODLIB_API void TCOD_heightmap_copy(const TCOD_heightmap_t *hm_source,TCOD_heightmap_t *hm_dest); +TCODLIB_API void TCOD_heightmap_add(TCOD_heightmap_t *hm, float value); +TCODLIB_API void TCOD_heightmap_scale(TCOD_heightmap_t *hm, float value); +TCODLIB_API void TCOD_heightmap_clamp(TCOD_heightmap_t *hm, float min, float max); +TCODLIB_API void TCOD_heightmap_normalize(TCOD_heightmap_t *hm, float min, float max); +TCODLIB_API void TCOD_heightmap_clear(TCOD_heightmap_t *hm); +TCODLIB_API void TCOD_heightmap_lerp_hm(const TCOD_heightmap_t *hm1, const TCOD_heightmap_t *hm2, TCOD_heightmap_t *hmres, float coef); +TCODLIB_API void TCOD_heightmap_add_hm(const TCOD_heightmap_t *hm1, const TCOD_heightmap_t *hm2, TCOD_heightmap_t *hmres); +TCODLIB_API void TCOD_heightmap_multiply_hm(const TCOD_heightmap_t *hm1, const TCOD_heightmap_t *hm2, TCOD_heightmap_t *hmres); + +TCODLIB_API void TCOD_heightmap_add_hill(TCOD_heightmap_t *hm, float hx, float hy, float hradius, float hheight); +TCODLIB_API void TCOD_heightmap_dig_hill(TCOD_heightmap_t *hm, float hx, float hy, float hradius, float hheight); +TCODLIB_API void TCOD_heightmap_dig_bezier(TCOD_heightmap_t *hm, int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth); +TCODLIB_API void TCOD_heightmap_rain_erosion(TCOD_heightmap_t *hm, int nbDrops,float erosionCoef,float sedimentationCoef,TCOD_random_t rnd); +/* TCODLIB_API void TCOD_heightmap_heat_erosion(TCOD_heightmap_t *hm, int nbPass,float minSlope,float erosionCoef,float sedimentationCoef,TCOD_random_t rnd); */ +TCODLIB_API void TCOD_heightmap_kernel_transform(TCOD_heightmap_t *hm, int kernelsize, const int *dx, const int *dy, const float *weight, float minLevel,float maxLevel); +TCODLIB_API void TCOD_heightmap_add_voronoi(TCOD_heightmap_t *hm, int nbPoints, int nbCoef, const float *coef,TCOD_random_t rnd); +TCODLIB_API void TCOD_heightmap_mid_point_displacement(TCOD_heightmap_t *hm, TCOD_random_t rnd, float roughness); +TCODLIB_API void TCOD_heightmap_add_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale); +TCODLIB_API void TCOD_heightmap_scale_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale); +TCODLIB_API void TCOD_heightmap_islandify(TCOD_heightmap_t *hm, float seaLevel,TCOD_random_t rnd); + +#endif + diff --git a/tcod/tcod_sys/libtcod/include/heightmap.hpp b/tcod/tcod_sys/libtcod/include/heightmap.hpp new file mode 100644 index 00000000..83ddd6af --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/heightmap.hpp @@ -0,0 +1,500 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _TCOD_HEIGHTMAP_HPP +#define _TCOD_HEIGHTMAP_HPP + +/** + @PageName heightmap + @PageCategory Roguelike toolkits + @PageTitle Heightmap toolkit + @PageDesc This toolkit allows to create a 2D grid of float values using various algorithms. + +The code using the heightmap toolkit can be automatically generated with the heightmap tool (hmtool) included in the libtcod package. + */ +class TCODLIB_API TCODHeightMap { +public : + int w,h; + float *values; + + /** + @PageName heightmap_init + @PageFather heightmap + @PageTitle Creating a heightmap + @FuncTitle Creating an empty map + @FuncDesc As with other modules, you have to create a heightmap object first : + Note that whereas most other modules use opaque structs, the TCOD_heightmap_t fields can be freely accessed. Thus, the TCOD_heightmap_new function returns a TCOD_heightmap_t pointer, not a TCOD_heightmap_t. The w and h fields should not be modified after the heightmap creation. The newly created heightmap is filled with 0.0 values. + @Cpp TCODHeightMap::TCODHeightMap(int w, int h) + @C + typedef struct { + int w,h; + float *values; + } TCOD_heightmap_t; + TCOD_heightmap_t *TCOD_heightmap_new(int w,int h) + @Py heightmap_new(w,h) + @C# TCODHeightMap::TCODHeightMap(int w, int h) + @Param w,h The width and height of the heightmap. + @CppEx TCODHeightMap myMap(50,50); + @CEx TCOD_heightmap_t *my_map=TCOD_heightmap_new(50,50); + @PyEx + map=libtcod.heightmap_new(50,50) + print map.w, map.h + */ + TCODHeightMap(int w, int h); + + /** + @PageName heightmap_init + @FuncTitle Destroying a heightmap + @FuncDesc To release the resources used by a heightmap, destroy it with : + @Cpp TCODHeightMap::~TCODHeightMap() + @C void TCOD_heightmap_delete(TCOD_heightmap_t *hm) + @Py heightmap_delete(hm) + @C# void TCODHeightMap::Dispose() + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + */ + virtual ~TCODHeightMap(); + + /** + @PageName heightmap_base + @PageFather heightmap + @PageTitle Basic operations + @PageDesc Those are simple operations applied either on a single map cell or on every map cell. + @FuncTitle Setting a cell value + @FuncDesc Once the heightmap has been created, you can do some basic operations on the values inside it. + You can set a single value : + @Cpp void TCODHeightMap::setValue(int x, int y, float v) + @C void TCOD_heightmap_set_value(TCOD_heightmap_t *hm, int x, int y, float value) + @Py heightmap_set_value(hm, x, y, value) + @C# void TCODHeightMap::setValue(int x, int y, float v) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the cells to modify inside the map. + 0 <= x < map width + 0 <= y < map height + @Param value The new value of the map cell. + */ + inline void setValue(int x, int y, float v) { + values[x+y*w]=v; + } + + /** + @PageName heightmap_base + @FuncTitle Adding a float value to all cells + @Cpp void TCODHeightMap::add(float value) + @C void TCOD_heightmap_add(TCOD_heightmap_t *hm, float value) + @Py heightmap_add(hm, value) + @C# void TCODHeightMap::add(float value) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param value Value to add to every cell. + */ + void add(float f); + + /** + @PageName heightmap_base + @FuncTitle Multiplying all values by a float + @Cpp void TCODHeightMap::scale(float value) + @C void TCOD_heightmap_scale(TCOD_heightmap_t *hm, float value) + @Py heightmap_scale(hm, value) + @C# void TCODHeightMap::scale(float value) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param value Every cell's value is multiplied by this value. + */ + void scale(float f); + + /** + @PageName heightmap_base + @FuncTitle Resetting all values to 0.0 + @Cpp void TCODHeightMap::clear() + @C void TCOD_heightmap_clear(TCOD_heightmap_t *hm) + @Py heightmap_clear(hm) + @C# void TCODHeightMap::clear() + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + */ + void clear(); // resets all values to 0.0 + + /** + @PageName heightmap_base + @FuncTitle Clamping all values + @Cpp void TCODHeightMap::clamp(float min, float max) + @C void TCOD_heightmap_clamp(TCOD_heightmap_t *hm, float min, float max) + @Py heightmap_clamp(hm, mi, ma) + @C# void TCODHeightMap::clamp(float min, float max) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param min,max Every cell value is clamped between min and max. + min < max + */ + void clamp(float min, float max); + + /** + @PageName heightmap_base + @FuncTitle Copying values from another heightmap + @Cpp void TCODHeightMap::copy(const TCODHeightMap *source) + @C void TCOD_heightmap_copy(const TCOD_heightmap_t *source,TCOD_heightmap_t *dest) + @Py heightmap_copy(source,dest) + @C# void TCODHeightMap::copy(TCODHeightMap source) + @Param source Each cell value from the source heightmap is copied in the destination (this for C++) heightmap. + The source and destination heightmap must have the same width and height. + @Param dest In the C and python versions, the address of the destination heightmap. + */ + void copy(const TCODHeightMap *source); + + /** + @PageName heightmap_base + @FuncTitle Normalizing values + @Cpp void TCODHeightMap::normalize(float min=0.0f, float max=1.0f) + @C void TCOD_heightmap_normalize(TCOD_heightmap_t *hm, float min, float max) + @Py heightmap_normalize(hm, mi=0.0, ma=1.0) + @C# + void TCODHeightMap::normalize() + void TCODHeightMap::normalize(float min) + void TCODHeightMap::normalize(float min, float max) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param min,max The whole heightmap is translated and scaled so that the lowest cell value becomes min and the highest cell value becomes max + min < max + */ + void normalize(float newMin=0.0f, float newMax=1.0f); // scales the values to the range [newMin;newMax] + + /** + @PageName heightmap_base + @FuncTitle Doing a lerp operation between two heightmaps + @Cpp void TCODHeightMap::lerp(const TCODHeightMap *a, const TCODHeightMap *b,float coef) + @C void TCOD_heightmap_lerp_hm(const TCOD_heightmap_t *a, const TCOD_heightmap_t *b, TCOD_heightmap_t *res, float coef) + @Py heightmap_lerp_hm(a, b, res, coef) + @C# void TCODHeightMap::lerp(TCODHeightMap a, TCODHeightMap b, float coef) + @Param a First heightmap in the lerp operation. + @Param b Second heightmap in the lerp operation. + @Param coef lerp coefficient. + For each cell in the destination map (this for C++), value = a.value + (b.value - a.value) * coef + @Param res In the C and python versions, the address of the destination heightmap. + */ + void lerp(const TCODHeightMap *a, const TCODHeightMap *b,float coef); + + /** + @PageName heightmap_base + @FuncTitle Adding two heightmaps + @Cpp void TCODHeightMap::add(const TCODHeightMap *a, const TCODHeightMap *b) + @C void TCOD_heightmap_add_hm(const TCOD_heightmap_t *a, const TCOD_heightmap_t *b, TCOD_heightmap_t *res) + @Py heightmap_add_hm(a, b, res) + @C# void TCODHeightMap::add(TCODHeightMap a, TCODHeightMap b) + @Param a First heightmap. + @Param b Second heightmap. For each cell in the destination map (this for C++), value = a.value + b.value + @Param res In the C and python versions, the address of the destination heightmap. + */ + void add(const TCODHeightMap *a, const TCODHeightMap *b); + + /** + @PageName heightmap_base + @FuncTitle Multiplying two heightmaps + @Cpp void TCODHeightMap::multiply(const TCODHeightMap *a, const TCODHeightMap *b) + @C void TCOD_heightmap_multiply_hm(const TCOD_heightmap_t *a, const TCOD_heightmap_t *b, TCOD_heightmap_t *res) + @Py heightmap_multiply_hm(a, b, res) + @C# void TCODHeightMap::multiply(TCODHeightMap a, TCODHeightMap b) + @Param a First heightmap. + @Param b Second heightmap. For each cell in the destination map (this for C++), value = a.value * b.value + @Param res In the C and python versions, the address of the destination heightmap. + */ + void multiply(const TCODHeightMap *a, const TCODHeightMap *b); + + /** + @PageName heightmap_modify + @PageFather heightmap + @PageTitle Modifying the heightmap + @PageDesc Those are advanced operations involving several or all map cells. + @FuncTitle Add hills + @FuncDesc This function adds a hill (a half spheroid) at given position. + @Cpp void TCODHeightMap::addHill(float x, float y, float radius, float height) + @C void TCOD_heightmap_add_hill(TCOD_heightmap_t *hm, float x, float y, float radius, float height) + @Py heightmap_add_hill(hm, x, y, radius, height) + @C# void TCODHeightMap::addHill(float x, float y, float radius, float height) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the center of the hill. + 0 <= x < map width + 0 <= y < map height + @Param radius The hill radius. + @Param height The hill height. If height == radius or -radius, the hill is a half-sphere. + */ + void addHill(float x, float y, float radius, float height); // adds a hill (half sphere) at given position + + /** + @PageName heightmap_modify + @FuncTitle Dig hills + @FuncDesc This function takes the highest value (if height > 0) or the lowest (if height < 0) between the map and the hill. + It's main goal is to carve things in maps (like rivers) by digging hills along a curve. + @Cpp void TCODHeightMap::digHill(float hx, float hy, float hradius, float height) + @C void TCOD_heightmap_dig_hill(TCOD_heightmap_t *hm, float x, float y, float radius, float height) + @Py heightmap_dig_hill(hm, x, y, radius, height) + @C# void TCODHeightMap::digHill(float hx, float hy, float hradius, float height) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the center of the hill. + 0 <= x < map width + 0 <= y < map height + @Param radius The hill radius. + @Param height The hill height. Can be < 0 or > 0 + */ + void digHill(float hx, float hy, float hradius, float height); + + /** + @PageName heightmap_modify + @FuncTitle Simulate rain erosion + @FuncDesc This function simulates the effect of rain drops on the terrain, resulting in erosion patterns. + @Cpp void TCODHeightMap::rainErosion(int nbDrops,float erosionCoef,float sedimentationCoef,TCODRandom *rnd) + @C void TCOD_heightmap_rain_erosion(TCOD_heightmap_t *hm, int nbDrops,float erosionCoef,float sedimentationCoef,TCOD_random_t rnd) + @Py heightmap_rain_erosion(hm, nbDrops,erosionCoef,sedimentationCoef,rnd=0) + @C# void TCODHeightMap::rainErosion(int nbDrops, float erosionCoef, float sedimentationCoef, TCODRandom rnd) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param nbDrops Number of rain drops to simulate. Should be at least width * height. + @Param erosionCoef Amount of ground eroded on the drop's path. + @Param sedimentationCoef Amount of ground deposited when the drops stops to flow + @Param rnd RNG to use, NULL for default generator. + */ + void rainErosion(int nbDrops,float erosionCoef,float sedimentationCoef,TCODRandom *rnd); + + /** + @PageName heightmap_modify + @FuncTitle Do a generic transformation + @FuncDesc This function allows you to apply a generic transformation on the map, so that each resulting cell value is the weighted sum of several neighbour cells. This can be used to smooth/sharpen the map. See examples below for a simple horizontal smoothing kernel : replace value(x,y) with 0.33*value(x-1,y) + 0.33*value(x,y) + 0.33*value(x+1,y).To do this, you need a kernel of size 3 (the sum involves 3 surrounding cells). The dx,dy array will contain : + dx=-1,dy = 0 for cell x-1,y + dx=1,dy=0 for cell x+1,y + dx=0,dy=0 for current cell (x,y) + The weight array will contain 0.33 for each cell. + @Cpp void TCODHeightMap::kernelTransform(int kernelSize, int *dx, int *dy, float *weight, float minLevel,float maxLevel) + @C void TCOD_heightmap_kernel_transform(TCOD_heightmap_t *hm, int kernelsize, int *dx, int *dy, float *weight, float minLevel,float maxLevel) + @Py heightmap_kernel_transform(hm, kernelsize, dx, dy, weight, minLevel,maxLevel) + @C# void TCODHeightMap::kernelTransform(int kernelSize, int[] dx, int[] dy, float[] weight, float minLevel, float maxLevel) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + kernelSize Number of neighbour cells involved. + @Param dx,dy Array of kernelSize cells coordinates. The coordinates are relative to the current cell (0,0) is current cell, (-1,0) is west cell, (0,-1) is north cell, (1,0) is east cell, (0,1) is south cell, ... + @Param weight Array of kernelSize cells weight. The value of each neighbour cell is scaled by its corresponding weight + @Param minLevel The transformation is only applied to cells which value is >= minLevel. + @Param maxLevel The transformation is only applied to cells which value is <= maxLevel. + @CEx + int dx [] = {-1,1,0}; + int dy[] = {0,0,0}; + float weight[] = {0.33f,0.33f,0.33f}; + TCOD_heightMap_kernel_transform(heightmap,3,dx,dy,weight,0.0f,1.0f); + @CppEx + int dx [] = {-1,1,0}; + int dy[] = {0,0,0}; + float weight[] = {0.33f,0.33f,0.33f}; + heightmap->kernelTransform(heightmap,3,dx,dy,weight,0.0f,1.0f); + */ + void kernelTransform(int kernelSize, const int *dx, const int *dy, const float *weight, float minLevel,float maxLevel); + + /** + @PageName heightmap_modify + @FuncTitle Add a Voronoi diagram + @FuncDesc This function adds values from a Voronoi diagram to the map. + @Cpp void TCODHeightMap::addVoronoi(int nbPoints, int nbCoef, float *coef,TCODRandom *rnd) + @C void TCOD_heightmap_add_voronoi(TCOD_heightmap_t *hm, int nbPoints, int nbCoef, float *coef,TCOD_random_t rnd) + @Py heightmap_add_voronoi(hm, nbPoints, nbCoef, coef,rnd=0) + @C# void TCODHeightMap::addVoronoi(int nbPoints, int nbCoef, float[] coef, TCODRandom rnd) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param nbPoints Number of Voronoi sites. + @Param nbCoef The diagram value is calculated from the nbCoef closest sites. + @Param coef The distance to each site is scaled by the corresponding coef. + Closest site : coef[0], second closest site : coef[1], ... + @Param rnd RNG to use, NULL for default generator. + */ + void addVoronoi(int nbPoints, int nbCoef, const float *coef,TCODRandom *rnd); + + /** + @PageName heightmap_modify + @FuncTitle Add a fbm + This function adds values from a simplex fbm function to the map. + @Cpp void TCODHeightMap::addFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) + @C void TCOD_heightmap_add_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) + @Py heightmap_add_fbm(hm, noise,mulx, muly, addx, addy, octaves, delta, scale) + @C# void TCODHeightMap::addFbm(TCODNoise noise, float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param noise The 2D noise to use. + @Param mulx, muly / addx, addy The noise coordinate for map cell (x,y) are (x + addx)*mulx / width , (y + addy)*muly / height. + Those values allow you to scale and translate the noise function over the heightmap. + @Param octaves Number of octaves in the fbm sum. + @Param delta / scale The value added to the heightmap is delta + noise * scale. + @Param noise is between -1.0 and 1.0 + */ + void addFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale); + + /** + @PageName heightmap_modify + @FuncTitle Scale with a fbm + @FuncDesc This function works exactly as the previous one, but it multiplies the resulting value instead of adding it to the heightmap. + @Cpp void TCODHeightMap::scaleFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) + @C void TCOD_heightmap_scale_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) + @Py heightmap_scale_fbm(hm, noise,mulx, muly, addx, addy, octaves, delta, scale) + @C# void TCODHeightMap::scaleFbm(TCODNoise noise, float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) + */ + void scaleFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale); + + /** + @PageName heightmap_modify + @FuncTitle Dig along a Bezier curve + @FuncDesc This function carve a path along a cubic Bezier curve using the digHill function. + Could be used for roads/rivers/... + Both radius and depth can vary linearly along the path. + @Cpp void TCODHeightMap::digBezier(int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth) + @C void TCOD_heightmap_dig_bezier(TCOD_heightmap_t *hm, int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth) + @Py heightmap_dig_bezier(hm, px, py, startRadius, startDepth, endRadius, endDepth) + @C# void TCODHeightMap::digBezier(int[] px, int[] py, float startRadius, float startDepth, float endRadius, float endDepth) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param px,py The coordinates of the 4 Bezier control points. + @Param startRadius The path radius in map cells at point P0. Might be < 1.0 + @Param startDepth The path depth at point P0. + @Param endRadius The path radius in map cells at point P3. Might be < 1.0 + @Param endDepth The path depth at point P3. + */ + void digBezier(int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth); + + /** + @PageName heightmap_read + @PageFather heightmap + @PageTitle Reading data from the heightmap + @PageDesc Those functions return raw or computed information about the heightmap. + @FuncTitle Get the value of a cell + @FuncDesc This function returns the height value of a map cell. + @Cpp float TCODHeightMap::getValue(int x, int y) const + @C float TCOD_heightmap_get_value(const TCOD_heightmap_t *hm, int x, int y) + @Py heightmap_get_value(hm, x, y) + @C# float TCODHeightMap::getValue(int x, int y) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the map cell. + 0 <= x < map width + 0 <= y < map height + */ + inline float getValue(int x, int y) const { + return values[x+y*w]; + } + + /** + @PageName heightmap_read + @FuncTitle Interpolate the height + @FuncDesc This function returns the interpolated height at non integer coordinates. + @Cpp float TCODHeightMap::getInterpolatedValue(float x, float y) const + @C float TCOD_heightmap_get_interpolated_value(const TCOD_heightmap_t *hm, float x, float y) + @Py heightmap_get_interpolated_value(hm, x, y) + @C# float TCODHeightMap::getInterpolatedValue(float x, float y) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the map cell. + 0 <= x < map width + 0 <= y < map height + */ + float getInterpolatedValue(float x, float y) const; + + /** + @PageName heightmap_read + @FuncTitle Get the map slope + @FuncDesc This function returns the slope between 0 and PI/2 at given coordinates. + @Cpp float TCODHeightMap::getSlope(int x, int y) const + @C float TCOD_heightmap_get_slope(const TCOD_heightmap_t *hm, int x, int y) + @Py heightmap_get_slope(hm, x, y) + @C# float TCODHeightMap::getSlope(int x, int y) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the map cell. + 0 <= x < map width + 0 <= y < map height + */ + float getSlope(int x, int y) const; // returns the slope in radian between 0 and PI/2 + + /** + @PageName heightmap_read + @FuncTitle Get the map normal + @FuncDesc This function returns the map normal at given coordinates. + @Cpp void TCODHeightMap::getNormal(float x, float y,float n[3], float waterLevel=0.0f) const + @C void TCOD_heightmap_get_normal(const TCOD_heightmap_t *hm, float x, float y, float n[3], float waterLevel) + @Py heightmap_get_normal(hm, x, y, waterLevel) # returns nx,ny,nz + @C# void TCODHeightMap::getNormal(float x, float y, float[] n, float waterLevel) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param x,y Coordinates of the map cell. + 0 <= x < map width + 0 <= y < map height + @Param n The function stores the normalized normal vector in this array. + @Param waterLevel The map height is clamped at waterLevel so that the sea is flat. + */ + void getNormal(float x, float y,float n[3], float waterLevel=0.0f) const; // returns the surface normal or (0,0,1) if beyond water level. + + /** + @PageName heightmap_read + @FuncTitle Count the map cells inside a height range + @FuncDesc This function returns the number of map cells which value is between min and max. + @Cpp int TCODHeightMap::countCells(float min,float max) const + @C int TCOD_heightmap_count_cells(const TCOD_heightmap_t *hm, float min, float max) + @Py heightmap_count_cells(hm, min, max) + @C# int TCODHeightMap::countCells(float min, float max) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param min,max Only cells which value is >=min and <= max are counted. + */ + int countCells(float min,float max) const; + + /** + @PageName heightmap_read + @FuncTitle Check if the map is an island + @FuncDesc This function checks if the cells on the map border are below a certain height. + @Cpp bool TCODHeightMap::hasLandOnBorder(float waterLevel) const + @C bool TCOD_heightmap_has_land_on_border(const TCOD_heightmap_t *hm, float waterLevel) + @Py heightmap_has_land_on_border(hm, waterLevel) + @C# bool TCODHeightMap::hasLandOnBorder(float waterLevel) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param waterLevel Return true only if no border cell is > waterLevel. + */ + bool hasLandOnBorder(float waterLevel) const; + + /** + @PageName heightmap_read + @FuncTitle Get the map min and max values + @FuncDesc This function calculates the min and max of all values inside the map. + @Cpp void TCODHeightMap::getMinMax(float *min, float *max) const + @C void TCOD_heightmap_get_minmax(const TCOD_heightmap_t *hm, float *min, float *max) + @Py heightmap_get_minmax(hm) # returns min,max + @C# void TCODHeightMap::getMinMax(out float min, out float max) + @Param hm In the C version, the address of the heightmap struct returned by the creation function. + @Param min, max The min and max values are returned in these variables. + */ + void getMinMax(float *min, float *max) const; + +// void heatErosion(int nbPass,float minSlope,float erosionCoef,float sedimentationCoef,TCODRandom *rnd); + /** + @PageName heightmap_modify + @FuncTitle Generate a map with mid-point displacement + @FuncDesc This algorithm generates a realistic fractal heightmap using the diamond-square (or random midpoint displacement) algorithm. + The roughness range should be comprised between 0.4 and 0.6. The image below show the same map with roughness varying from 0.4 to 0.6. + + It's also a good habit to normalize the map after using this algorithm to avoid unexpected heights. + + @Cpp void TCODHeightMap::midPointDisplacement(TCODRandom *rng=NULL,float roughness=0.45f) + @C void TCOD_heightmap_mid_point_displacement(TCOD_heightmap_t *hm, TCOD_random_t rnd, float roughness) + @Py heightmap_mid_point_displacement(hm, rng, roughness) + @Param hm In the C and python version, the adress of the heightmap struct returned by the creation function. + @Param rng Random number generation to use, or NULL/0 to use the default one. + @Param roughness Map roughness. + */ + void midPointDisplacement(TCODRandom *rnd = NULL, float roughness=0.45f); + void islandify(float seaLevel,TCODRandom *rnd); // lowers the terrain near the heightmap borders + // TODO : checks island connectivity with floodfill +private : +// void setMPDHeight(TCODRandom *rnd,int x,int y, float z, float offset); +// void setMDPHeightSquare(TCODRandom *rnd,int x, int y, int initsz, int sz,float offset); +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/howto.hpp b/tcod/tcod_sys/libtcod/include/howto.hpp new file mode 100644 index 00000000..29f6e69f --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/howto.hpp @@ -0,0 +1,155 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This file contains no code. It's only an input for doctcod */ + +/** + @PageName compile_libtcod + @PageCategory Howtos + @PageTitle How to compile libtcod + @PageDesc This page contains howtos about how to get the latest libtcod source code and compile it. +*/ + +/** + @PageName compile_libtcod_mingw + @PageFather compile_libtcod + @PageTitle On Windows with Mingw + @PageDesc

    Mingw installation

    + Download the latest version of Mingw from this adress : + http://sourceforge.net/projects/mingw/files/ + + The latest installer should be at the top of the page with a name starting with mingw-get-inst.. + + + + Download and run the program. Follow the installation steps. Be sure to check the "Use pre-packaged repository" option : + + + + The latest version might be less stable and might not work with a precompiled libtcod. + + When you arrive at the component selection screen, check C compiler, C++ compiler and MSys system : + + + + Keep on following the installation steps until the installation is finished. Now you have a "Mingw Shell" program in your start menu. This is the terminal you will use to compile and debug your game. + +

    TortoiseHg installation

    + In order to get the latest version of libtcod, you need a mercurial client. + Go to the download page and grab the client corresponding to your version of Windows : + http://tortoisehg.bitbucket.org/download/index.html + + Follow the installation wizard using the default configuration. Once the installation is finished, restart your computer. + + Now you should be able to use mercurial (hg) from the Mingw Shell. To check if everything is ok, start a shell and type "which hg" : + + + +

    Getting libtcod source code

    + In Mingw Shell, type : +
    hg clone https://bitbucket.org/jice/libtcod
    + + This might take some time so grab a beer. Once it's finished, a libtcod directory has been created. + You can check the documentation (the same you're currently reading) in libtcod/doc/index2.html. + The headers are in libtcod/include. + The source code in libtcod/src. + +

    Compiling libtcod

    + Go in libtcod's main directory : +
    cd libtcod
    + And start the compilation : +
    make -f makefiles/makefile-mingw
    + The compilation make take a few seconds depending on your CPU speed. Once it's finished, compile the samples : +
    make -f makefiles/makefile-samples-mingw
    + Check that everything is ok by running the samples : +
    ./samples_cpp
    +*/ + +/** + @PageName compile_libtcod_linux + @PageFather compile_libtcod + @PageTitle On Linux + @PageDesc

    Linux compilation

    + On a freshly installed Ubuntu : + Get the tools : +
    sudo apt-get install gcc g++ make upx electric-fence libsdl1.2-dev mercurial
    + + Get the latest sources : +
    hg clone https://bitbucket.org/jice/libtcod
    + + Compile the library : +
    cd libtcod/
    +
    make -f makefiles/makefile-linux clean all
    + + Compile the samples : +
    make -f makefiles/makefile-samples-linux
    + + Enjoy : +
    ./samples_cpp
    +*/ + +/** + @PageName compile_libtcod_codelite + @PageFather compile_libtcod + @PageTitle Using CodeLite + @PageDesc TODO +*/ + +/** + @PageName compile_libtcod_haiku + @PageFather compile_libtcod + @PageTitle On Haiku + @PageDesc TODO +*/ + +/** + @PageName start_project + @PageCategory Howtos + @PageTitle How to start a project + @PageDesc This page contains howtos about how to create a project from scratch +*/ + +/** + @PageName start_mingw + @PageFather start_project + @PageTitle On Windows with Mingw + @PageDesc TODO +*/ + +/** + @PageName start_linux + @PageFather start_project + @PageTitle On Linux + @PageDesc TODO +*/ + +/** + @PageName start_codelite + @PageFather start_project + @PageTitle Using CodeLite + @PageDesc TODO +*/ diff --git a/tcod/tcod_sys/libtcod/include/image.h b/tcod/tcod_sys/libtcod/include/image.h new file mode 100644 index 00000000..b8d91ac8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/image.h @@ -0,0 +1,54 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +typedef void *TCOD_image_t; + +TCODLIB_API TCOD_image_t TCOD_image_new(int width, int height); +TCODLIB_API TCOD_image_t TCOD_image_from_console(TCOD_console_t console); +TCODLIB_API void TCOD_image_refresh_console(TCOD_image_t image, TCOD_console_t console); +TCODLIB_API TCOD_image_t TCOD_image_load(const char *filename); +TCODLIB_API void TCOD_image_clear(TCOD_image_t image, TCOD_color_t color); +TCODLIB_API void TCOD_image_invert(TCOD_image_t image); +TCODLIB_API void TCOD_image_hflip(TCOD_image_t image); +TCODLIB_API void TCOD_image_rotate90(TCOD_image_t image, int numRotations); +TCODLIB_API void TCOD_image_vflip(TCOD_image_t image); +TCODLIB_API void TCOD_image_scale(TCOD_image_t image, int neww, int newh); +TCODLIB_API void TCOD_image_save(TCOD_image_t image, const char *filename); +TCODLIB_API void TCOD_image_get_size(TCOD_image_t image, int *w,int *h); +TCODLIB_API TCOD_color_t TCOD_image_get_pixel(TCOD_image_t image,int x, int y); +TCODLIB_API int TCOD_image_get_alpha(TCOD_image_t image,int x, int y); +TCODLIB_API TCOD_color_t TCOD_image_get_mipmap_pixel(TCOD_image_t image,float x0,float y0, float x1, float y1); +TCODLIB_API void TCOD_image_put_pixel(TCOD_image_t image,int x, int y,TCOD_color_t col); +TCODLIB_API void TCOD_image_blit(TCOD_image_t image, TCOD_console_t console, float x, float y, + TCOD_bkgnd_flag_t bkgnd_flag, float scalex, float scaley, float angle); +TCODLIB_API void TCOD_image_blit_rect(TCOD_image_t image, TCOD_console_t console, int x, int y, int w, int h, + TCOD_bkgnd_flag_t bkgnd_flag); +TCODLIB_API void TCOD_image_blit_2x(TCOD_image_t image, TCOD_console_t dest, int dx, int dy, int sx, int sy, int w, int h); +TCODLIB_API void TCOD_image_delete(TCOD_image_t image); +TCODLIB_API void TCOD_image_set_key_color(TCOD_image_t image, TCOD_color_t key_color); +TCODLIB_API bool TCOD_image_is_pixel_transparent(TCOD_image_t image, int x, int y); + diff --git a/tcod/tcod_sys/libtcod/include/image.hpp b/tcod/tcod_sys/libtcod/include/image.hpp new file mode 100644 index 00000000..189441a3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/image.hpp @@ -0,0 +1,440 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class TCODLIB_API TCODImage { +public : + /** + @PageName image + @PageTitle Image toolkit + @PageCategory Base toolkits + @PageDesc This toolkit contains some image manipulation utilities. + */ + + /** + @PageName image_create + @PageTitle Creating an image + @PageFather image + @FuncTitle Creating an empty image + @FuncDesc You can create an image of any size, filled with black with this function. + @Cpp TCODImage::TCODImage(int width, int height) + @C TCOD_image_t TCOD_image_new(int width, int height) + @Py image_new( width, height) + @C# TCODImage::TCODImage(int width, int height) + @Param width,height Size of the image in pixels. + @CppEx TCODImage *pix = new TCODImage(80,50); + @CEx TCOD_image_t pix = TCOD_image_new(80,50); + @PyEx pix = litbcod.image_new(80,50) + */ + TCODImage(int width, int height); + + /** + @PageName image_create + @FuncTitle Loading a .bmp or .png image + @FuncDesc You can read data from a .bmp or .png file (for example to draw an image using the background color of the console cells). + Note that only 24bits and 32bits PNG files are currently supported. + @Cpp TCODImage::TCODImage(const char *filename) + @C TCOD_image_t TCOD_image_load(const char *filename) + @Py image_load(filename) + @C# TCODImage::TCODImage(string filename) + @Param filename Name of the .bmp or .png file to load. + @CppEx TCODImage *pix = new TCODImage("mypic.bmp"); + @CEx TCOD_image_t pix = TCOD_image_load("mypic.bmp"); + @PyEx pix = libtcod.image_load("mypic.bmp") + */ + TCODImage(const char *filename); + + /** + @PageName image_create + @FuncTitle Creating an image from a console + @FuncDesc You can create an image from any console (either the root console or an offscreen console). + The image size will depend on the console size and the font characters size. + You can then save the image to a file with the save function. + @Cpp TCODImage::TCODImage(const TCODConsole *console) + @C TCOD_image_t TCOD_image_from_console(TCOD_console_t console) + @Py image_from_console(console) + @C# TCODImage::TCODImage(TCODConsole console) + @Param console The console to convert. In the C version, use NULL for the root console. + @CppEx TCODImage *pix = new TCODImage(TCODConsole::root); + @CEx TCOD_image_t pix = TCOD_image_from_console(NULL); + @PyEx pix = libtcod.image_from_console(0) + */ + TCODImage(const TCODConsole *console); + + /** + @PageName image_create + @FuncTitle refreshing an image created from a console + @FuncDesc If you need to refresh the image with the console's new content, you don't have to delete it and create another one. Instead, use this function. Note that you must use the same console that was used in the TCOD_image_from_console call (or at least a console with the same size). + @Cpp void TCODImage::refreshConsole(const TCODConsole *console) + @C void TCOD_image_refresh_console(TCOD_image_t image, TCOD_console_t console) + @Py image_refresh_console(image, console) + @C# void TCODImage::refreshConsole(TCODConsole console) + @Param image In the C version, the image created with TCOD_image_from_console. + @Param console The console to capture. In the C version, use NULL for the root console. + @CppEx + TCODImage *pix = new TCODImage(TCODConsole::root); // create an image from the root console + // ... modify the console + pix->refreshConsole(TCODConsole::root); // update the image with the console's new content + @CEx + TCOD_image_t pix = TCOD_image_from_console(NULL); + // ... modify the console .. + TCOD_image_refresh_console(pix,NULL); + @PyEx + pix = libtcod.image_from_console(0) + # ... modify the console .. + libtcod.image_refresh_console(pix,0) + */ + void refreshConsole(const TCODConsole *console); + + /** + @PageName image_read + @PageTitle Reading data from a TCODImage + @PageFather image + @FuncTitle Getting the size of an image + @FuncDesc You can read the size of an image in pixels with this function. + @Cpp void TCODImage::getSize(int *w,int *h) const + @C void TCOD_image_get_size(TCOD_image_t image, int *w,int *h) + @Py image_get_size(image) # returns w,h + @C# void TCODImage::getSize(out int w, out int h) + @Param image In the C version, the image handler, obtained with the load function. + @Param w,h When the function returns, those variables contain the size of the image. + @CppEx + TCODImage *pix = new TCODImage(80,50); + int w,h; + pix->getSize(&w,&h); // w = 80, h = 50 + @CEx + TCOD_image_t pix = TCOD_image_new(80,50); + int w,h; + TCOD_image_get_size(pix,&w,&h); // w = 80, h = 50 + @PyEx + pix = libtcod.image_new(80,50) + w,h=libtcod.image_get_size(pix) + # w = 80, h = 50 + */ + void getSize(int *w,int *h) const; + + /** + @PageName image_read + @FuncTitle Getting the color of a pixel + @FuncDesc You can read the colors from an image with this function. + @Cpp TCODColor TCODImage::getPixel(int x, int y) const + @C TCOD_color_t TCOD_image_get_pixel(TCOD_image_t image,int x, int y) + @Py image_get_pixel(image, x, y) + @C# TCODColor TCODImage::getPixel(int x, int y) + @Param image In the C and python version, the image handler, obtained with the load function. + @Param x,y The pixel coordinates inside the image. + 0 <= x < width + 0 <= y < height + @CppEx + TCODImage *pix = new TCODImage(80,50); + TCODColor col=pix->getPixel(40,25); + @CEx + TCOD_image_t pix = TCOD_image_new(80,50); + TCOD_color_t col=TCOD_image_get_pixel(pix,40,25); + @PyEx + pix = litbcod.image_new(80,50) + col=litbcod.image_get_pixel(pix,40,25) + */ + TCODColor getPixel(int x, int y) const; + + /** + @PageName image_read + @FuncTitle Getting the alpha value of a pixel + @FuncDesc If you have set a key color for this image with setKeyColor, or if this image was created from a 32 bits PNG file (with alpha layer), you can get the pixel transparency with this function. This function returns a value between 0 (transparent pixel) and 255 (opaque pixel). + @Cpp int TCODImage::getAlpha(int x, int y) const + @C int TCOD_image_get_alpha(TCOD_image_t image, int x, int y) + @Py image_get_alpha(image, x, y) + @C# int TCODImage::getAlpha(int x, int y) + @Param image In the C and python version, the image handler, obtained with the load function. + @Param x,y The pixel coordinates inside the image. + 0 <= x < width + 0 <= y < height + */ + int getAlpha(int x,int y) const; + + /** + @PageName image_read + @FuncTitle Checking if a pixel is transparent + @FuncDesc You can use this simpler version (for images with alpha layer, returns true only if alpha == 0) : + @Cpp bool TCODImage::isPixelTransparent(int x,int y) const + @C bool TCOD_image_is_pixel_transparent(TCOD_image_t image,int x, int y) + @Py image_is_pixel_transparent(image, x, y) + @C# bool TCODImage::isPixelTransparent(int x,int y) + @Param image In the C and python version, the image handler, obtained with the load function. + @Param x,y The pixel coordinates inside the image. + 0 <= x < width + 0 <= y < height + */ + bool isPixelTransparent(int x, int y) const; + + /** + @PageName image_read + @FuncTitle Getting the average color of a part of the image + @FuncDesc This method uses mipmaps to get the average color of an arbitrary rectangular region of the image. + It can be used to draw a scaled-down version of the image. It's used by libtcod's blitting functions. + @Cpp TCODColor TCODImage::getMipmapPixel(float x0,float y0, float x1, float y1) + @C TCOD_color_t TCOD_image_get_mipmap_pixel(TCOD_image_t image,float x0,float y0, float x1, float y1) + @Py image_get_mipmap_pixel(image,x0,y0, x1, y1) + @C# TCODColor TCODImage::getMipmapPixel(float x0,float y0, float x1, float y1) + @Param image In the C version, the image handler, obtained with the load function. + @Param x0,y0 Coordinates in pixels of the upper-left corner of the region. + 0.0 <= x0 < x1 + 0.0 <= y0 < y1 + @Param x1,y1 Coordinates in pixels of the lower-right corner of the region. + x0 < x1 < width + y0 < y1 < height + @CppEx + // Get the average color of a 5x5 "superpixel" in the center of the image. + TCODImage *pix = new TCODImage(80,50); + TCODColor col=pix->getMipMapPixel(37.5f, 22.5f, 42.5f, 28.5f); + @CEx + TCOD_image_t pix = TCOD_image_new(80,50); + TCOD_color_t col=TCOD_image_get_mipmap_pixel(pix,37.5f, 22.5f, 42.5f, 28.5f); + @PyEx + pix = libtcod.image_new(80,50) + col=libtcod.image_get_mipmap_pixel(pix,37.5, 22.5, 42.5, 28.5) + */ + TCODColor getMipmapPixel(float x0,float y0, float x1, float y1); + + /** + @PageName image_update + @PageTitle Updating an image + @PageFather image + @FuncTitle Filling an image with a color + @FuncDesc You can fill the whole image with a color with : + @Cpp void TCODImage::clear(const TCODColor color) + @C void TCOD_image_clear(TCOD_image_t image, TCOD_color_t color) + @Py image_clear(image,color) + @C# void TCODImage::clear(TCODColor color) + @Param image In the C and python version, the image to fill. + @Param color The color to use. + */ + void clear(const TCODColor col); + + /** + @PageName image_update + @FuncTitle Changing the color of a pixel + @Cpp TCODColor TCODImage::putPixel(int x, int y, const TCODColor col) + @C void TCOD_image_put_pixel(TCOD_image_t image,int x, int y,TCOD_color_t col) + @Py image_put_pixel(image,x, y,col) + @C# TCODColor TCODImage::putPixel(int x, int y, TCODColor col) + @Param image In the C version, the image handler, obtained with the load function. + @Param x,y The pixel coordinates inside the image. + 0 <= x < width + 0 <= y < height + @Param col The new color of the pixel. + */ + void putPixel(int x, int y, const TCODColor col); + + /** + @PageName image_update + @FuncTitle Scaling an image + @FuncDesc You can resize an image and scale its content. If neww < oldw or newh < oldh, supersampling is used to scale down the image. Else the image is scaled up using nearest neightbor. + @Cpp void TCODImage::scale(int neww, int newh) + @C void TCOD_image_scale(TCOD_image_t image,int neww, int newh) + @Py image_scale(image, neww,newh) + @C# void TCODImage::scale(int neww, int newh) + @Param image In the C and python version, the image handler, obtained with the load function. + @Param neww,newh The new size of the image. + */ + void scale(int neww, int newh); + + /** + @PageName image_update + @FuncTitle Flipping the image horizontally + @Cpp void TCODImage::hflip() + @C void TCOD_image_hflip(TCOD_image_t image) + @Py image_hflip(image) + @C# void TCODImage::hflip() + @Param image In the C and python version, the image handler, obtained with the load function. + */ + void hflip(); + + /** + @PageName image_update + @FuncTitle Flipping the image vertically + @Cpp void TCODImage::vflip() + @C void TCOD_image_vflip(TCOD_image_t image) + @Py image_vflip(image) + @C# void TCODImage::vflip() + @Param image In the C and python version, the image handler, obtained with the load function. + */ + void vflip(); + + /** + @PageName image_update + @FuncTitle Rotating the image clockwise + @FuncDesc Rotate the image clockwise by increment of 90 degrees. + @Cpp void TCODImage::rotate90(int numRotations=1) + @C void TCOD_image_rotate90(TCOD_image_t image, int numRotations) + @Py image_rotate90(image, num=1) + @C# void TCODImage::rotate90(int numRotations) + @Param image In the C and python version, the image handler, obtained with the load function. + @Param numRotations Number of 90 degrees rotations. Should be between 1 and 3. + */ + void rotate90(int numRotations=1); + + /** + @PageName image_update + @FuncTitle Inverting the colors of the image + @Cpp void TCODImage::invert() + @C void TCOD_image_invert(TCOD_image_t image) + @Py image_invert(image) + @C# void TCODImage::invert() + @Param image In the C and python version, the image handler, obtained with the load function. + */ + void invert(); + + /** + @PageName image_save + @PageFather image + @PageTitle Saving an image to a bmp or png file. + @PageDesc You can save an image to a 24 bits .bmp or .png file. + @Cpp void TCODImage::save(const char *filename) + @C void TCOD_image_save(TCOD_image_t image, const char *filename) + @Py image_save(image, filename) + @C# void TCODImage::save(string filename) + @Param image In the C version, the image handler, obtained with any image creation function. + @Param filename Name of the .bmp or .png file. + @CppEx + TCODImage *pix = new TCODImage(10,10); + pix->save("mypic.bmp"); + @CEx + TCOD_image_t pix = TCOD_image_from_console(my_offscreen_console); + TCOD_image_save(pix,"mypic.bmp"); + @PyEx + pix = libtcod.image_from_console(my_offscreen_console) + libtcod.image_save(pix,"mypic.bmp") + */ + void save(const char *filename) const; + + /** + @PageName image_blit + @PageFather image + @PageTitle Blitting an image on a console + @FuncTitle Standard blitting + @FuncDesc This function blits a rectangular part of the image on a console without scaling it or rotating it. Each pixel of the image fills a console cell. + @Cpp void TCODImage::blitRect(TCODConsole *console, int x, int y, int w=-1, int h=-1, TCOD_bkgnd_flag_t bkgnd_flag = TCOD_BKGND_SET ) const + @C void TCOD_image_blit_rect(TCOD_image_t image, TCOD_console_t console, int x, int y, int w, int h, TCOD_bkgnd_flag_t bkgnd_flag) + @Py image_blit_rect(image, console, x, y, w, h, bkgnd_flag) + @C# + void TCODImage::blitRect(TCODConsole console, int x, int y) + void TCODImage::blitRect(TCODConsole console, int x, int y, int w) + void TCODImage::blitRect(TCODConsole console, int x, int y, int w, int h) + void TCODImage::blitRect(TCODConsole console, int x, int y, int w, int h, TCODBackgroundFlag bkgnd_flag) + @Param image In the C version, the image handler, obtained with the load function. + @Param console The console on which the image will be drawn. In the C version, use NULL for the root console. + @Param x,y Coordinates in the console of the upper-left corner of the image. + @Param w,h Dimension of the image on the console. Use -1,-1 to use the image size. + @Param flag This flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t. + */ + void blitRect(TCODConsole *console, int x, int y, int w=-1, int h=-1, TCOD_bkgnd_flag_t bkgnd_flag = TCOD_BKGND_SET ) const; + + /** + @PageName image_blit + @FuncTitle Blitting with scaling and/or rotation + @FuncDesc This function allows you to specify the floating point coordinates of the center + of the image, its scale and its rotation angle. + @Cpp void TCODImage::blit(TCODConsole *console, float x, float y, TCOD_bkgnd_flag_t bkgnd_flag = TCOD_BKGND_SET, float scalex=1.0f, float scaley=1.0f, float angle=0.0f) const + @C void TCOD_image_blit(TCOD_image_t image, TCOD_console_t console, int x, int y, TCOD_bkgnd_flag_t bkgnd_flag, float scalex, float scaley, float angle) + @Py image_blit(image, console, x, y, bkgnd_flag, scalex, scaley, angle) + @C# + void TCODImage::blit(TCODConsole console, float x, float y) + void TCODImage::blit(TCODConsole console, float x, float y, TCODBackgroundFlag bkgnd_flag) + void TCODImage::blit(TCODConsole console, float x, float y, TCODBackgroundFlag bkgnd_flag, float scalex) + void TCODImage::blit(TCODConsole console, float x, float y, TCODBackgroundFlag bkgnd_flag, float scalex, float scaley) + void TCODImage::blit(TCODConsole console, float x, float y, TCODBackgroundFlag bkgnd_flag, float scalex, float scaley, float angle) + @Param image In the C version, the image handler, obtained with the load function. + @Param console The console on which the image will be drawn. In the C version, use NULL for the root console. + @Param x,y Coordinates in the console of the center of the image. + @Param flag This flag defines how the cell's background color is modified. See TCOD_bkgnd_flag_t. + @Param scalex,scaley Scale coefficient. Must be > 0.0. + @Param angle Rotation angle in radians. + */ + void blit(TCODConsole *console, float x, float y, TCOD_bkgnd_flag_t bkgnd_flag = TCOD_BKGND_SET, float scalex=1.0f, float scaley=1.0f, float angle=0.0f) const; + /** + @PageName image_blit + @FuncTitle Blitting with a mask + @FuncDesc When blitting an image, you can define a key color that will be ignored by the blitting function. This makes it possible to blit non rectangular images or images with transparent pixels. + @Cpp void TCODImage::setKeyColor(const TCODColor keyColor) + @C void TCOD_image_set_key_color(TCOD_image_t image, TCOD_color_t keyColor) + @Py image_set_key_color(image, keyColor) + @C# void TCODImage::setKeyColor(TCODColor keyColor) + @Param image In the C and python version, the image handler, obtained with the load function. + @Param color Pixels with this color will be skipped by blitting functions. + @CppEx + TCODImage *pix = TCODImage("mypix.bmp"); + pix->setKeyColor(TCODColor::red); + // blitting the image, omitting red pixels + pix->blitRect(TCODConsole::root,40,25); + @CEx + TCOD_image_t pix = TCOD_image_new(10,10); + TCOD_image_set_key_color(pix,TCOD_red); + TCOD_image_blit_rect(pix,NULL,40,25,5,5,TCOD_BKGND_SET); + @PyEx + pix = libtcod.image_new(10,10) + libtcod.image_set_key_color(pix,libtcod.red) + libtcod.image_blit_rect(pix,0,40,25,5,5,libtcod.BKGND_SET) + */ + void setKeyColor(const TCODColor keyColor); + + /** + @PageName image_blit + @FuncTitle Blitting with subcell resolution + @FuncDesc Eventually, you can use some special characters in the libtcod fonts : + + to double the console resolution using this blitting function. +
    + Comparison before/after subcell resolution in TCOD :
    +
    + Pyromancer ! screenshot, making full usage of subcell resolution :
    +
    + @Cpp void TCODImage::blit2x(TCODConsole *dest, int dx, int dy, int sx=0, int sy=0, int w=-1, int h=-1 ) const; + @C void TCOD_image_blit_2x(TCOD_image_t image, TCOD_console_t dest, int dx, int dy, int sx, int sy, int w, int h); + @Py image_blit_2x(image, dest, dx, dy, sx=0, sy=0, w=-1, h=-1) + @C# + void TCODImage::blit2x(TCODConsole dest, int dx, int dy); + void TCODImage::blit2x(TCODConsole dest, int dx, int dy, int sx); + void TCODImage::blit2x(TCODConsole dest, int dx, int dy, int sx, int sy); + void TCODImage::blit2x(TCODConsole dest, int dx, int dy, int sx, int sy, int w); + void TCODImage::blit2x(TCODConsole dest, int dx, int dy, int sx, int sy, int w, int h); + @Param image In the C and python version, the image handler, obtained with the load function. + @Param dest The console of which the image will be blited. Foreground, background and character data will be overwritten. + @Param dx,dy Coordinate of the console cell where the upper left corner of the blitted image will be. + @Param sx,sy,w,h Part of the image to blit. Use -1 in w and h to blit the whole image. + */ + void blit2x(TCODConsole *dest, int dx, int dy, int sx=0, int sy=0, int w=-1, int h=-1) const; + + TCODImage(TCOD_image_t img) : data(img), deleteData(false) {} + virtual ~TCODImage(); + +protected : + friend class TCODLIB_API TCODSystem; + friend class TCODLIB_API TCODZip; + void *data; + bool deleteData; +}; + diff --git a/tcod/tcod_sys/libtcod/include/lex.h b/tcod/tcod_sys/libtcod/include/lex.h new file mode 100644 index 00000000..5639e309 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/lex.h @@ -0,0 +1,101 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_LEX_H +#define _TCOD_LEX_H +/* + * This is a libtcod internal module. + * Use at your own risks... + */ + +#define TCOD_LEX_FLAG_NOCASE 1 +#define TCOD_LEX_FLAG_NESTING_COMMENT 2 +#define TCOD_LEX_FLAG_TOKENIZE_COMMENTS 4 + +#define TCOD_LEX_ERROR -1 +#define TCOD_LEX_UNKNOWN 0 +#define TCOD_LEX_SYMBOL 1 +#define TCOD_LEX_KEYWORD 2 +#define TCOD_LEX_IDEN 3 +#define TCOD_LEX_STRING 4 +#define TCOD_LEX_INTEGER 5 +#define TCOD_LEX_FLOAT 6 +#define TCOD_LEX_CHAR 7 +#define TCOD_LEX_EOF 8 +#define TCOD_LEX_COMMENT 9 + +#define TCOD_LEX_MAX_SYMBOLS 100 +#define TCOD_LEX_SYMBOL_SIZE 5 +#define TCOD_LEX_MAX_KEYWORDS 100 +#define TCOD_LEX_KEYWORD_SIZE 20 + +typedef struct { + int file_line, token_type, token_int_val, token_idx; + float token_float_val; + char *tok; + int toklen; + char lastStringDelim; + char *pos; + char *buf; + char *filename; + char *last_javadoc_comment; + /* private stuff */ + int nb_symbols, nb_keywords, flags; + char symbols[ TCOD_LEX_MAX_SYMBOLS][ TCOD_LEX_SYMBOL_SIZE ], + keywords[ TCOD_LEX_MAX_KEYWORDS ][ TCOD_LEX_KEYWORD_SIZE ]; + const char *simpleCmt; + const char *cmtStart, *cmtStop, *javadocCmtStart; + const char *stringDelim; + bool javadoc_read; + bool allocBuf; + bool savept; /* is this object a savepoint (no free in destructor) */ +} TCOD_lex_t; + +TCODLIB_API TCOD_lex_t *TCOD_lex_new_intern(); +TCODLIB_API TCOD_lex_t *TCOD_lex_new(const char **symbols, const char **keywords, const char *simpleComment, + const char *commentStart, const char *commentStop, const char *javadocCommentStart, const char *stringDelim, int flags); +TCODLIB_API void TCOD_lex_delete(TCOD_lex_t *lex); + +TCODLIB_API void TCOD_lex_set_data_buffer(TCOD_lex_t *lex,char *dat); +TCODLIB_API bool TCOD_lex_set_data_file(TCOD_lex_t *lex,const char *filename); + +TCODLIB_API int TCOD_lex_parse(TCOD_lex_t *lex); +TCODLIB_API int TCOD_lex_parse_until_token_type(TCOD_lex_t *lex,int token_type); +TCODLIB_API int TCOD_lex_parse_until_token_value(TCOD_lex_t *lex,const char *token_value); + +TCODLIB_API bool TCOD_lex_expect_token_type(TCOD_lex_t *lex,int token_type); +TCODLIB_API bool TCOD_lex_expect_token_value(TCOD_lex_t *lex,int token_type,const char *token_value); + +TCODLIB_API void TCOD_lex_savepoint(TCOD_lex_t *lex,TCOD_lex_t *savept); +TCODLIB_API void TCOD_lex_restore(TCOD_lex_t *lex,TCOD_lex_t *savept); +TCODLIB_API char *TCOD_lex_get_last_javadoc(TCOD_lex_t *lex); +TCODLIB_API const char *TCOD_lex_get_token_name(int token_type); +TCODLIB_API char *TCOD_lex_get_last_error(); + +TCODLIB_API int TCOD_lex_hextoint(char c); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/lex.hpp b/tcod/tcod_sys/libtcod/include/lex.hpp new file mode 100644 index 00000000..47955906 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/lex.hpp @@ -0,0 +1,73 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_LEX_HPP +#define _TCOD_LEX_HPP +/* + * This is a libtcod internal module. + * Use at your own risks... + */ + +class TCODLIB_API TCODLex { +public : + TCODLex(); + TCODLex( const char **symbols, const char **keywords, const char *simpleComment="//", + const char *commentStart="/*", const char *commentStop="*/", const char *javadocCommentStart="/**", + const char *stringDelim="\"", int flags=TCOD_LEX_FLAG_NESTING_COMMENT); + ~TCODLex(); + + void setDataBuffer(char *dat); + bool setDataFile(const char *filename); + + int parse(void); + int parseUntil(int tokenType); + int parseUntil(const char *tokenValue); + + bool expect(int tokenType); + bool expect(int tokenType,const char *tokenValue); + + void savepoint(TCODLex *savept); + void restore(TCODLex *savept); + char *getLastJavadoc(); + + int getFileLine() { return ((TCOD_lex_t *)data)->file_line; } + int getTokenType() { return ((TCOD_lex_t *)data)->token_type; } + int getTokenIntVal() { return ((TCOD_lex_t *)data)->token_int_val; } + int getTokenIdx() { return ((TCOD_lex_t *)data)->token_idx; } + float getTokenFloatVal() { return ((TCOD_lex_t *)data)->token_float_val; } + char *getToken() { return ((TCOD_lex_t *)data)->tok; } + char getStringLastDelimiter() { return ((TCOD_lex_t *)data)->lastStringDelim; } + char *getPos() { return ((TCOD_lex_t *)data)->pos; } + char *getBuf() { return ((TCOD_lex_t *)data)->buf; } + char *getFilename() { return ((TCOD_lex_t *)data)->filename; } + char *getLastJavadocComment() { return ((TCOD_lex_t *)data)->last_javadoc_comment; } + static const char *getTokenName(int tokenType) { return TCOD_lex_get_token_name(tokenType); } +protected : + void *data; +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/libtcod.h b/tcod/tcod_sys/libtcod/include/libtcod.h new file mode 100644 index 00000000..42f81b8c --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/libtcod.h @@ -0,0 +1,202 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _LIBTCOD_H +#define _LIBTCOD_H + +/* uncomment to disable unicode support */ +/*#define NO_UNICODE */ + +/* uncomment to disable opengl support */ +/*#define NO_OPENGL */ + +/* os identification + TCOD_WINDOWS : OS is windows + TCOD_LINUX : OS is Linux + TCOD_MACOSX : OS is Mac OS X + TCOD_HAIKU : OS is Haiku */ + +/* compiler identification + TCOD_VISUAL_STUDIO : compiler is Microsoft Visual Studio + TCOD_MINGW32 : compiler is Mingw32 + TCOD_GCC : compiler is gcc/g++ */ + +/* word size + TCOD_64BITS : 64 bits OS + TCOD_WIN64 : 64 bits Windows + TCOD_WIN32 : 32 bits Windows + TCOD_LINUX64 : 64 bits Linux + TCOD_LINUX32 : 32 bits Linux + TCOD_FREEBSD64 : 64 bits FreeBSD + TCOD_FREEBSD32 : 32 bits FreeBSD */ + +#if defined( _MSC_VER ) +# define TCOD_VISUAL_STUDIO +# define TCOD_WINDOWS +# ifdef _WIN64 +# define TCOD_WIN64 +# define TCOD_64BITS +# else +# define TCOD_WIN32 +# endif +#elif defined( __MINGW32__ ) +# define TCOD_WINDOWS +# define TCOD_MINGW32 +# define TCOD_WIN32 +#elif defined( __HAIKU__ ) +# define TCOD_HAIKU +# define TCOD_GCC +# if __WORDSIZE == 64 +# define TCOD_64BITS +# endif +#elif defined( __linux ) +# define TCOD_LINUX +# define TCOD_GCC +# if __WORDSIZE == 64 +# define TCOD_LINUX64 +# define TCOD_64BITS +# else +# define TCOD_LINUX32 +# endif +#elif defined( __FreeBSD__ ) +# define TCOD_FREEBSD +# define TCOD_GCC +# if __WORDSIZE == 64 +# define TCOD_FREEBSD64 +# define TCOD_64BITS +# else +# define TCOD_FREEBSD32 +# endif +#elif defined (__APPLE__) && defined (__MACH__) +# define TCOD_MACOSX +# define TCOD_GCC +#endif + +/* unicode rendering functions support */ +#ifndef NO_UNICODE +#include +#endif + +/* This is a hack. SDL by default want you to rename your main statement, and insert it's own first + It does that to handle some init code. However, libtcod handles that for you. If we did this + wrappers like libtcod-net would be hosed, since there is no main statement there. */ +#ifdef TCOD_MACOSX +#define _SDL_main_h +#include "SDL/SDL.h" +#endif + +/* base types */ +typedef unsigned char uint8; +typedef char int8; +typedef unsigned short uint16; +typedef short int16; +typedef unsigned int uint32; +typedef int int32; +/* int with the same size as a pointer (32 or 64 depending on OS) */ +typedef long intptr; +typedef unsigned long uintptr; + +#define TCOD_HEXVERSION 0x010502 +#define TCOD_STRVERSION "1.5.2" +#define TCOD_TECHVERSION 0x01050200 + +/* bool support for C */ +#ifndef __cplusplus +#ifndef bool +typedef uint8 bool; +#define false ((bool)0) +#define true ((bool)1) +#endif +#else +/* in C++ all C functions prototypes should use uint8 instead of bool */ +#define bool uint8 +#endif + +/* DLL export */ +#ifdef TCOD_WINDOWS +#ifdef LIBTCOD_EXPORTS +#define TCODLIB_API __declspec(dllexport) +#else +#define TCODLIB_API __declspec(dllimport) +#endif +#else +#define TCODLIB_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ansi C lacks support for those functions */ +TCODLIB_API char *TCOD_strdup(const char *s); +TCODLIB_API int TCOD_strcasecmp(const char *s1, const char *s2); +TCODLIB_API int TCOD_strncasecmp(const char *s1, const char *s2, size_t n); + +#if defined(TCOD_WINDOWS) +char *strcasestr (const char *haystack, const char *needle); +#endif +#if defined(TCOD_LINUX) || defined(TCOD_HAIKU) || defined(TCOD_FREEBSD) || defined(TCOD_MACOSX) +#define vsnwprintf vswprintf +#endif +#ifdef TCOD_WINDOWS +#define vsnwprintf _vsnwprintf +#endif + +/****************************************** + utility macros + ******************************************/ +#define MAX(a,b) ((a)<(b)?(b):(a)) +#define MIN(a,b) ((a)>(b)?(b):(a)) +#define ABS(a) ((a)<0?-(a):(a)) +#define CLAMP(a, b, x) ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x))) +#define LERP(a, b, x) ( (a) + (x) * ((b) - (a)) ) + +#include "list.h" +#include "color.h" +#include "console.h" +#include "image.h" +#include "mouse.h" +#include "sys.h" +#include "mersenne.h" +#include "bresenham.h" +#include "noise.h" +#include "fov.h" +#include "path.h" +#include "lex.h" +#include "parser.h" +#include "tree.h" +#include "bsp.h" +#include "heightmap.h" +#include "zip.h" +#include "namegen.h" +#include "txtfield.h" +#ifdef __cplusplus +#undef bool +} +#endif + +#endif diff --git a/tcod/tcod_sys/libtcod/include/libtcod.hpp b/tcod/tcod_sys/libtcod/include/libtcod.hpp new file mode 100644 index 00000000..7e40afeb --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/libtcod.hpp @@ -0,0 +1,51 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _LIBTCOD_HPP +#define _LIBTCOD_HPP + +#include "libtcod.h" +#include "list.hpp" +#include "color.hpp" +#include "console.hpp" +#include "image.hpp" +#include "sys.hpp" +#include "mersenne.hpp" +#include "mouse.hpp" +#include "bresenham.hpp" +#include "noise.hpp" +#include "fov.hpp" +#include "path.hpp" +#include "lex.hpp" +#include "parser.hpp" +#include "tree.hpp" +#include "bsp.hpp" +#include "heightmap.hpp" +#include "zip.hpp" +#include "namegen.hpp" +#include "txtfield.hpp" +#endif diff --git a/tcod/tcod_sys/libtcod/include/libtcod_int.h b/tcod/tcod_sys/libtcod/include/libtcod_int.h new file mode 100644 index 00000000..b60908b8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/libtcod_int.h @@ -0,0 +1,459 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCODLIB_INT_H +#define _TCODLIB_INT_H +#include +#include +/* tcodlib internal stuff */ +#ifdef __cplusplus +extern "C" { +#endif + +/* a cell in the console */ +typedef struct { + int c; /* character ascii code */ + int cf; /* character number in font */ + TCOD_color_t fore; /* foreground color */ + TCOD_color_t back; /* background color */ + uint8 dirt; /* cell modified since last flush ? */ +} char_t; + +/* TCODConsole non public data */ +typedef struct { + char_t *buf; /* current console */ + char_t *oldbuf; /* console for last frame */ + /* console width and height (in characters,not pixels) */ + int w,h; + /* default background operator for print & print_rect functions */ + TCOD_bkgnd_flag_t bkgnd_flag; + /* default alignment for print & print_rect functions */ + TCOD_alignment_t alignment; + /* foreground (text), background and key colors */ + TCOD_color_t fore,back,key; + uint8 fade; + bool haskey; /* a key color has been defined */ +} TCOD_console_data_t; + +/* fov internal stuff */ +typedef struct { + bool transparent:1; + bool walkable:1; + bool fov:1; +} cell_t; +typedef struct { + int width; + int height; + int nbcells; + cell_t *cells; +} map_t; + +/* pseudorandom number generator toolkit */ +typedef struct { + /* algorithm identifier */ + TCOD_random_algo_t algo; + /* distribution */ + TCOD_distribution_t distribution; + /* Mersenne Twister stuff */ + uint32 mt[624]; + int cur_mt; + /* Complementary-Multiply-With-Carry stuff */ + /* shared with Generalised Feedback Shift Register */ + uint32 Q[4096], c; + int cur; +} mersenne_data_t; + +typedef struct { + /* number of characters in the bitmap font */ + int fontNbCharHoriz; + int fontNbCharVertic; + /* font type and layout */ + bool font_tcod_layout; + bool font_in_row; + bool font_greyscale; + /* character size in font */ + int font_width; + int font_height; + char font_file[512]; + char window_title[512]; + /* ascii code to tcod layout converter */ + int *ascii_to_tcod; + /* whether each character in the font is a colored tile */ + bool *colored; + /* the root console */ + TCOD_console_data_t *root; + /* nb chars in the font */ + int max_font_chars; + /* fullscreen data */ + bool fullscreen; + int fullscreen_offsetx; + int fullscreen_offsety; + /* asked by the user */ + int fullscreen_width; + int fullscreen_height; + /* actual resolution */ + int actual_fullscreen_width; + int actual_fullscreen_height; + /* renderer to use */ + TCOD_renderer_t renderer; + /* user post-processing callback */ + SDL_renderer_t sdl_cbk; + /* fading data */ + TCOD_color_t fading_color; + uint8 fade; + /* application window was closed */ + bool is_window_closed; + /* application has mouse focus */ + bool app_has_mouse_focus; + /* application is active (not iconified) */ + bool app_is_active; +} TCOD_internal_context_t; + +extern TCOD_internal_context_t TCOD_ctx; + +#if defined(__ANDROID__) && !defined(NDEBUG) +#include +#ifdef printf +#undef printf +#endif +#ifdef vprintf +#undef vprintf +#endif +#define printf(args...) __android_log_print(ANDROID_LOG_INFO, "libtcod", ## args) +#define vprintf(args...) __android_log_vprint(ANDROID_LOG_INFO, "libtcod", ## args) + +#ifdef assert +#undef assert +#endif +#define assert(cond) if(!(cond)) __android_log_assert(#cond, "libtcod", "assertion failed: %s", #cond) +#endif + +#ifdef NDEBUG +#define TCOD_IF(x) if (x) +#define TCOD_IFNOT(x) if (!(x)) +#define TCOD_ASSERT(x) +#define TCOD_LOG(x) +#else +#define TCOD_IF(x) assert(x); +#define TCOD_IFNOT(x) assert(x); if (0) +#define TCOD_ASSERT(x) assert(x) +#define TCOD_LOG(x) printf x +#endif + +#ifndef NO_OPENGL +/* opengl utilities */ +void TCOD_opengl_init_attributes(); +bool TCOD_opengl_init_state(int conw, int conh, void *font_tex); +bool TCOD_opengl_init_shaders(); +bool TCOD_opengl_render(int oldFade, bool *ascii_updated, char_t *console_buffer, char_t *prev_console_buffer); +void TCOD_opengl_swap(); +void * TCOD_opengl_get_screen(); +#endif + +/* fov internal stuff */ +void TCOD_map_compute_fov_circular_raycasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls); +void TCOD_map_compute_fov_diamond_raycasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls); +void TCOD_map_compute_fov_recursive_shadowcasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls); +void TCOD_map_compute_fov_permissive2(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls, int fovType); +void TCOD_map_compute_fov_restrictive_shadowcasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls); +void TCOD_map_postproc(map_t *map,int x0,int y0, int x1, int y1, int dx, int dy); + +/* TCODConsole non public methods*/ +bool TCOD_console_init(TCOD_console_t con,const char *title, bool fullscreen); +int TCOD_console_print_internal(TCOD_console_t con,int x,int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t align, char *msg, bool can_split, bool count_only); +int TCOD_console_stringLength(const unsigned char *s); +unsigned char * TCOD_console_forward(unsigned char *s,int l); +char *TCOD_console_vsprint(const char *fmt, va_list ap); +char_t *TCOD_console_get_buf(TCOD_console_t con); +/* fatal errors */ +void TCOD_fatal(const char *fmt, ...); +void TCOD_fatal_nopar(const char *msg); + +/* TCODSystem non public methods */ +TCODLIB_API void TCOD_sys_startup(); +bool TCOD_sys_init(int w,int h, char_t *buf, char_t *oldbuf, bool fullscreen); +void TCOD_sys_set_custom_font(const char *font_name,int nb_ch, int nb_cv,int flags); +void TCOD_sys_map_ascii_to_font(int asciiCode, int fontCharX, int fontCharY); +void *TCOD_sys_create_bitmap_for_console(TCOD_console_t console); +void TCOD_sys_save_bitmap(void *bitmap, const char *filename); +void *TCOD_sys_create_bitmap(int width, int height, TCOD_color_t *buf); +void TCOD_sys_delete_bitmap(void *bitmap); +void TCOD_sys_console_to_bitmap(void *bitmap, int console_width, int console_height, char_t *console_buffer, char_t *prev_console_buffer); +void TCOD_sys_set_keyboard_repeat(int initial_delay, int interval); +TCODLIB_API void *TCOD_sys_get_surface(int width, int height, bool alpha); +void TCOD_sys_save_fps(); +void TCOD_sys_restore_fps(); + +/* switch fullscreen mode */ +void TCOD_sys_set_fullscreen(bool fullscreen); +void TCOD_sys_set_clear_screen(); +void TCOD_sys_set_scale_factor(float value); +void TCOD_sys_convert_console_to_screen_coords(int cx, int cy, int *sx, int *sy); +void TCOD_sys_convert_screen_to_console_coords(int sx, int sy, int *cx, int *cy); +void TCOD_sys_flush(bool render); +TCOD_key_t TCOD_sys_check_for_keypress(int flags); +TCOD_key_t TCOD_sys_wait_for_keypress(bool flush); +bool TCOD_sys_is_key_pressed(TCOD_keycode_t key); +void TCOD_sys_set_window_title(const char *title); +/* close the window */ +void TCOD_sys_term(); + +/* UTF-8 stuff */ +#ifndef NO_UNICODE +wchar_t *TCOD_console_vsprint_utf(const wchar_t *fmt, va_list ap); +int TCOD_console_print_internal_utf(TCOD_console_t con,int x,int y, int rw, int rh, TCOD_bkgnd_flag_t flag, + TCOD_alignment_t align, wchar_t *msg, bool can_split, bool count_only); +#endif + +/* image manipulation */ +TCODLIB_API void *TCOD_sys_load_image(const char *filename); +void TCOD_sys_get_image_size(const void *image, int *w,int *h); +TCOD_color_t TCOD_sys_get_image_pixel(const void *image,int x, int y); +int TCOD_sys_get_image_alpha(const void *image,int x, int y); +bool TCOD_sys_check_magic_number(const char *filename, int size, uint8 *data); + +/* TCOD_list nonpublic methods */ +void TCOD_list_set_size(TCOD_list_t l, int size); + +/* color values */ +#define TCOD_BLACK 0,0,0 +#define TCOD_DARKEST_GREY 31,31,31 +#define TCOD_DARKER_GREY 63,63,63 +#define TCOD_DARK_GREY 95,95,95 +#define TCOD_GREY 127,127,127 +#define TCOD_LIGHT_GREY 159,159,159 +#define TCOD_LIGHTER_GREY 191,191,191 +#define TCOD_LIGHTEST_GREY 223,223,223 +#define TCOD_WHITE 255,255,255 + +#define TCOD_DARKEST_SEPIA 31,24,15 +#define TCOD_DARKER_SEPIA 63,50,31 +#define TCOD_DARK_SEPIA 94,75,47 +#define TCOD_SEPIA 127,101,63 +#define TCOD_LIGHT_SEPIA 158,134,100 +#define TCOD_LIGHTER_SEPIA 191,171,143 +#define TCOD_LIGHTEST_SEPIA 222,211,195 + +/* desaturated */ +#define TCOD_DESATURATED_RED 127,63,63 +#define TCOD_DESATURATED_FLAME 127,79,63 +#define TCOD_DESATURATED_ORANGE 127,95,63 +#define TCOD_DESATURATED_AMBER 127,111,63 +#define TCOD_DESATURATED_YELLOW 127,127,63 +#define TCOD_DESATURATED_LIME 111,127,63 +#define TCOD_DESATURATED_CHARTREUSE 95,127,63 +#define TCOD_DESATURATED_GREEN 63,127,63 +#define TCOD_DESATURATED_SEA 63,127,95 +#define TCOD_DESATURATED_TURQUOISE 63,127,111 +#define TCOD_DESATURATED_CYAN 63,127,127 +#define TCOD_DESATURATED_SKY 63,111,127 +#define TCOD_DESATURATED_AZURE 63,95,127 +#define TCOD_DESATURATED_BLUE 63,63,127 +#define TCOD_DESATURATED_HAN 79,63,127 +#define TCOD_DESATURATED_VIOLET 95,63,127 +#define TCOD_DESATURATED_PURPLE 111,63,127 +#define TCOD_DESATURATED_FUCHSIA 127,63,127 +#define TCOD_DESATURATED_MAGENTA 127,63,111 +#define TCOD_DESATURATED_PINK 127,63,95 +#define TCOD_DESATURATED_CRIMSON 127,63,79 + +/* lightest */ +#define TCOD_LIGHTEST_RED 255,191,191 +#define TCOD_LIGHTEST_FLAME 255,207,191 +#define TCOD_LIGHTEST_ORANGE 255,223,191 +#define TCOD_LIGHTEST_AMBER 255,239,191 +#define TCOD_LIGHTEST_YELLOW 255,255,191 +#define TCOD_LIGHTEST_LIME 239,255,191 +#define TCOD_LIGHTEST_CHARTREUSE 223,255,191 +#define TCOD_LIGHTEST_GREEN 191,255,191 +#define TCOD_LIGHTEST_SEA 191,255,223 +#define TCOD_LIGHTEST_TURQUOISE 191,255,239 +#define TCOD_LIGHTEST_CYAN 191,255,255 +#define TCOD_LIGHTEST_SKY 191,239,255 +#define TCOD_LIGHTEST_AZURE 191,223,255 +#define TCOD_LIGHTEST_BLUE 191,191,255 +#define TCOD_LIGHTEST_HAN 207,191,255 +#define TCOD_LIGHTEST_VIOLET 223,191,255 +#define TCOD_LIGHTEST_PURPLE 239,191,255 +#define TCOD_LIGHTEST_FUCHSIA 255,191,255 +#define TCOD_LIGHTEST_MAGENTA 255,191,239 +#define TCOD_LIGHTEST_PINK 255,191,223 +#define TCOD_LIGHTEST_CRIMSON 255,191,207 + +/* lighter */ +#define TCOD_LIGHTER_RED 255,127,127 +#define TCOD_LIGHTER_FLAME 255,159,127 +#define TCOD_LIGHTER_ORANGE 255,191,127 +#define TCOD_LIGHTER_AMBER 255,223,127 +#define TCOD_LIGHTER_YELLOW 255,255,127 +#define TCOD_LIGHTER_LIME 223,255,127 +#define TCOD_LIGHTER_CHARTREUSE 191,255,127 +#define TCOD_LIGHTER_GREEN 127,255,127 +#define TCOD_LIGHTER_SEA 127,255,191 +#define TCOD_LIGHTER_TURQUOISE 127,255,223 +#define TCOD_LIGHTER_CYAN 127,255,255 +#define TCOD_LIGHTER_SKY 127,223,255 +#define TCOD_LIGHTER_AZURE 127,191,255 +#define TCOD_LIGHTER_BLUE 127,127,255 +#define TCOD_LIGHTER_HAN 159,127,255 +#define TCOD_LIGHTER_VIOLET 191,127,255 +#define TCOD_LIGHTER_PURPLE 223,127,255 +#define TCOD_LIGHTER_FUCHSIA 255,127,255 +#define TCOD_LIGHTER_MAGENTA 255,127,223 +#define TCOD_LIGHTER_PINK 255,127,191 +#define TCOD_LIGHTER_CRIMSON 255,127,159 + +/* light */ +#define TCOD_LIGHT_RED 255,63,63 +#define TCOD_LIGHT_FLAME 255,111,63 +#define TCOD_LIGHT_ORANGE 255,159,63 +#define TCOD_LIGHT_AMBER 255,207,63 +#define TCOD_LIGHT_YELLOW 255,255,63 +#define TCOD_LIGHT_LIME 207,255,63 +#define TCOD_LIGHT_CHARTREUSE 159,255,63 +#define TCOD_LIGHT_GREEN 63,255,63 +#define TCOD_LIGHT_SEA 63,255,159 +#define TCOD_LIGHT_TURQUOISE 63,255,207 +#define TCOD_LIGHT_CYAN 63,255,255 +#define TCOD_LIGHT_SKY 63,207,255 +#define TCOD_LIGHT_AZURE 63,159,255 +#define TCOD_LIGHT_BLUE 63,63,255 +#define TCOD_LIGHT_HAN 111,63,255 +#define TCOD_LIGHT_VIOLET 159,63,255 +#define TCOD_LIGHT_PURPLE 207,63,255 +#define TCOD_LIGHT_FUCHSIA 255,63,255 +#define TCOD_LIGHT_MAGENTA 255,63,207 +#define TCOD_LIGHT_PINK 255,63,159 +#define TCOD_LIGHT_CRIMSON 255,63,111 + +/* normal */ +#define TCOD_RED 255,0,0 +#define TCOD_FLAME 255,63,0 +#define TCOD_ORANGE 255,127,0 +#define TCOD_AMBER 255,191,0 +#define TCOD_YELLOW 255,255,0 +#define TCOD_LIME 191,255,0 +#define TCOD_CHARTREUSE 127,255,0 +#define TCOD_GREEN 0,255,0 +#define TCOD_SEA 0,255,127 +#define TCOD_TURQUOISE 0,255,191 +#define TCOD_CYAN 0,255,255 +#define TCOD_SKY 0,191,255 +#define TCOD_AZURE 0,127,255 +#define TCOD_BLUE 0,0,255 +#define TCOD_HAN 63,0,255 +#define TCOD_VIOLET 127,0,255 +#define TCOD_PURPLE 191,0,255 +#define TCOD_FUCHSIA 255,0,255 +#define TCOD_MAGENTA 255,0,191 +#define TCOD_PINK 255,0,127 +#define TCOD_CRIMSON 255,0,63 + +/* dark */ +#define TCOD_DARK_RED 191,0,0 +#define TCOD_DARK_FLAME 191,47,0 +#define TCOD_DARK_ORANGE 191,95,0 +#define TCOD_DARK_AMBER 191,143,0 +#define TCOD_DARK_YELLOW 191,191,0 +#define TCOD_DARK_LIME 143,191,0 +#define TCOD_DARK_CHARTREUSE 95,191,0 +#define TCOD_DARK_GREEN 0,191,0 +#define TCOD_DARK_SEA 0,191,95 +#define TCOD_DARK_TURQUOISE 0,191,143 +#define TCOD_DARK_CYAN 0,191,191 +#define TCOD_DARK_SKY 0,143,191 +#define TCOD_DARK_AZURE 0,95,191 +#define TCOD_DARK_BLUE 0,0,191 +#define TCOD_DARK_HAN 47,0,191 +#define TCOD_DARK_VIOLET 95,0,191 +#define TCOD_DARK_PURPLE 143,0,191 +#define TCOD_DARK_FUCHSIA 191,0,191 +#define TCOD_DARK_MAGENTA 191,0,143 +#define TCOD_DARK_PINK 191,0,95 +#define TCOD_DARK_CRIMSON 191,0,47 + +/* darker */ +#define TCOD_DARKER_RED 127,0,0 +#define TCOD_DARKER_FLAME 127,31,0 +#define TCOD_DARKER_ORANGE 127,63,0 +#define TCOD_DARKER_AMBER 127,95,0 +#define TCOD_DARKER_YELLOW 127,127,0 +#define TCOD_DARKER_LIME 95,127,0 +#define TCOD_DARKER_CHARTREUSE 63,127,0 +#define TCOD_DARKER_GREEN 0,127,0 +#define TCOD_DARKER_SEA 0,127,63 +#define TCOD_DARKER_TURQUOISE 0,127,95 +#define TCOD_DARKER_CYAN 0,127,127 +#define TCOD_DARKER_SKY 0,95,127 +#define TCOD_DARKER_AZURE 0,63,127 +#define TCOD_DARKER_BLUE 0,0,127 +#define TCOD_DARKER_HAN 31,0,127 +#define TCOD_DARKER_VIOLET 63,0,127 +#define TCOD_DARKER_PURPLE 95,0,127 +#define TCOD_DARKER_FUCHSIA 127,0,127 +#define TCOD_DARKER_MAGENTA 127,0,95 +#define TCOD_DARKER_PINK 127,0,63 +#define TCOD_DARKER_CRIMSON 127,0,31 + +/* darkest */ +#define TCOD_DARKEST_RED 63,0,0 +#define TCOD_DARKEST_FLAME 63,15,0 +#define TCOD_DARKEST_ORANGE 63,31,0 +#define TCOD_DARKEST_AMBER 63,47,0 +#define TCOD_DARKEST_YELLOW 63,63,0 +#define TCOD_DARKEST_LIME 47,63,0 +#define TCOD_DARKEST_CHARTREUSE 31,63,0 +#define TCOD_DARKEST_GREEN 0,63,0 +#define TCOD_DARKEST_SEA 0,63,31 +#define TCOD_DARKEST_TURQUOISE 0,63,47 +#define TCOD_DARKEST_CYAN 0,63,63 +#define TCOD_DARKEST_SKY 0,47,63 +#define TCOD_DARKEST_AZURE 0,31,63 +#define TCOD_DARKEST_BLUE 0,0,63 +#define TCOD_DARKEST_HAN 15,0,63 +#define TCOD_DARKEST_VIOLET 31,0,63 +#define TCOD_DARKEST_PURPLE 47,0,63 +#define TCOD_DARKEST_FUCHSIA 63,0,63 +#define TCOD_DARKEST_MAGENTA 63,0,47 +#define TCOD_DARKEST_PINK 63,0,31 +#define TCOD_DARKEST_CRIMSON 63,0,15 + +/* metallic */ +#define TCOD_BRASS 191,151,96 +#define TCOD_COPPER 197,136,124 +#define TCOD_GOLD 229,191,0 +#define TCOD_SILVER 203,203,203 + +/* miscellaneous */ +#define TCOD_CELADON 172,255,175 +#define TCOD_PEACH 255,159,127 + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/tcod/tcod_sys/libtcod/include/list.h b/tcod/tcod_sys/libtcod/include/list.h new file mode 100644 index 00000000..6df1eb57 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/list.h @@ -0,0 +1,57 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_LIST_H +#define _TCOD_LIST_H + +typedef void *TCOD_list_t; + +TCODLIB_API TCOD_list_t TCOD_list_new(); +TCODLIB_API TCOD_list_t TCOD_list_allocate(int nb_elements); +TCODLIB_API TCOD_list_t TCOD_list_duplicate(TCOD_list_t l); +TCODLIB_API void TCOD_list_delete(TCOD_list_t l); +TCODLIB_API void TCOD_list_push(TCOD_list_t l, const void * elt); +TCODLIB_API void * TCOD_list_pop(TCOD_list_t l); +TCODLIB_API void * TCOD_list_peek(TCOD_list_t l); +TCODLIB_API void TCOD_list_add_all(TCOD_list_t l, TCOD_list_t l2); +TCODLIB_API void * TCOD_list_get(TCOD_list_t l,int idx); +TCODLIB_API void TCOD_list_set(TCOD_list_t l,const void *elt, int idx); +TCODLIB_API void ** TCOD_list_begin(TCOD_list_t l); +TCODLIB_API void ** TCOD_list_end(TCOD_list_t l); +TCODLIB_API void TCOD_list_reverse(TCOD_list_t l); +TCODLIB_API void **TCOD_list_remove_iterator(TCOD_list_t l, void **elt); +TCODLIB_API void TCOD_list_remove(TCOD_list_t l, const void * elt); +TCODLIB_API void **TCOD_list_remove_iterator_fast(TCOD_list_t l, void **elt); +TCODLIB_API void TCOD_list_remove_fast(TCOD_list_t l, const void * elt); +TCODLIB_API bool TCOD_list_contains(TCOD_list_t l,const void * elt); +TCODLIB_API void TCOD_list_clear(TCOD_list_t l); +TCODLIB_API void TCOD_list_clear_and_delete(TCOD_list_t l); +TCODLIB_API int TCOD_list_size(TCOD_list_t l); +TCODLIB_API void ** TCOD_list_insert_before(TCOD_list_t l,const void *elt,int before); +TCODLIB_API bool TCOD_list_is_empty(TCOD_list_t l); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/list.hpp b/tcod/tcod_sys/libtcod/include/list.hpp new file mode 100644 index 00000000..22c0dc65 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/list.hpp @@ -0,0 +1,616 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_LIST_HPP +#define _TCOD_LIST_HPP + +#include // memcpy +#include // NULL + +/** + @PageName list + @PageCategory Base toolkits + @PageTitle All purposes container + @PageDesc This is a fast, lightweight and generic container, that provides array, list and stack paradigms. +Note that this module has no python wrapper. Use python built-in containers instead. + */ + +// fast & lightweight list template +template class TCODList { + T *array; + int fillSize; + int allocSize; + +public : + /** + @PageName list_create + @PageFather list + @PageTitle Creating a list + @FuncTitle Using the default constructor + @FuncDesc You can create an empty list with the default constructor. The C version returns a handler on the list. + @Cpp template TCODList::TCODList() + @C TCOD_list_t TCOD_list_new() + @CppEx + TCODList intList; + TCODList *floatList = new TCODList(); + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_t floatList = TCOD_list_new(); + */ + TCODList() { + array=NULL; + fillSize=allocSize=0; + } + + /** + @PageName list_create + @FuncTitle Duplicating an existing list + @FuncDesc You can create a list by duplicating an existing list. + @Cpp template TCODList::TCODList(const TCODList &l) + @C TCOD_list_t TCOD_list_duplicate(TCOD_list_t l) + @Param l Existing list to duplicate. + @CppEx + TCODList intList; + intList.push(3); + intList.push(5); + TCODList intList2(intList); // intList2 contains two elements : 3 and 5 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)3); + TCOD_list_push(intList,(const void *)5); + TCOD_list_t intList2 = TCOD_list_duplicate(intList); // intList2 contains two elements : 3 and 5 + */ + TCODList(const TCOD_list_t l) { + array=NULL; + fillSize=allocSize=0; + for ( void **it=TCOD_list_begin(l); it != TCOD_list_end(l); it++ ) { + push(*((T *)(it))); + } + } + TCODList(const TCODList &l2) { + array=NULL; + fillSize=allocSize=0; + *this = l2; + } + + /** + @PageName list_create + @FuncTitle Preallocating memory + @FuncDesc You can also create an empty list and pre-allocate memory for elements. Use this if you know the list size and want the memory to fit it perfectly. + @Cpp template TCODList::TCODList(int nbElements) + @C TCOD_list_t TCOD_list_allocate(int nbElements) + @Param nbElements Allocate memory for nbElements. + @CppEx TCODList intList(5); // create an empty list, pre-allocate memory for 5 elements + @CEx TCOD_list_t intList = TCOD_list_allocate(5); + */ + TCODList(int nbElements) { + fillSize=0; + allocSize=nbElements; + array=new T[ nbElements ]; + } + + /** + @PageName list_create + @FuncTitle Deleting a list + @FuncDesc You can delete a list, freeing any allocated resources. Note that deleting the list does not delete it's elements. You have to use clearAndDelete before deleting the list if you want to destroy the elements too. + @Cpp virtual template TCODList::~TCODList() + @C void TCOD_list_delete(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList *intList = new TCODList(); // allocate a new empty list + intList->push(5); // the list contains 1 element at position 0, value = 5 + delete intList; // destroy the list + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)5); + TCOD_list_delete(intList); + */ + virtual ~TCODList() { + if ( array ) delete [] array; + } + + /** + @PageName list_array + @PageTitle Basic array operations + @PageFather list + @FuncTitle Setting an element + @FuncDesc You can assign a value with set. If needed, the array will allocate new elements up to idx. + @Cpp template void TCODList::set(const T elt, int idx) + @C void TCOD_list_set(TCOD_list_t l,const void *elt, int idx) + @Param elt Element to put in the array. + @Param idx Index of the element. + 0 <= idx + @Param l In the C version, the handler, returned by a constructor. + @CppEx + TCODList intList; // the array is empty (contains 0 elements) + intList.set(5,0); // the array contains 1 element at position 0, value = 5 + intList.set(7,2); // the array contains 3 elements : 5, 0, 7 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,(const void *)5,0); + TCOD_list_set(intList,(const void *)7,2); + */ + void set(const T elt, int idx) { + if ( idx < 0 ) return; + while ( allocSize < idx+1 ) allocate(); + array[idx] = elt; + if ( idx+1 > fillSize ) fillSize = idx+1; + } + + /** + @PageName list_array + @FuncTitle Getting an element value + @FuncDesc You can retrieve a value with get. + @Cpp template T TCODList::get(int idx) const + @C void * TCOD_list_get(TCOD_list_t l,int idx) + @Param idx Index of the element. + 0 <= idx < size of the array + @Param l In the C version, the handler, returned by a constructor. + @CppEx + TCODList intList; + intList.set(5,0); + int val = intList.get(0); // val == 5 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,(const void *)5,0); + int val = (int)TCOD_list_get(intList,0); // val == 5 + */ + T get(int idx) const { + return array[idx]; + } + + /** + @PageName list_array + @FuncTitle Checking if a list is empty + @Cpp template bool TCODList::isEmpty() const + @C bool TCOD_list_is_empty(TCOD_list_t l) + @Param l In the C version, the handler, returned by a constructor. + @CppEx + TCODList intList; + bool empty=intList.isEmpty(); // empty == true + intList.set(3,0); + empty=intList.isEmpty(); // empty == false + @CEx + TCOD_list_t intList = TCOD_list_new(); + bool empty=TCOD_list_is_empty(intList); // empty == true + TCOD_list_set(intList,(const void *)5,0); + empty=TCOD_list_is_empty(intList); // empty == false + */ + bool isEmpty() const { + return ( fillSize == 0 ); + } + + /** + @PageName list_array + @FuncTitle Getting the list size + @Cpp template int TCODList::size() const + @C int TCOD_list_size(TCOD_list_t l) + @Param l In the C version, the handler, returned by a constructor. + @CppEx + TCODList intList; + int size=intList.size(); // size == 0 + intList.set(3,0); + size=intList.size(); // size == 1 + @CEx + TCOD_list_t intList = TCOD_list_new(); + int size=TCOD_list_size(intList); // size == 0 + TCOD_list_set(intList,(const void *)5,0); + size=TCOD_list_size(intList); // size == 1 + */ + int size() const { + return fillSize; + } + + /** + @PageName list_array + @FuncTitle Checking if an element is in the list + @Cpp template bool TCODList::contains(const T elt) const + @C bool TCOD_list_contains(TCOD_list_t l,const void * elt) + @Param elt The element. + @Param l In the C version, the handler, returned by a constructor. + @CppEx + TCODList intList; + intList.set(3,0); + bool has3 = intList.contains(3); // has3 == true + bool has4 = intList.contains(4); // has4 == false + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,(const void *)3,0); + bool has3 = TCOD_list_contains(intList,(const void *)3); // has3 == true + bool has4 = TCOD_list_contains(intList,(const void *)4); // has4 == false + */ + bool contains(const T elt) const { + for ( T* curElt = begin(); curElt != end(); curElt ++) { + if ( *curElt == elt ) return true; + } + return false; + } + + /** + @PageName list_list + @PageFather list + @PageTitle Basic list operations + @FuncTitle Insert an element in the list + @Cpp template void TCODList::insertBefore(const T elt,int before) + @C void TCOD_list_insert_before(TCOD_list_t l,const void *elt,int before) + @Param elt Element to insert in the list. + @Param idx Index of the element after the insertion. + 0 <= idx < list size + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.set(0,5); // the list contains 1 element at position 0, value = 5 + intList.insertBefore(2,0); // the list contains 2 elements : 2,5 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,0,(const void *)5); + TCOD_list_insert_before(intList,(const void *)2,0); + */ + T * insertBefore(const T elt,int before) { + if ( fillSize+1 >= allocSize ) allocate(); + for (int idx=fillSize; idx > before; idx--) { + array[idx]=array[idx-1]; + } + array[before]=elt; + fillSize++; + return &array[before]; + } + + /** + @PageName list_list + @FuncTitle Removing an element from the list + @FuncDesc The _fast versions replace the element to remove with the last element of the list. They're faster, but do not preserve the list order. + @Cpp + template void TCODList::remove(const T elt) + template void TCODList::removeFast(const T elt) + @C + void TCOD_list_remove(TCOD_list_t l, const void * elt) + void TCOD_list_remove_fast(TCOD_list_t l, const void * elt) + @Param elt The element to remove + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.set(0,5); // the list contains 1 element at position 0, value = 5 + intList.remove(5); // the list is empty + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,0,(const void *)5); + TCOD_list_remove(intList,(const void *)5); + */ + void remove(const T elt) { + for ( T* curElt = begin(); curElt != end(); curElt ++) { + if ( *curElt == elt ) { + remove(curElt); + return; + } + } + } + void removeFast(const T elt) { + for ( T* curElt = begin(); curElt != end(); curElt ++) { + if ( *curElt == elt ) { + removeFast(curElt); + return; + } + } + } + + /** + @PageName list_list + @FuncTitle Concatenating two lists + @FuncDesc You can concatenate two lists. Every element of l2 will be added to current list (or l in the C version) : + @Cpp template void TCODList::addAll(const TCODList &l2) + @C void TCOD_list_add_all(TCOD_list_t l, TCOD_list_t l2) + @Param l The list inside which elements will be added. + @Param l2 the list handler containing elements to insert. + @CppEx + TCODList intList; + intList.set(1,3); // intList contains 2 elements : 0, 3 + TCODList intList2; // intList2 is empty + intList2.set(0,1); // intList2 contains 1 element : 1 + intList2.addAll(intList); // intList2 contains 3 elements : 1, 0, 3 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,1,(const void *)3); + TCOD_list_t intList2 = TCOD_list_new(); + TCOD_list_set(intList2,0,(const void *)1); + TCOD_list_add_all(intList2,intList); + */ + void addAll(const TCODList &l2) { + for (T *t=l2.begin(); t!= l2.end(); t++) { + push(*t); + } + } + + /** + @PageName list_list + @FuncTitle Emptying a list + @Cpp template void TCODList::clear() + @C void TCOD_list_clear(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; + intList.set(0,3); // intList contains 1 element + intList.clear(); // intList is empty + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_set(intList,0,(const void *)5); + TCOD_list_clear(intList); + */ + void clear() { + fillSize=0; + } + /** + @PageName list_list + @FuncTitle Emptying a list and destroying its elements + @FuncDesc For lists containing pointers, you can clear the list and delete (or free for C) the elements : + @Cpp template void TCODList::clearAndDelete() + @C void TCOD_list_clear_and_delete(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; + MyClass * cl=new MyClass(); // new instance of MyClass allocated here + intList.set(0,cl); + intList.clear(); // the list is empty. cl is always valid + intList.set(0,cl); + intList.clearAndDelete(); // the list is empty. delete cl has been called. The address cl is no longer valid. + @C + TCOD_list_t intList = TCOD_list_new(); + void *data=calloc(10,1); // some memory allocation here + TCOD_list_set(intList,0,(const void *)data); + TCOD_list_clear(intList); // the list is empty, but data is always valid + TCOD_list_set(intList,0,(const void *)data); + TCOD_list_clear_and_delete(intList); // the list is empty, free(data) has been called. The address data is no longer valid + */ + void clearAndDelete() { + for ( T* curElt = begin(); curElt != end(); curElt ++ ) { + delete (*curElt); + } + fillSize=0; + } + + /** + @PageName list_list + @FuncTitle Reversing a list + @FuncDesc This function reverses the order of the elements in the list.
    + @Cpp + void TCODList::reverse() + @C + void TCOD_list_reverse(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.push(5); // the list contains 1 element at position 0, value = 5 + intList.push(2); // the list contains 2 elements : 5,2 + intList.reverse(); // now order is 2,5 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)5); + TCOD_list_push(intList,(const void *)2); + TCOD_list_reverse(); + */ + void reverse() { + T* head = begin(); + T* tail = end(); + while ( head < tail ) { + T tmp = *head; + *head=*tail; + *tail=tmp; + head++; + tail--; + } + } + + /** + @PageName list_stack + @PageTitle Basic stack operations + @PageFather list + @FuncTitle Pushing an element on the stack + @FuncDesc You can push an element on the stack (append it to the end of the list) : + @Cpp template void TCODList::push(const T elt) + @C void TCOD_list_push(TCOD_list_t l, const void * elt) + @Param elt Element to append to the list. + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.push(5); // the list contains 1 element at position 0, value = 5 + intList.push(2); // the list contains 2 elements : 5,2 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)5); + TCOD_list_push(intList,(const void *)2); + */ + void push(const T elt) { + if ( fillSize+1 >= allocSize ) allocate(); + array[fillSize++] = elt; + } + + /** + @PageName list_stack + @FuncTitle Poping an element from the stack + @FuncDesc You can pop an element from the stack (remove the last element of the list). + @Cpp template T TCODList::pop() + @C void * TCOD_list_pop(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.push(5); // the list contains 1 element at position 0, value = 5 + intList.push(2); // the list contains 2 elements : 5,2 + int val = intList.pop(); // val == 2, the list contains 1 element : 5 + val = intList.pop(); // val == 5, the list is empty + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)5); + TCOD_list_push(intList,(const void *)2); + int val = (int)TCOD_list_pop(intList); + val = (int)TCOD_list_pop(intList); + */ + T pop() { + if ( fillSize == 0 ) return (T)0; + return array[--fillSize]; + } + + /** + @PageName list_stack + @FuncTitle Peeking the last element of the stack + @FuncDesc You can read the last element of the stack without removing it : + @Cpp template T TCODList::peek() const + @C void * TCOD_list_peek(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; + intList.push(3); // intList contains 1 elements : 3 + int val = intList.peek(); // val == 3, inList contains 1 elements : 3 + intList.push(2); // intList contains 2 elements : 3, 2 + val = intList.peek(); // val == 2, inList contains 2 elements : 3, 2 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)3); + int val = (int)TCOD_list_peek(intList); + TCOD_list_push(intList,(const void *)2); + val = (int)TCOD_list_peek(intList); + */ + T peek() const { + if ( fillSize == 0 ) return (T)0; + return array[fillSize-1]; + } + + /** + @PageName list_iterator + @PageFather list + @PageTitle Iterators + @FuncDesc You can iterate through the elements of the list using an iterator. begin() returns the address of the first element of the list. You go to the next element using the increment operator ++. When the iterator's value is equal to end(), you've gone through all the elements. Warning ! You cannot insert elements in the list while iterating through it. Inserting elements can result in reallocation of the list and your iterator will not longer be valid. + @Cpp + template T * TCODList::begin() const + template T * TCODList::end() const + @C + void ** TCOD_list_begin(TCOD_list_t l) + void ** TCOD_list_end(TCOD_list_t l) + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.push(5); // the list contains 1 element at position 0, value = 5 + intList.push(2); // the list contains 2 elements : 5,2 + for ( int * iterator = intList.begin(); iterator != intList.end(); iterator ++ ) { + int currentValue=*iterator; + printf("value : %d\n", currentValue ); + } + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)5); + TCOD_list_push(intList,(const void *)2); + for ( int * iterator = (int *)TCOD_list_begin(intList); iterator != (int *)TCOD_list_end(intList); iterator ++ ) { + int currentValue=*iterator; + printf("value : %d\n", currentValue ); + } + */ + T * begin() const { + if ( fillSize == 0 ) return (T *)NULL; + return &array[0]; + } + T * end() const { + if ( fillSize == 0 ) return (T *)NULL; + return &array[fillSize]; + } + + /** + @PageName list_iterator + @FuncDesc You can remove an element from the list while iterating. The element at the iterator position will be removed. The function returns the new iterator. The _fast versions replace the element to remove with the last element of the list. They're faster, but do not preserve the list order. + @Cpp + template T *TCODList::remove(T *iterator) + template T *TCODList::removeFast(T *iterator) + @C + void **TCOD_list_remove_iterator(TCOD_list_t l, void **iterator) + void **TCOD_list_remove_iterator_fast(TCOD_list_t l, void **iterator) + @Param iterator The list iterator. + @Param l In the C version, the list handler, returned by a constructor. + @CppEx + TCODList intList; // the list is empty (contains 0 elements) + intList.push(5); // the list contains 1 element at position 0, value = 5 + intList.push(2); // the list contains 2 elements : 5,2 + intList.push(3); // the list contains 3 elements : 5,2,3 + for ( int * iterator = intList.begin(); iterator != intList.end(); iterator ++ ) { + int currentValue=*iterator; + if ( currentValue == 2 ) { + // remove this value from the list and keep iterating on next element (value == 3) + iterator = intList.remove(iterator); + } + printf("value : %d\n", currentValue ); // all 3 values will be printed : 5,2,3 + } + // now the list contains only two elements : 5,3 + @CEx + TCOD_list_t intList = TCOD_list_new(); + TCOD_list_push(intList,(const void *)5); + TCOD_list_push(intList,(const void *)2); + TCOD_list_push(intList,(const void *)3); + for ( int * iterator = (int *)TCOD_list_begin(intList); iterator != (int *)TCOD_list_end(intList); iterator ++ ) { + int currentValue=*iterator; + if ( currentValue == 2 ) { + iterator = (int *)TCOD_list_remove_iterator(intList,(void **)iterator); + } + printf("value : %d\n", currentValue ); + } + */ + T *remove(T *elt) { + for ( T* curElt = elt; curElt < end()-1; curElt ++) { + *curElt = *(curElt+1); + } + fillSize--; + if ( fillSize == 0 ) return ((T *)NULL)-1; + else return elt-1; + } + T *removeFast(T *elt) { + *elt = array[fillSize-1]; + fillSize--; + if ( fillSize == 0 ) return ((T *)NULL)-1; + else return elt-1; + } + + TCODList & operator = (TCODList const & l2) { + while ( allocSize < l2.allocSize ) allocate(); + fillSize=l2.fillSize; + int i=0; + for (T *t=l2.begin(); t != l2.end(); t++) { + array[i++]=*t; + } + return *this; + } + +protected : + void allocate() { + int newSize = allocSize * 2; + if ( newSize == 0 ) newSize = 16; + T *newArray = new T[ newSize ]; + if ( array ) { + if ( fillSize > 0 ) memcpy(newArray, array, sizeof(T)*fillSize); + delete [] array; + } + array=newArray; + allocSize=newSize; + } +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/mersenne.h b/tcod/tcod_sys/libtcod/include/mersenne.h new file mode 100644 index 00000000..4668e190 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/mersenne.h @@ -0,0 +1,56 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_RANDOM_H +#define _TCOD_RANDOM_H + +#include "mersenne_types.h" + +typedef void *TCOD_random_t; + +TCODLIB_API TCOD_random_t TCOD_random_get_instance(void); +TCODLIB_API TCOD_random_t TCOD_random_new(TCOD_random_algo_t algo); +TCODLIB_API TCOD_random_t TCOD_random_save(TCOD_random_t mersenne); +TCODLIB_API void TCOD_random_restore(TCOD_random_t mersenne, TCOD_random_t backup); +TCODLIB_API TCOD_random_t TCOD_random_new_from_seed(TCOD_random_algo_t algo, uint32 seed); +TCODLIB_API void TCOD_random_delete(TCOD_random_t mersenne); + +TCODLIB_API void TCOD_random_set_distribution (TCOD_random_t mersenne, TCOD_distribution_t distribution); + +TCODLIB_API int TCOD_random_get_int (TCOD_random_t mersenne, int min, int max); +TCODLIB_API float TCOD_random_get_float (TCOD_random_t mersenne, float min, float max); +TCODLIB_API double TCOD_random_get_double (TCOD_random_t mersenne, double min, double max); + +TCODLIB_API int TCOD_random_get_int_mean (TCOD_random_t mersenne, int min, int max, int mean); +TCODLIB_API float TCOD_random_get_float_mean (TCOD_random_t mersenne, float min, float max, float mean); +TCODLIB_API double TCOD_random_get_double_mean (TCOD_random_t mersenne, double min, double max, double mean); + +TCODLIB_API TCOD_dice_t TCOD_random_dice_new (const char * s); +TCODLIB_API int TCOD_random_dice_roll (TCOD_random_t mersenne, TCOD_dice_t dice); +TCODLIB_API int TCOD_random_dice_roll_s (TCOD_random_t mersenne, const char * s); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/mersenne.hpp b/tcod/tcod_sys/libtcod/include/mersenne.hpp new file mode 100644 index 00000000..d6b3f6bb --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/mersenne.hpp @@ -0,0 +1,400 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_RANDOM_HPP +#define _TCOD_RANDOM_HPP + +#include "mersenne_types.h" + +/** + @PageName random + @PageCategory Base toolkits + @PageTitle Pseudorandom number generator + @PageDesc This toolkit is an implementation of two fast and high quality pseudorandom number generators: +* a Mersenne twister generator, +* a Complementary-Multiply-With-Carry generator. +CMWC is faster than MT (see table below) and has a much better period (1039460 vs. 106001). It is the default algo since libtcod 1.5.0. + +Relative performances in two independent tests (lower is better) : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AlgorithmNumbers generatedPerf (1)Perf (2)
    MTinteger6250
    MTfloat5445
    CMWCinteger2134
    CMWCfloat3227
    + +
    For python users:
    +Python already has great builtin random generators. But some parts of the Doryen library (noise, heightmap, ...) uses RNG as parameters. If you intend to use those functions, you must provide a RNG created with the library. + +
    For C# users:
    +.NET already has great builtin random generators. But some parts of the Doryen library (noise, heightmap, ...) uses RNG as parameters. If you intend to use those functions, you must provide a RNG created with the library. + */ + +class TCODLIB_API TCODRandom { + public : + /** + @PageName random_init + @PageFather random + @PageTitle Creating a generator + @FuncTitle Default generator + @FuncDesc The simplest way to get random number is to use the default generator. The first time you get this generator, it is initialized by calling TCOD_random_new. Then, on successive calls, this function returns the same generator (singleton pattern). + @Cpp static TCODRandom * TCODRandom::getInstance (void) + @C TCOD_random_t TCOD_random_get_instance (void) + @Py random_get_instance () + @C# static TCODRandom TCODRandom::getInstance() + @Param algo The PRNG algorithm the generator should be using. Possible values are: + * TCOD_RNG_MT for Mersenne Twister, + * TCOD_RNG_CMWC for Complementary Multiply-With-Carry. + */ + static TCODRandom * getInstance(void); + + /** + @PageName random_init + @FuncTitle Generators with random seeds + @FuncDesc You can also create as many generators as you want with a random seed (the number of seconds since Jan 1 1970 at the time the constructor is called). Warning ! If you call this function several times in the same second, it will return the same generator. + @Cpp TCODRandom::TCODRandom (TCOD_random_algo_t algo = TCOD_RNG_CMWC) + @C TCOD_random_t TCOD_random_new (TCOD_random_algo_t algo) + @Py random_new (algo = RNG_CMWC) + @C# + TCODRandom::TCODRandom() // Defaults to ComplementaryMultiplyWithCarry + TCODRandom::TCODRandom(TCODRandomType algo) + @Param algo The PRNG algorithm the generator should be using. + */ + TCODRandom(TCOD_random_algo_t algo = TCOD_RNG_CMWC, bool allocate = true); + + /** + @PageName random_init + @FuncTitle Generators with user defined seeds + @FuncDesc Finally, you can create generators with a specific seed. Those allow you to get a reproducible set of random numbers. You can for example save a dungeon in a file by saving only the seed used for its generation (provided you have a determinist generation algorithm) + @Cpp TCODRandom::TCODRandom (uint32 seed, TCOD_random_algo_t algo = TCOD_RNG_CMWC); + @C TCOD_random_t TCOD_random_new_from_seed (TCOD_random_algo_t algo, uint32 seed); + @Py random_new_from_seed(seed, algo=RNG_CMWC) + @C# + TCODRandom::TCODRandom(uint32 seed) // Defaults to ComplementaryMultiplyWithCarry + TCODRandom::TCODRandom(uint32 seed, TCODRandomType algo) + @Param seed The 32 bits seed used to initialize the generator. Two generators created with the same seed will generate the same set of pseudorandom numbers. + @Param algo The PRNG algorithm the generator should be using. + @CppEx + // default generator + TCODRandom * default = TCODRandom::getInstance(); + // another random generator + TCODRandom * myRandom = new TCODRandom(); + // a random generator with a specific seed + TCODRandom * myDeterministRandom = new TCODRandom(0xdeadbeef); + @CEx + // default generator + TCOD_random_t default = TCOD_random_get_instance(); + // another random generator + TCOD_random_t my_random = TCOD_random_new(TCOD_RNG_CMWC); + // a random generator with a specific seed + TCOD_random_t my_determinist_random = TCOD_random_new_from_seed(TCOD_RNG_CMWC,0xdeadbeef); + @PyEx + # default generator + default = libtcod.random_get_instance() + # another random generator + my_random = libtcod.random_new() + # a random generator with a specific seed + my_determinist_random = libtcod.random_new_from_seed(0xdeadbeef) + */ + TCODRandom(uint32 seed, TCOD_random_algo_t algo = TCOD_RNG_CMWC); + + /** + @PageName random_init + @FuncTitle Destroying a RNG + @FuncDesc To release ressources used by a generator, use those functions : + NB : do not delete the default random generator ! + @Cpp TCODRandom::~TCODRandom() + @C void TCOD_random_delete(TCOD_random_t mersenne) + @Py random_delete(mersenne) + @C# void TCODRandom::Dispose() + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. + @CppEx + // create a generator + TCODRandom *rnd = new TCODRandom(); + // use it + ... + // destroy it + delete rnd; + @CEx + // create a generator + TCOD_random_t rnd = TCOD_random_new(); + // use it + ... + // destroy it + TCOD_random_delete(rnd); + @PyEx + # create a generator + rnd = libtcod.random_new() + # use it + ... + # destroy it + libtcod.random_delete(rnd) + */ + virtual ~TCODRandom(); + + /** + @PageName random_distro + @PageFather random + @PageTitle Using a generator + @FuncTitle Setting the default RNG distribution + @FuncDesc Random numbers can be obtained using several different distributions. Linear is default, but if you wish to use one of the available Gaussian distributions, you can use this function to tell libtcod which is your preferred distribution. All random number getters will then use that distribution automatically to fetch your random numbers. +The distributions available are as follows: +1. TCOD_DISTRIBUTION_LINEAR +This is the default distribution. It will return a number from a range min-max. The numbers will be evenly distributed, ie, each number from the range has the exact same chance of being selected. +2. TCOD_DISTRIBUTION_GAUSSIAN +This distribution does not have minimum and maximum values. Instead, a mean and a standard deviation are used. The mean is the central value. It will appear with the greatest frequency. The farther away from the mean, the less the probability of appearing the possible results have. Although extreme values are possible, 99.7% of the results will be within the radius of 3 standard deviations from the mean. So, if the mean is 0 and the standard deviation is 5, the numbers will mostly fall in the (-15,15) range. +3. TCOD_DISTRIBUTION_GAUSSIAN_RANGE +This one takes minimum and maximum values. Under the hood, it computes the mean (which falls right between the minimum and maximum) and the standard deviation and applies a standard Gaussian distribution to the values. The difference is that the result is always guaranteed to be in the min-max range. +4. TCOD_DISTRIBUTION_GAUSSIAN_INVERSE +Essentially, this is the same as TCOD_DISTRIBUTION_GAUSSIAN. The difference is that the values near +3 and -3 standard deviations from the mean have the highest possibility of appearing, while the mean has the lowest. +5. TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE +Essentially, this is the same as TCOD_DISTRIBUTION_GAUSSIAN_RANGE, but the min and max values have the greatest probability of appearing, while the values between them, the lowest. + +There exist functions to also specify both a min-max range AND a custom mean, which can be any value (possibly either min or max, but it can even be outside that range). In case such a function is used, the distributions will trigger a slihtly different behaviour: +* TCOD_DISTRIBUTION_LINEAR +* TCOD_DISTRIBUTION_GAUSSIAN +* TCOD_DISTRIBUTION_GAUSSIAN_RANGE +In these cases, the selected mean will have the highest probability of appearing. + +* TCOD_DISTRIBUTION_GAUSSIAN_INVERSE +* TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE +In these cases, the selected mean will appear with the lowest frequency. + @Cpp void TCODRandom::setDistribution(TCOD_distribution_t distribution) + @C void TCOD_random_set_distribution(TCOD_random_t mersenne, TCOD_distribution_t distribution) + @Py + @C# + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. If NULL, the default generator is used.. + @Param distribution The distribution constant from the available set:
    • TCOD_DISTRIBUTION_LINEAR
    • TCOD_DISTRIBUTION_GAUSSIAN
    • TCOD_DISTRIBUTION_GAUSSIAN_RANGE
    • TCOD_DISTRIBUTION_GAUSSIAN_INVERSE
    • TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE
    + */ + inline void setDistribution (TCOD_distribution_t distribution) { TCOD_random_set_distribution(data,distribution); } + + /** + @PageName random_use + @PageFather random + @PageTitle Using a generator + @FuncTitle Getting an integer + @FuncDesc Once you obtained a generator (using one of those methods), you can get random numbers using the following functions, using either the explicit or simplified API where applicable: + @Cpp + //explicit API: + int TCODRandom::getInt(int min, int max, int mean = 0) + + //simplified API: + int TCODRandom::get(int min, int max, int mean = 0) + @C + int TCOD_random_get_int(TCOD_random_t mersenne, int min, int max) + int TCOD_random_get_int_mean(TCOD_random_t mersenne, int min, int max, int mean) + @Py + @C# + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. If NULL, the default generator is used.. + @Param min,max Range of values returned. Each time you call this function, you get a number between (including) min and max + @Param mean This is used to set a custom mean, ie, not min+((max-min)/2). It can even be outside of the min-max range. Using a mean will force the use of a weighted (Gaussian) distribution, even if linear is set. + */ + inline int getInt (int min, int max, int mean = 0) { return (mean <= 0) ? TCOD_random_get_int(data,min,max) : TCOD_random_get_int_mean(data,min,max,mean); } + inline int get (int min, int max, int mean = 0) { return (mean <= 0) ? TCOD_random_get_int(data,min,max) : TCOD_random_get_int_mean(data,min,max,mean); } + + /** + @PageName random_use + @FuncTitle Getting a float + @FuncDesc To get a random floating point number, using either the explicit or simplified API where applicable + @Cpp + //explicit API: + float TCODRandom::getFloat(float min, float max, float mean = 0.0f) + + //simplified API: + float TCODRandom::get(float min, float max, float mean = 0.0f) + @C + float TCOD_random_get_float(TCOD_random_t mersenne, float min, float max) + float TCOD_random_get_float_mean(TCOD_random_t mersenne, float min, float max, float mean) + @Py random_get_float(mersenne, mi, ma) + @C# float TCODRandom::getFloat(float min, float max) + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. If NULL, the default generator is used. + @Param min,max Range of values returned. Each time you call this function, you get a number between (including) min and max + @Param mean This is used to set a custom mean, ie, not min+((max-min)/2). It can even be outside of the min-max range. Using a mean will force the use of a weighted (Gaussian) distribution, even if linear is set. + @CppEx + // default generator + TCODRandom * default = TCODRandom::getInstance(); + int aRandomIntBetween0And1000 = default->getInt(0,1000); + int anotherRandomInt = default->get(0,1000); + // another random generator + TCODRandom *myRandom = new TCODRandom(); + float aRandomFloatBetween0And1000 = myRandom->getFloat(0.0f,1000.0f); + float anotherRandomFloat = myRandom->get(0.0f,1000.0f); + @CEx + // default generator + int a_random_int_between_0_and_1000 = TCOD_random_get_float(NULL,0,1000); + // another random generator + TCOD_random_t my_random = TCOD_random_new(); + float a_random_float_between_0_and_1000 = TCOD_random_get_float(my_random,0.0f,1000.0f); + @PyEx + # default generator + a_random_int_between_0_and_1000 = libtcod.random_get_float(0,0,1000) + # another random generator + my_random = libtcod.random_new() + a_random_float_between_0_and_1000 = libtcod.random_get_float(my_random,0.0,1000.0) + */ + inline float getFloat (float min, float max, float mean = 0.0f) { return (mean <= 0) ? TCOD_random_get_float(data,min,max) : TCOD_random_get_float_mean(data,min,max,mean); } + inline float get (float min, float max, float mean = 0.0f) { return (mean <= 0.0f) ? TCOD_random_get_float(data,min,max) : TCOD_random_get_float_mean(data,min,max,mean); } + + /** + @PageName random_use + @FuncTitle Getting a double + @FuncDesc To get a random double precision floating point number, using either the explicit or simplified API where applicable + @Cpp + //explicit API: + double TCODRandom::getDouble(double min, double max, double mean = 0.0f) + + //simplified API: + double TCODRandom::get(double min, double max, double mean = 0.0f) + @C + double TCOD_random_get_double(TCOD_random_t mersenne, double min, double max) + double TCOD_random_get_double_mean(TCOD_random_t mersenne, double min, double max, double mean) + @Py + @C# + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. If NULL, the default generator is used. + @Param min,max Range of values returned. Each time you call this function, you get a number between (including) min and max + @Param mean This is used to set a custom mean, ie, not min+((max-min)/2). It can even be outside of the min-max range. Using a mean will force the use of a weighted (Gaussian) distribution, even if linear is set. + @CppEx + // default generator + TCODRandom * default = TCODRandom::getInstance(); + int aRandomIntBetween0And1000 = default->getInt(0,1000); + int anotherRandomInt = default->get(0,1000); + // another random generator + TCODRandom *myRandom = new TCODRandom(); + float aRandomFloatBetween0And1000 = myRandom->getFloat(0.0f,1000.0f); + float anotherRandomFloat = myRandom->get(0.0f,1000.0f); + @CEx + // default generator + int a_random_int_between_0_and_1000 = TCOD_random_get_float(NULL,0,1000); + // another random generator + TCOD_random_t my_random = TCOD_random_new(); + float a_random_float_between_0_and_1000 = TCOD_random_get_float(my_random,0.0f,1000.0f); + @PyEx + # default generator + a_random_int_between_0_and_1000 = libtcod.random_get_float(0,0,1000) + # another random generator + my_random = libtcod.random_new() + a_random_float_between_0_and_1000 = libtcod.random_get_float(my_random,0.0,1000.0) + */ + inline double getDouble (double min, double max, double mean = 0.0) { return (mean <= 0) ? TCOD_random_get_double(data,min,max) : TCOD_random_get_double_mean(data,min,max,mean); } + inline double get (double min, double max, double mean = 0.0f) { return (mean <= 0.0) ? TCOD_random_get_double(data,min,max) : TCOD_random_get_double_mean(data,min,max,mean); } + + /** + @PageName random_use + @FuncTitle Saving a RNG state + @FuncDesc You can save the state of a generator with : + @Cpp TCODRandom *TCODRandom::save() const + @C TCOD_random_t TCOD_random_save(TCOD_random_t mersenne) + @Py random_save(mersenne) + @C# TCODRandom TCODRandom::save() + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. If NULL, the default generator is used. + */ + TCODRandom * save() const; + + /** + @PageName random_use + @FuncTitle Restoring a saved state + @FuncDesc And restore it later. This makes it possible to get the same serie of number several times with a single generator. + @Cpp void TCODRandom::restore(const TCODRandom *backup) + @C void TCOD_random_restore(TCOD_random_t mersenne, TCOD_random_t backup) + @Py random_restore(mersenne, backup) + @C# void TCODRandom::restore(TCODRandom backup) + @Param mersenne In the C and Python versions, the generator handler, returned by the initialization functions. If NULL, the default generator is used. + @CppEx + // default generator + TCODRandom * default = TCODRandom::getInstance(); + // save the state + TCODRandom *backup=default->save(); + // get a random number (or several) + int number1 = default->getInt(0,1000); + // restore the state + default->restore(backup); + // get a random number + int number2 = default->getInt(0,1000); + // => number1 == number2 + @CEx + // save default generator state + TCOD_random_t backup=TCOD_random_save(NULL); + // get a random number + int number1 = TCOD_random_get_float(NULL,0,1000); + // restore the state + TCOD_random_restore(NULL,backup); + // get a random number + int number2 = TCOD_random_get_float(NULL,0,1000); + // number1 == number2 + @PyEx + # save default generator state + backup=libtcod.random_save(0) + # get a random number + number1 = libtcod.random_get_float(0,0,1000) + # restore the state + libtcod.random_restore(0,backup) + # get a random number + number2 = libtcod.random_get_float(0,0,1000) + # number1 == number2 + */ + void restore(const TCODRandom *backup); + + //dice + inline TCOD_dice_t dice (const char * s) { return TCOD_random_dice_new(s); } + inline int diceRoll (TCOD_dice_t dice) { return TCOD_random_dice_roll(data,dice); } + inline int diceRoll (const char * s) { return TCOD_random_dice_roll(data,TCOD_random_dice_new(s)); } + + protected : + friend class TCODLIB_API TCODNoise; + friend class TCODLIB_API TCODHeightMap; + friend class TCODLIB_API TCODNamegen; + friend class TCODNameGenerator; // Used for SWIG interface, does NOT need TCODLIB_API + TCOD_random_t data; +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/mersenne_types.h b/tcod/tcod_sys/libtcod/include/mersenne_types.h new file mode 100644 index 00000000..1c21ca5e --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/mersenne_types.h @@ -0,0 +1,53 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_RANDOM_TYPES_H +#define _TCOD_RANDOM_TYPES_H + +/* dice roll */ +typedef struct { + int nb_rolls; + int nb_faces; + float multiplier; + float addsub; +} TCOD_dice_t; + +/* PRNG algorithms */ +typedef enum { + TCOD_RNG_MT, + TCOD_RNG_CMWC +} TCOD_random_algo_t; + +typedef enum { + TCOD_DISTRIBUTION_LINEAR, + TCOD_DISTRIBUTION_GAUSSIAN, + TCOD_DISTRIBUTION_GAUSSIAN_RANGE, + TCOD_DISTRIBUTION_GAUSSIAN_INVERSE, + TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE +} TCOD_distribution_t; + +#endif /* _TCOD_RANDOM_TYPES_H */ diff --git a/tcod/tcod_sys/libtcod/include/mouse.h b/tcod/tcod_sys/libtcod/include/mouse.h new file mode 100644 index 00000000..67abe280 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/mouse.h @@ -0,0 +1,39 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_MOUSE_H +#define _TCOD_MOUSE_H + +#include "mouse_types.h" + +TCODLIB_API void TCOD_mouse_show_cursor(bool visible); +TCODLIB_API TCOD_mouse_t TCOD_mouse_get_status(); +TCODLIB_API bool TCOD_mouse_is_cursor_visible(); +TCODLIB_API void TCOD_mouse_move(int x, int y); +TCODLIB_API void TCOD_mouse_includes_touch(bool enable); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/mouse.hpp b/tcod/tcod_sys/libtcod/include/mouse.hpp new file mode 100644 index 00000000..48aa7ebe --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/mouse.hpp @@ -0,0 +1,76 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_MOUSE_HPP +#define _TCOD_MOUSE_HPP + +#include "mouse_types.h" + +class TCODLIB_API TCODMouse { +public : + /** + @PageName mouse + @PageTitle Mouse support + @PageCategory Base toolkits + @FuncTitle Display and hide the mouse cursor + @FuncDesc By default, the mouse cursor in visible in windowed mode, hidden in fullscreen mode. You can change it with: + @Cpp static void TCODMouse::showCursor (bool visible) + @C void TCOD_mouse_show_cursor (bool visible) + @Py mouse_show_cursor (visible) + @C# void TCODMouse::showCursor(bool visible) + @Param visible If true, this function turns the mouse cursor on. Else it turns the mouse cursor off. + */ + static void showCursor(bool visible); + + /** + @PageName mouse + @FuncTitle Getting the cursor status + @FuncDesc You can get the current cursor status (hidden or visible) with: + @Cpp static bool TCODMouse::isCursorVisible (void) + @C bool TCOD_mouse_is_cursor_visible (void) + @Py mouse_is_cursor_visible () + @C# bool TCODMouse::isCursorVisible() + */ + static bool isCursorVisible(); + + /** + @PageName mouse + @FuncTitle Setting the mouse cursor's position + @FuncDesc You can set the cursor position (in pixel coordinates, where [0,0] is the window's top left corner) with: + @Cpp static void TCODMouse::move (int x, int y) + @C void TCOD_mouse_move (int x, int y) + @Py mouse_move (x, y) + @C# void TCODMouse::moveMouse(int x, int y) + @Param x,y New coordinates of the mouse cursor in pixels. + */ + static void move(int x, int y); + + /* deprecated as of 1.5.1 */ + static TCOD_mouse_t getStatus(); +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/mouse_types.h b/tcod/tcod_sys/libtcod/include/mouse_types.h new file mode 100644 index 00000000..a1ca7a04 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/mouse_types.h @@ -0,0 +1,47 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_MOUSE_TYPES_H +#define _TCOD_MOUSE_TYPES_H + +/* mouse data */ +typedef struct { + int x,y; /* absolute position */ + int dx,dy; /* movement since last update in pixels */ + int cx,cy; /* cell coordinates in the root console */ + int dcx,dcy; /* movement since last update in console cells */ + bool lbutton ; /* left button status */ + bool rbutton ; /* right button status */ + bool mbutton ; /* middle button status */ + bool lbutton_pressed ; /* left button pressed event */ + bool rbutton_pressed ; /* right button pressed event */ + bool mbutton_pressed ; /* middle button pressed event */ + bool wheel_up ; /* wheel up event */ + bool wheel_down ; /* wheel down event */ +} TCOD_mouse_t; + +#endif /* _TCOD_MOUSE_TYPES_H */ diff --git a/tcod/tcod_sys/libtcod/include/namegen.h b/tcod/tcod_sys/libtcod/include/namegen.h new file mode 100644 index 00000000..7524e000 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/namegen.h @@ -0,0 +1,49 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* Mingos' NameGen +* This file was written by Dominik "Mingos" Marczuk. +*/ + +#ifndef _TCOD_NAMEGEN_H +#define _TCOD_NAMEGEN_H + +/* the generator typedef */ +typedef void * TCOD_namegen_t; + +/* parse a file with syllable sets */ +TCODLIB_API void TCOD_namegen_parse (const char * filename, TCOD_random_t random); +/* generate a name */ +TCODLIB_API char * TCOD_namegen_generate (char * name, bool allocate); +/* generate a name using a custom generation rule */ +TCODLIB_API char * TCOD_namegen_generate_custom (char * name, char * rule, bool allocate); +/* retrieve the list of all available syllable set names */ +TCODLIB_API TCOD_list_t TCOD_namegen_get_sets (void); +/* delete a generator */ +TCODLIB_API void TCOD_namegen_destroy (void); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/namegen.hpp b/tcod/tcod_sys/libtcod/include/namegen.hpp new file mode 100644 index 00000000..da1e5dd0 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/namegen.hpp @@ -0,0 +1,290 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* Mingos' NameGen +* This file was written by Dominik "Mingos" Marczuk. +*/ + +#ifndef _TCOD_NAMEGEN_HPP +#define _TCOD_NAMEGEN_HPP + +/** + @PageName namegen + @PageCategory Roguelike toolkits + @PageTitle Name generator + @PageDesc This tool allows to generate random names out of custom made syllable sets. + */ +class TCODLIB_API TCODNamegen { + public: + /** + @PageName namegen_init + @PageFather namegen + @PageTitle Creating a generator + @FuncDesc In order to be able to generate names, the name generator needs to be fed proper data. It will then be ready to generate random names defined in the file(s) it is fed. Syllable set parsing is achieved via the following. + Note 1: Each file will be parsed once only. If, for some reason, you would like to parse the same file twice, you will need to destroy the generator first, which will empty the list of parsed files along with erasing all the data retrieved from those files. + + Note 2: The generator can be fed data multiple times if you have it in separate files. Just make sure the structure names in them aren't duplicated, otherwise they will be silently ignored. + + Note 3: In the C++ version, you are not obliged to specify the random number generator. If you skip it in the function call, the generator will assume you would like to use an instance of the default generator. + + @Cpp static void TCODNamegen::parse (const char * filename, TCODRandom * random = NULL) + @C void TCOD_namegen_parse (const char * filename, TCOD_random_t random) + @Py namegen_parse (filename, random = 0) + @C# + static void TCODNameGenerator::parse(string filename) + static void TCODNameGenerator::parse(string filename, TCODRandom random) + @Param filename The file where the desired syllable set is saved, along with its relative parh, for instance, "data/names.txt". + @Param random A random number generator object. Use NULL for the default random number generator + @CppEx + TCODNamegen::parse("data/names.txt",TCODRandom::getInstance()); + TCODNamegen::parse("data/names2.txt"); + @CEx TCOD_namegen_parse("data/names.txt",TCOD_random_get_instance()); + @PyEx libtcod.namegen_parse('data/names.txt') + */ + static void parse (const char * filename, TCODRandom * random = NULL); + + /** + @PageName namegen_init + @FuncTitle Destroying a generator + @FuncDesc To release the resources used by a name generator, you may call: + This will free all memory used by the generator. In order to generate a name again, you have to parse a file again. + @Cpp static void TCODNamegen::destroy (void) + @C void TCOD_namegen_destroy (void) + @Py namegen_destroy () + @C# static void TCODNameGenerator::destroy() + */ + static void destroy (void); + + /** + @PageName namegen_generate + @PageTitle Generating a name + @PageFather namegen + @FuncTitle Generating a default name + @FuncDesc The following will output a random name generated using one of the generation rules specified in the syllable set: + Should you choose to allocate memory for the output, you need to remember to deallocate it once you don't need the name anymore using the free() function. This applies to C++ as well (delete won't work - you have to use free()). + + On the other hand, should you choose not to allocate memory, be aware that subsequent calls will overwrite the previously returned pointer, so make sure to copy the output using strcpy(), strdup() or other means of your choosing. + + The name you specify needs to be in one of the files the generator has previously parsed (see Creating a generator). If such a name doesn't exist, a warning will be displayed and NULL will be returned. + @Cpp static char * TCODNamegen::generate (char * name, bool allocate = false) + @C char * TCOD_namegen_generate (char * name, bool allocate) + @Py namegen_generate (name, allocate = 0) + @C# string TCODNameGenerator::generate (string name) + @Param name The structure name you wish to refer to, for instance, "celtic female". + For more about how structure names work, please refer to those chapters. + @Param allocate Whether memory should be allocated for the output or not. + @CppEx + TCODNamegen::parse("data/names.txt",TCODRandom::getInstance()); + char * myName = TCODNamegen::generate("fantasy female"); + @CEx + TCOD_namegen_parse("data/names.txt",TCOD_random_get_instance()); + char * my_name = TCOD_namegen_generate("Celtic male",false); + @PyEx + libtcod.namegen_parse('data/names.txt') + name = libtcod.namegen_generate('Nordic female') + */ + static char * generate (char * name, bool allocate = false); + + /** + @PageName namegen_generate + @FuncTitle Generating a custom name + @FuncDesc It is also possible to generate a name using custom generation rules. This overrides the random choice of a generation rule from the syllable set. Please refer to chapter 16.5 to learn about the name generation rules syntax. + @Cpp static char * TCODNamegen::generateCustom (char * name, char * rule, bool allocate = false) + @C char * TCOD_namegen_generate_custom (char * name, char * rule, bool allocate) + @Py namegen_generate_custom (name, rule, allocate = 0) + @C# string TCODNameGenerator::generateCustom (string name, string rule) + @Param name The structure name you wish to refer to, for instance, "celtic female". + For more about how structure names work, please refer to those chapters. + @Param rule The name generation rule. See this chapter for more details. + @Param allocate Whether memory should be allocated for the output or not. + @CppEx + TCODNamegen::parse("data/names.txt",TCODRandom::getInstance()); + char * myName = TCODNamegen::generateCustom("Nordic male","$s$e"); + @CEx + TCOD_namegen_parse("data/names.txt",TCOD_random_get_instance()); + char * my_name = TCOD_namegen_generate_custom("Mesopotamian female","$s$e",false); + @PyEx + libtcod.namegen_parse('data/names.txt') + name = libtcod.namegen_generate_custom('Nordic female','$s$e') + */ + static char * generateCustom (char * name, char * rule, bool allocate = false); + + /** + @PageName namegen_generate + @FuncTitle Retrieving available set names + @FuncDesc If you wish to check the sylable set names that are currently available, you may call: + This will create a list with all the available syllable set names. Remember to delete that list after you don't need it anymore! + @Cpp static TCODList TCODNamegen::getSets () + @C TCOD_list_t TCOD_namegen_get_sets () + @Py namegen_get_sets () + @C# static IEnumerable TCODNameGenerator::getSets() + */ + static TCOD_list_t getSets (void); + + /** + @PageName namegen_file + @PageFather namegen + @PageTitle Syllable set configuration + @PageDesc Configuring the syllable set is vital to obtaining high quality randomly generated names. Please refer to the following subchapters for detailed information: + */ + + /** + @PageName namegen_file_1 + @PageFather namegen_file + @PageTitle Syllable set basic structure + @PageDesc The syllable sets need to be written in one or more text files that will be opened and parsed by the generator. + +The data uses a standard TCODParser file and data should be inserted according to the general rules of creating a configuration file. For more information, please refer to The libtcod config file format. + +The structure type that's defined in the generator is "name". This structure type must also be accompanied by a structure name. It will be used for identification purposes in the generator. For instance, if you use a structure name "fantasy female", you will be able to access this syllable set by creating a generator using "fantasy female" syllables. In the initialisation function, this is the "const char * name" argument. + +The structure contains different members, all of which must be of TCOD_TYPE_STRING type. The tokens inside the strings, be them phonemes or syllables, form a single string, but are separated with separator characters. Characters used for token separation are all characters that are not Latin upper- or lowercase characters, dashes or apostrophes. A comma, a space or a comma+space are all perfectly valid, human-readable separators. In order to use a character inside a string that would normally be considered a separator, precede it with a slash (eg. "/:", "/.", "/!", etc.). An exception to this rule is the space character, which can also be achieved by using an underscore (eg. "the_Great"). + +The structure members that may thus be defined are: +

    phonemesVocals +phonemesConsonants +syllablesPre +syllablesStart +syllablesMiddle +syllablesEnd +syllablesPost +

    + +All of those strings are considered optional. However, if you don't define a string, but reference it in the name generation rules, you will see a warning displayed on stderr about missing data. + */ + + /** + @PageName namegen_file_2 + @PageFather namegen_file + @PageTitle Illegal strings + @PageDesc Another optional property is +

    illegal

    + +This property contains strings that are considered illegal and thus not desired in your names. Should a generated name contain any of the tokens specified in this string, it will be discarded and replaced by a new one. Illegal strings may be as short as single characters or as long as entire names. However, it is best to create a syllable set that generates very few names that sound bad. Otherwise, the illegal list might become very long. + +Be aware that the generator will automatically correct or reject certain words, so you don't need to place every undesired possibility in this string. + +The generator will correct the following: + + * leading spaces ("_NAME") + * ending spaces ("NAME_") + * double spaces ("NAME1__NAME2") + +It will generate a new name in the following cases: + + * triple characters ("Raaagnar") + * two-character adjacent repetitions ("Bobofur" is wrong, but "Bombofur" is OK) + * three-character (or more) repetitions, whether adjacent or not ("Bombombur", "Dagbjoerdag", "Gwaerdygwaern") + +Remember that all of this is case-insensitive, so you don't need to care about uppercase/lowercase distinction in your illegal strings. + */ + + /** + @PageName namegen_file_3 + @PageFather namegen_file + @PageTitle Rules + @PageDesc There's one last string that's contained within the structure: +

    rules

    + +It is mandatory, so not defining it will trigger an error. It defines how the generator should join the supplied data in order to generate a name. This string uses a syntax of its own, which is also used when specifying a rule when generating a custom name (see chapter 16.2). + +The rules are parsed pretty much the same way as all other strings, so all rules regarding separators and special characters apply as well. However, you can additionally use a set of wildcards and frequency markers. Each wildcard is preceded by the dollar sign ('$'), while frequency markers are preceded by the per cent sign ('%'). Here's the complete wildcard list: + + + + + + + + + + + + + +
    WildcardExampleDescription
    $[INT]P$P, $25PUse a random Pre syllable.
    The optional integer value denotes the per cent chance of adding the syllable.
    $[INT]s$s, $25sUse a random Start syllable.
    $[INT]m$m, $25mUse a random Middle syllable.
    $[INT]e$e, $25eUse a random End syllable.
    $[INT]p$p, $25pUse a random Post syllable.
    $[INT]v$v, $25vUse a random vocal.
    $[INT]c$c, $25cUse a random consonant.
    $[INT]?$?, $25?Use a random phoneme (vocal or consonant).
    %INT%50, %25Frequency marker. Denotes the per cent chance for the rule to be accepted if it's picked.
    If the rule is not accepted, another roll is made to choose a name generation rule.
    It's used to reduce the frequency a given rule is chosen with.
    This marker may only appear at the beginning of a rule.
    + */ + + /** + @PageName namegen_file_4 + @PageFather namegen_file + @PageTitle Example structure + @PageDesc Consider this example structure. It does not contain syllables, but rather full names. +

    name "king" { + syllablesStart = "Alexander, Augustus, Casimir, Henry, John, Louis, Sigismund," + "Stanislao, Stephen, Wenceslaus" + syllablesMiddle = "I, II, III, IV, V" + syllablesEnd = "Bathory, Herman, Jogaila, Lambert, of_Bohemia, of_France," + "of_Hungary, of_Masovia, of_Poland, of_Valois, of_Varna, Probus," + "Spindleshanks, Tanglefoot, the_Bearded, the_Black, the_Bold, the_Brave," + "the_Chaste, the_Curly, the_Elbow-high, the_Exile, the_Great," + "the_Jagiellonian, the_Just, the_Old, the_Pious, the_Restorer, the_Saxon," + "the_Strong, the_Wheelwright, the_White, Vasa, Wrymouth" + rules = "%50$s, $s_$m, $s_$50m_$e" +}

    + +The above structure only uses three syllable lists and has three different rules. Let's analyse them one by one. + +%50$s - this will simply output a random Start syllable, but this rule is not intended to be picked with the same frequency as the others, so the frequency marker at the beginning ("%50") ensures that 50% of the time this syllable will be rejected and a different one will be picked. + +$s_$m - this will output a Start syllable and a Middle syllable, separated with a space. + +$s_$50m_$e - This will output a Start syllable, followed by a Middle syllable, followed by an End sylable, all separated with spaces. However, the Middle syllable has only 50% chance of appearing at all, so 50% of the time the rule will actually produce a Start syllable followed directly by an End syllable, separated with a space. + +As you may have noticed, the third rule may produce a double space if the Middle syllable is not chosen. You do not have to worry about such cases, as the generator will automatically reduce all double spaces to single spaces, and leading/ending spaces will be removed completely. + +Output from this example set would contain kings' names based on the names of real monarchs of Poland. Have a look at the sample: +

    Alexander IV +Alexander +Sigismund +Stanislao V +Stanislao +Henry I of Poland +Augustus V +Stanislao I the Pious +Sigismund IV the Brave +John the Great +Henry the Old +John the Bold +Stanislao II the Saxon +Wenceslaus of France +John Probus +Louis V +Wenceslaus Lambert +Stanislao Spindleshanks +Henry Herman +Alexander the Old +Louis V the Curly +Wenceslaus II +Augustus IV +Alexander V +Augustus Probus +

    + */ +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/noise.h b/tcod/tcod_sys/libtcod/include/noise.h new file mode 100644 index 00000000..f3339d50 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/noise.h @@ -0,0 +1,56 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_PERLIN_H +#define _TCOD_PERLIN_H + +typedef void *TCOD_noise_t; + +typedef enum { + TCOD_NOISE_PERLIN = 1, + TCOD_NOISE_SIMPLEX = 2, + TCOD_NOISE_WAVELET = 4, + TCOD_NOISE_DEFAULT = 0 +} TCOD_noise_type_t; + +#include "noise_defaults.h" + +/* create a new noise object */ +TCODLIB_API TCOD_noise_t TCOD_noise_new(int dimensions, float hurst, float lacunarity, TCOD_random_t random); + +/* simplified API */ +TCODLIB_API void TCOD_noise_set_type (TCOD_noise_t noise, TCOD_noise_type_t type); +TCODLIB_API float TCOD_noise_get_ex (TCOD_noise_t noise, float *f, TCOD_noise_type_t type); +TCODLIB_API float TCOD_noise_get_fbm_ex (TCOD_noise_t noise, float *f, float octaves, TCOD_noise_type_t type); +TCODLIB_API float TCOD_noise_get_turbulence_ex (TCOD_noise_t noise, float *f, float octaves, TCOD_noise_type_t type); +TCODLIB_API float TCOD_noise_get (TCOD_noise_t noise, float *f); +TCODLIB_API float TCOD_noise_get_fbm (TCOD_noise_t noise, float *f, float octaves); +TCODLIB_API float TCOD_noise_get_turbulence (TCOD_noise_t noise, float *f, float octaves); +/* delete the noise object */ +TCODLIB_API void TCOD_noise_delete(TCOD_noise_t noise); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/noise.hpp b/tcod/tcod_sys/libtcod/include/noise.hpp new file mode 100644 index 00000000..4c7cbd00 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/noise.hpp @@ -0,0 +1,323 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_PERLIN_HPP +#define _TCOD_PERLIN_HPP + +#include "noise_defaults.h" + +/** + @PageName noise + @PageCategory Base toolkits + @PageTitle Noise generator + @PageDesc This toolkit provides several functions to generate Perlin noise and other derived noises. It can handle noise functions from 1 to 4 dimensions. + @FuncDesc + Usage example: + 1D noise : the variation of a torch intensity + 2D fbm : heightfield generation or clouds + 3D fbm : animated smoke + If you don't know what is Perlin noise and derived functions, or what is the influence of the different fractal parameters, check the Perlin noise sample included with the library. + + + + + + + + + + + + + +
    Simplex noise, fbm, turbulence
    Perlin noise, fbm, turbulence
    Wavelet noise, fbm, turbulence
    +
    Noise functions relative times
    + + For example, in 4D, Perlin noise is 17 times slower than simplex noise. + + + + + +
    1D2D3D4D
    simplex1111
    Perlin1.34517
    wavelet533214X
    + */ +class TCODLIB_API TCODNoise { + public : + /** + @PageName noise_init + @PageFather noise + @PageTitle Creating a noise generator + @FuncDesc Those functions initialize a noise generator from a number of dimensions (from 1 to 4), some fractal parameters and a random number generator. + The C++ version provides several constructors. When the hurst and lacunarity parameters are omitted, default values (TCOD_NOISE_DEFAULT_HURST = 0.5f and TCOD_NOISE_DEFAULT_LACUNARITY = 2.0f) are used. + @Cpp + TCODNoise::TCODNoise(int dimensions, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + TCODNoise::TCODNoise(int dimensions, TCODRandom *random, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + TCODNoise::TCODNoise(int dimensions, float hurst, float lacunarity, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + TCODNoise::TCODNoise(int dimensions, float hurst, float lacunarity, TCODRandom *random, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + @C TCOD_noise_t TCOD_noise_new(int dimensions, float hurst, float lacunarity, TCOD_random_t random) + @Py noise_new(dimensions, hurst=TCOD_NOISE_DEFAULT_HURST, lacunarity=TCOD_NOISE_DEFAULT_LACUNARITY, random=0) + @C# + TCODNoise::TCODNoise(int dimensions) + TCODNoise::TCODNoise(int dimensions, TCODRandom random) + TCODNoise::TCODNoise(int dimensions, float hurst, float lacunarity) + TCODNoise::TCODNoise(int dimensions, float hurst, float lacunarity, TCODRandom random) + @Param dimensions From 1 to 4. + @Param hurst For fractional brownian motion and turbulence, the fractal Hurst exponent. You can use the default value TCOD_NOISE_DEFAULT_HURST = 0.5f. + @Param lacunarity For fractional brownian motion and turbulence, the fractal lacunarity. You can use the default value TCOD_NOISE_DEFAULT_LACUNARITY = 2.0f. + @Param random A random number generator obtained with the Mersenne twister toolkit or NULL to use the default random number generator. + @CppEx + // 1 dimension generator + TCODNoise * noise1d = new TCODNoise(1); + // 2D noise with a predefined random number generator + TCODRandom *myRandom = new TCODRandom(); + TCODNoise *noise2d = new TCODNoise(2,myRandom); + // a 3D noise generator with a specific fractal parameters + TCODNoise *noise3d = new TCODNoise(3,0.7f,1.4f); + @CEx + // 1 dimension generator + TCOD_noise_t noise1d = TCOD_noise_new(1,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + // 2D noise with a predefined random number generator + TCOD_random_t my_random = TCOD_random_new(); + TCOD_noise_t noise2d = TCOD_noise_new(2,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,my_random); + // a 3D noise generator with a specific fractal parameters + TCOD_noise_t noise3d = TCOD_noise_new(3,0.7f, 1.4f,NULL); + @PyEx + # 1 dimension generator + noise1d = libtcod.noise_new(1) + # 2D noise with a predefined random number generator + my_random = libtcod.random_new(); + noise2d = libtcod.noise_new(2,libtcod.NOISE_DEFAULT_HURST, libtcod.NOISE_DEFAULT_LACUNARITY,my_random) + # a 3D noise generator with a specific fractal parameters + noise3d = libtcod.noise_new(3, 0.7, 1.4) + */ + TCODNoise(int dimensions, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + TCODNoise(int dimensions, TCODRandom *random, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + TCODNoise(int dimensions, float hurst, float lacunarity, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + TCODNoise(int dimensions, float hurst, float lacunarity, TCODRandom *random, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + + /** + @PageName noise_init + @FuncDesc To release ressources used by a generator, use those functions : + @Cpp TCODNoise::~TCODNoise() + @C void TCOD_noise_delete(TCOD_noise_t noise) + @Py noise_delete(noise) + @C# void TCODNoise::Dispose() + @Param noise In the C and python versions, the generator handler, returned by the initialization function. + @CppEx + // create a generator + TCODNoise *noise = new TCODNoise(2); + // use it + ... + // destroy it + delete noise; + @CEx + // create a generator + TCOD_noise_t noise = TCOD_noise_new(2,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAUT_LACUNARITY, NULL); + // use it + ... + // destroy it + TCOD_noise_delete(noise); + @PyEx + # create a generator + noise = libtcod.noise_new(2,litbcod.NOISE_DEFAULT_HURST, litbcod.NOISE_DEFAUT_LACUNARITY, 0) + # use it + ... + # destroy it + litbcod.noise_delete(noise) + */ + virtual ~TCODNoise(); + + /** + @PageName noise_setType + @PageFather noise + @PageTitle Choosing a noise type + @FuncTitle Choosing a noise type + @FuncDesc Use this function to define the default algorithm used by the noise functions. + The default algorithm is simplex. It's much faster than Perlin, especially in 4 dimensions. It has a better contrast too. + @Cpp void TCODNoise::setType(TCOD_noise_type_t type) + @C void TCOD_noise_set_type(TCOD_noise_t noise, TCOD_noise_type_t type) + @Py noise_set_type(noise, type) + @C# void TCODNoise::setType(type) + @Param noise In the C version, the generator handler, returned by the initialization function. + @Param type The algorithm to use, either TCOD_NOISE_SIMPLEX, TCOD_NOISE_PERLIN or TCOD_NOISE_WAVELET. + @CppEx + TCODNoise * noise1d = new TCODNoise(1); + noise1d->setType(TCOD_NOISE_PERLIN); + @CEx + TCOD_noise_t noise1d = TCOD_noise_new(1,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + TCOD_noise_set_type(noise1d,TCOD_NOISE_PERLIN); + @PyEx + noise1d = libtcod.noise_new(1) + libtcod.noise_set_type(noise1d,libtcod.NOISE_PERLIN) + */ + void setType (TCOD_noise_type_t type); + /** + @PageName noise_get + @PageFather noise + @PageTitle Getting flat noise + @FuncDesc This function returns the noise function value between -1.0 and 1.0 at given coordinates. + @Cpp float TCODNoise::get(float *f, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + @C float TCOD_noise_get(TCOD_noise_t noise, float *f) +float TCOD_noise_get_ex(TCOD_noise_t noise, float *f, TCOD_noise_type_t type) + @Py noise_get(noise, f, type=NOISE_DEFAULT) + @C# float TCODNoise::get(float[] f, type=NoiseDefault) + @Param noise In the C version, the generator handler, returned by the initialization function. + @Param f An array of coordinates, depending on the generator dimensions (between 1 and 4). The same array of coordinates will always return the same value. + @Param type The algorithm to use. If not defined, use the default one (set with setType or simplex if not set) + @CppEx + // 1d noise + TCODNoise * noise1d = new TCODNoise(1); + float p=0.5f; + // get a 1d simplex value + float value = noise1d->get(&p); + // 2d noise + TCODNoise * noise2d = new TCODNoise(2); + float p[2]={0.5f,0.7f}; + // get a 2D Perlin value + float value = noise2d->get(p, TCOD_NOISE_PERLIN); + @CEx + // 1d noise + TCOD_noise_t noise1d = TCOD_noise_new(1,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + float p=0.5f; + // get a 1d simplex value + float value = TCOD_noise_get(noise1d,&p); + // 2d noise + TCOD_noise_t noise2d = TCOD_noise_new(2,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + float p[2]={0.5f,0.7f}; + // get a 2d perlin value + float value = TCOD_noise_get_ex(noise2d,p,TCOD_NOISE_PERLIN); + @PyEx + # 1d noise + noise1d = libtcod.noise_new(1) + # get a 1d simplex value + value = libtcod.noise_get(noise1d,[0.5]) + # 2d noise + noise2d = libtcod.noise_new(2) + # get a 2d perlin value + value = libtcod.noise_get(noise2d,[0.5,0.7], libtcod.NOISE_PERLIN) + */ + float get(float *f, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + /** + @PageName noise_get_fbm + @PageFather noise + @PageTitle Getting fbm noise + @FuncDesc This function returns the fbm function value between -1.0 and 1.0 at given coordinates, using fractal hurst and lacunarity defined when the generator has been created. + @Cpp float TCODNoise::getFbm(float *f, float octaves, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + @C float TCOD_noise_get_fbm(TCOD_noise_t noise, float *f, float octaves) +float TCOD_noise_get_fbm(TCOD_noise_t noise, float *f, float octaves, TCOD_noise_type_t type) + @Py noise_get_fbm(noise, f, octaves, type=NOISE_DEFAULT) + @C# float TCODNoise::getBrownianMotion(float[] f, float octaves, type=NoiseDefault) + @Param noise In the C version, the generator handler, returned by the initialization function. + @Param f An array of coordinates, depending on the generator dimensions (between 1 and 4). The same array of coordinates will always return the same value. + @Param octaves Number of iterations. Must be < TCOD_NOISE_MAX_OCTAVES = 128 + @Param type The algorithm to use. If not defined, use the default one (set with setType or simplex if not set) + @CppEx + // 1d fbm + TCODNoise * noise1d = new TCODNoise(1); + float p=0.5f; + // get a 1d simplex fbm + float value = noise1d->getFbm(&p,32.0f); + // 2d fbm + TCODNoise * noise2d = new TCODNoise(2); + float p[2]={0.5f,0.7f}; + // get a 2d perlin fbm + float value = noise2d->getFbm(p,32.0f, TCOD_NOISE_PERLIN); + @CEx + // 1d fbm + TCOD_noise_t noise1d = TCOD_noise_new(1,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + float p=0.5f; + // get a 1d simplex fbm + float value = TCOD_noise_get_fbm(noise1d,&p,32.0f); + // 2d fbm + TCOD_noise_t noise2d = TCOD_noise_new(2,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + float p[2]={0.5f,0.7f}; + // get a 2d perlin fbm + float value = TCOD_noise_get_fbm_ex(noise2d,p,32.0f,TCOD_NOISE_PERLIN); + @PyEx + # 1d noise + noise1d = libtcod.noise_new(1) + # 1d simplex fbm + value = libtcod.noise_get_fbm(noise1d,[0.5],32.0) + # 2d noise + noise2d = libtcod.noise_new(2) + # 2d perlin fbm + value = libtcod.noise_get_fbm(noise2d,[0.5,0.7],32.0, libtcod.NOISE_PERLIN) + */ + float getFbm(float *f, float octaves, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + /** + @PageName noise_get_turbulence + @PageFather noise + @PageTitle Getting turbulence + @FuncDesc This function returns the turbulence function value between -1.0 and 1.0 at given coordinates, using fractal hurst and lacunarity defined when the generator has been created. + @Cpp float TCODNoise::getTurbulence(float *f, float octaves, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT) + @C float TCOD_noise_get_turbulence(TCOD_noise_t noise, float *f, float octaves) +float TCOD_noise_get_turbulence_ex(TCOD_noise_t noise, float *f, float octaves, TCOD_noise_type_t) + @Py noise_get_turbulence(noise, f, octaves, type=NOISE_DEFAULT) + @C# float TCODNoise::getTurbulence(float[] f, float octaves, type=NoiseDefault) + @Param noise In the C version, the generator handler, returned by the initialization function. + @Param f An array of coordinates, depending on the generator dimensions (between 1 and 4). The same array of coordinates will always return the same value. + @Param octaves Number of iterations. Must be < TCOD_NOISE_MAX_OCTAVES = 128 + @CppEx + // 1d fbm + TCODNoise * noise1d = new TCODNoise(1); + float p=0.5f; + // a 1d simplex turbulence + float value = noise1d->getTurbulence(&p,32.0f); + // 2d fbm + TCODNoise * noise2d = new TCODNoise(2); + float p[2]={0.5f,0.7f}; + // a 2d perlin turbulence + float value = noise2d->getTurbulence(p,32.0f, TCOD_NOISE_PERLIN); + @CEx + // 1d fbm + TCOD_noise_t noise1d = TCOD_noise_new(1,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + float p=0.5f; + // a 1d simplex turbulence + float value = TCOD_noise_get_turbulence(noise1d,&p,32.0f); + // 2d fbm + TCOD_noise_t noise2d = TCOD_noise_new(2,TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + float p[2]={0.5f,0.7f}; + // a 2d perlin turbulence + float value = TCOD_noise_get_turbulence_ex(noise2d,p,32.0f, TCOD_NOISE_PERLIN); + @PyEx + # 1d noise + noise1d = libtcod.noise_new(1) + # 1d simplex turbulence + value = libtcod.noise_get_turbulence(noise1d,[0.5],32.0) + # 2d noise + noise2d = libtcod.noise_new(2) + # 2d perlin turbulence + value = libtcod.noise_get_turbulence(noise2d,[0.5,0.7],32.0,libtcod.NOISE_PERLIN) + */ + float getTurbulence(float *f, float octaves, TCOD_noise_type_t type = TCOD_NOISE_DEFAULT); + + protected : + friend class TCODLIB_API TCODHeightMap; + TCOD_noise_t data; +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/noise_defaults.h b/tcod/tcod_sys/libtcod/include/noise_defaults.h new file mode 100644 index 00000000..41a02fe7 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/noise_defaults.h @@ -0,0 +1,9 @@ +#ifndef _TCOD_NOISE_DEFAULTS +#define _TCOD_NOISE_DEFAULTS + +#define TCOD_NOISE_MAX_OCTAVES 128 +#define TCOD_NOISE_MAX_DIMENSIONS 4 +#define TCOD_NOISE_DEFAULT_HURST 0.5f +#define TCOD_NOISE_DEFAULT_LACUNARITY 2.0f + +#endif /* _TCOD_NOISE_DEFAULTS */ diff --git a/tcod/tcod_sys/libtcod/include/parser.h b/tcod/tcod_sys/libtcod/include/parser.h new file mode 100644 index 00000000..07f17083 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/parser.h @@ -0,0 +1,171 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_PARSER_H +#define _TCOD_PARSER_H + +/* generic type */ +typedef enum { + TCOD_TYPE_NONE, + TCOD_TYPE_BOOL, + TCOD_TYPE_CHAR, + TCOD_TYPE_INT, + TCOD_TYPE_FLOAT, + TCOD_TYPE_STRING, + TCOD_TYPE_COLOR, + TCOD_TYPE_DICE, + TCOD_TYPE_VALUELIST00, + TCOD_TYPE_VALUELIST01, + TCOD_TYPE_VALUELIST02, + TCOD_TYPE_VALUELIST03, + TCOD_TYPE_VALUELIST04, + TCOD_TYPE_VALUELIST05, + TCOD_TYPE_VALUELIST06, + TCOD_TYPE_VALUELIST07, + TCOD_TYPE_VALUELIST08, + TCOD_TYPE_VALUELIST09, + TCOD_TYPE_VALUELIST10, + TCOD_TYPE_VALUELIST11, + TCOD_TYPE_VALUELIST12, + TCOD_TYPE_VALUELIST13, + TCOD_TYPE_VALUELIST14, + TCOD_TYPE_VALUELIST15, + TCOD_TYPE_CUSTOM00, + TCOD_TYPE_CUSTOM01, + TCOD_TYPE_CUSTOM02, + TCOD_TYPE_CUSTOM03, + TCOD_TYPE_CUSTOM04, + TCOD_TYPE_CUSTOM05, + TCOD_TYPE_CUSTOM06, + TCOD_TYPE_CUSTOM07, + TCOD_TYPE_CUSTOM08, + TCOD_TYPE_CUSTOM09, + TCOD_TYPE_CUSTOM10, + TCOD_TYPE_CUSTOM11, + TCOD_TYPE_CUSTOM12, + TCOD_TYPE_CUSTOM13, + TCOD_TYPE_CUSTOM14, + TCOD_TYPE_CUSTOM15, + TCOD_TYPE_LIST=1024 +} TCOD_value_type_t; + +/* generic value */ +typedef union { + bool b; + char c; + int32 i; + float f; + char *s; + TCOD_color_t col; + TCOD_dice_t dice; + TCOD_list_t list; + void *custom; +} TCOD_value_t; + +/* parser structures */ +typedef void *TCOD_parser_struct_t; +TCODLIB_API const char *TCOD_struct_get_name(TCOD_parser_struct_t def); +TCODLIB_API void TCOD_struct_add_property(TCOD_parser_struct_t def, const char *name,TCOD_value_type_t type, bool mandatory); +TCODLIB_API void TCOD_struct_add_list_property(TCOD_parser_struct_t def, const char *name,TCOD_value_type_t type, bool mandatory); +TCODLIB_API void TCOD_struct_add_value_list(TCOD_parser_struct_t def,const char *name, const char **value_list, bool mandatory); +TCODLIB_API void TCOD_struct_add_value_list_sized(TCOD_parser_struct_t def,const char *name, const char **value_list, int size, bool mandatory); +TCODLIB_API void TCOD_struct_add_flag(TCOD_parser_struct_t def,const char *propname); +TCODLIB_API void TCOD_struct_add_structure(TCOD_parser_struct_t def,TCOD_parser_struct_t sub_structure); +TCODLIB_API bool TCOD_struct_is_mandatory(TCOD_parser_struct_t def,const char *propname); +TCODLIB_API TCOD_value_type_t TCOD_struct_get_type(TCOD_parser_struct_t def, const char *propname); + + +/* parser listener */ +typedef struct { + bool (*new_struct)(TCOD_parser_struct_t str,const char *name); + bool (*new_flag)(const char *name); + bool (*new_property)(const char *propname, TCOD_value_type_t type, TCOD_value_t value); + bool (*end_struct)(TCOD_parser_struct_t str, const char *name); + void (*error)(const char *msg); +} TCOD_parser_listener_t; + +/* a custom type parser */ +typedef TCOD_value_t (*TCOD_parser_custom_t)(TCOD_lex_t *lex, TCOD_parser_listener_t *listener, TCOD_parser_struct_t str, char *propname); + +/* the parser */ +typedef void *TCOD_parser_t; + +TCODLIB_API TCOD_parser_t TCOD_parser_new(); +TCODLIB_API TCOD_parser_struct_t TCOD_parser_new_struct(TCOD_parser_t parser, char *name); +TCODLIB_API TCOD_value_type_t TCOD_parser_new_custom_type(TCOD_parser_t parser,TCOD_parser_custom_t custom_type_parser); +TCODLIB_API void TCOD_parser_run(TCOD_parser_t parser, const char *filename, TCOD_parser_listener_t *listener); +TCODLIB_API void TCOD_parser_delete(TCOD_parser_t parser); +/* error during parsing. can be called by the parser listener */ +TCODLIB_API void TCOD_parser_error(const char *msg, ...); +/* default parser listener */ +TCODLIB_API bool TCOD_parser_has_property(TCOD_parser_t parser, const char *name); +TCODLIB_API bool TCOD_parser_get_bool_property(TCOD_parser_t parser, const char *name); +TCODLIB_API int TCOD_parser_get_char_property(TCOD_parser_t parser, const char *name); +TCODLIB_API int TCOD_parser_get_int_property(TCOD_parser_t parser, const char *name); +TCODLIB_API float TCOD_parser_get_float_property(TCOD_parser_t parser, const char *name); +TCODLIB_API const char * TCOD_parser_get_string_property(TCOD_parser_t parser, const char *name); +TCODLIB_API TCOD_color_t TCOD_parser_get_color_property(TCOD_parser_t parser, const char *name); +TCODLIB_API TCOD_dice_t TCOD_parser_get_dice_property(TCOD_parser_t parser, const char *name); +TCODLIB_API void TCOD_parser_get_dice_property_py(TCOD_parser_t parser, const char *name, TCOD_dice_t *dice); +TCODLIB_API void * TCOD_parser_get_custom_property(TCOD_parser_t parser, const char *name); +TCODLIB_API TCOD_list_t TCOD_parser_get_list_property(TCOD_parser_t parser, const char *name, TCOD_value_type_t type); + +/* parser internals (may be used by custom type parsers) */ +/* parser structures */ +typedef struct { + char *name; /* entity type name */ + /* list of flags */ + TCOD_list_t flags; + /* list of properties (name, type, mandatory) */ + TCOD_list_t props; + /* list of value lists */ + TCOD_list_t lists; + /* list of sub-structures */ + TCOD_list_t structs; +} TCOD_struct_int_t; +/* the parser */ +typedef struct { + /* list of structures */ + TCOD_list_t structs; + /* list of custom type parsers */ + TCOD_parser_custom_t customs[16]; + /* fatal error occured */ + bool fatal; + /* list of properties if default listener is used */ + TCOD_list_t props; +} TCOD_parser_int_t; +TCODLIB_API TCOD_value_t TCOD_parse_bool_value(); +TCODLIB_API TCOD_value_t TCOD_parse_char_value(); +TCODLIB_API TCOD_value_t TCOD_parse_integer_value(); +TCODLIB_API TCOD_value_t TCOD_parse_float_value(); +TCODLIB_API TCOD_value_t TCOD_parse_string_value(); +TCODLIB_API TCOD_value_t TCOD_parse_color_value(); +TCODLIB_API TCOD_value_t TCOD_parse_dice_value(); +TCODLIB_API TCOD_value_t TCOD_parse_value_list_value(TCOD_struct_int_t *def,int listnum); +TCODLIB_API TCOD_value_t TCOD_parse_property_value(TCOD_parser_int_t *parser, TCOD_parser_struct_t def, char *propname, bool list); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/parser.hpp b/tcod/tcod_sys/libtcod/include/parser.hpp new file mode 100644 index 00000000..0dcd8109 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/parser.hpp @@ -0,0 +1,672 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_PARSER_HPP +#define _TCOD_PARSER_HPP + +/** +@PageName parser +@PageTitle File parser +@PageCategory Base toolkits +@PageDesc This toolkit provides an easy way to parse complex text configuration files. It has two main advantages compared to a standard XML SAX parser: + * The configuration file format is more human readable than XML + * The parser knows some data types that it automatically converts to C variables (see Standard data types) +*/ + +/** +@PageName parser_format +@PageFather parser +@PageTitle The libtcod config file format +@FuncTitle Comments +@FuncDesc Your file can contain single line or multi-line comments : +
    // This is a single line comment
    +/*
    +   This is a
    +   multi-line comment
    +*/
    +
    +Multi-line comments can be nested : +
    /*
    +   This is a
    +   multi-line comment containing another
    +   /*
    +    multi-line
    +    comment
    +   */
    +*/
    +
    +The parser is not sensible to space characters, tabulations or carriage return except inside strings. +*/ +/** +@PageName parser_format +@FuncTitle Structures +@FuncDesc The libtcod config file format is basically a list of structures. A structure has a type, an optional name and contains properties. The type of the structure defines which properties are allowed / mandatory. +
    item_type "blade" {            // structure's type : 'item_type'. structure's name : 'blade'
    +	cost=300                   // an integer property
    +	weight=3.5                 // a float property
    +	deal_damage=true           // a boolean property
    +	damages="3d6+2"            // a dice property
    +	col="#FF0000"              // a color property, using #RRGGBB syntax
    +	damaged_color="128,96,96"  // another color property, using rrr,ggg,bbb syntax
    +	damage_type="slash"        // a string property
    +	description="This is a long"
    +	            "description." // a multi-line string property
    +	abstract                   // a flag (simplified boolean property)
    +        intList= [ 1,2,3 ]         // a list of int values
    +        floatList= [ 1.0,2,3.5 ]   // a list of float values
    +        stringList= [ "string1","string2","string3" ]         // a list of string values
    +}
    +
    +A structure can also contain other structures either of the same type, or structures of another type : +
    item_type "blade" {
    +	item_type "one-handed blades" {
    +		// the item_type "blade" contains another item_type named "one-handed blades"
    +	}
    +	item_type "two-handed blades" {
    +		// the item_type "blade" contains another item_type named "two-handed blades"
    +	}
    +	feature "damage" {
    +		// the item_type "blade" contains another structure, type "feature", name "damage"
    +	}
    +}
    +
    +Sometimes, you don't know the list of properties at compile-time. Fortunately, since libtcod 1.5.1, you can add auto-declaring properties in the file, using one of the type keywords : +
    item_type "blade" {
    +	bool deal_damage=true
    +	char character='D'
    +	int cost=300
    +	float weight=3.5
    +	string damage_type="slash"
    +	color col="#FF0000"
    +	dice damages="3d6+2"
    +	int[] intList= [ 1,2,3 ]
    +	float[] floatList= [ 1.0,2,3.5 ]
    +	string[] stringList= [ "string1","string2","string3" ]
    +}
    +
    +The properties declared with this syntax were not previously declared for the structure item_type. But since the type is specified, the parser won't reject them. Instead, it will add the property declaration to the structure dynamically (when it parses the file). +You can also dynamically create new structures and sub-structures with the struct keyword : +
    item_type "blade" {
    +    struct component {
    +	    string name="blade"
    +		float weight=1.0
    +	}
    +}
    +
    +With this syntax, you don't need to declare the "component" structure at all in the parser. It will be dynamically registered as the file is parsed. +*/ + +class TCODLIB_API TCODParser; +class TCODLIB_API TCODParserStruct; +class TCODLIB_API ITCODParserListener; + +class TCODLIB_API TCODParser { +public : + /** + @PageName parser_str + @PageTitle Defining the file syntax + @PageFather parser + @FuncTitle Creating a parser + @FuncDesc Use this function to create a generic parser. Then you'll specialize this parser by defining the structures it can read. + @Cpp TCODParser::TCODParser() + @C TCOD_parser_t TCOD_parser_new() + @Py parser_new() + */ + TCODParser(); + + /** + @PageName parser_str + @FuncTitle Registering a new structure type + @Cpp TCODParserStruct *TCODParser::newStructure(const char *name) + @C TCOD_parser_struct_t TCOD_parser_new_struct(TCOD_parser_t parser, char *name) + @Py parser_new_struct(parser, name) + @Param parser In the C version, the parser handler, returned by TCOD_parser_new. + @Param name The name of the structure type (in the example, this would be "item_type"). + @CppEx + TCODParser parser(); + TCODParserStruct *itemTypeStruct = parser.newStructrue("item_type"); + @CEx + TCOD_parser_t parser = TCOD_parser_new(); + TCOD_parser_struct_t item_type_struct = TCOD_parser_new_struct(parser, "item_type"); + @PyEx + parser=libtcod.parser_new() + item_type_struct = libtcod.parser_new_struct(parser, "item_type") + */ + TCODParserStruct *newStructure(const char *name); + + // register a new custom type + TCOD_value_type_t newCustomType(TCOD_parser_custom_t custom_type_parser); + + /** + @PageName parser_run + @PageFather parser + @PageTitle Running the parser + @FuncTitle Running the parser + @FuncDesc Once you defined all the structure types and created your listener, you can start the actual parsing of the file : + @Cpp void TCODParser::run(const char *filename, ITCODParserListener *listener = NULL) + @C void TCOD_parser_run(TCOD_parser_t parser, const char *filename, TCOD_parser_listener_t *listener) + @Py parser_run(parser, filename, listener=0) + @Param parser In the C version, the parser handler, returned by TCOD_parser_new. + @Param filename The name of the text file to parse, absolute or relative to current directory. + @Param listener The listener containing the callbacks. Use NULL for the default listener + @Cpp myParser.run("config.txt",new MyListener()); + @C TCOD_parser_run(my_parser,"config.txt", my_listener); + @Py libtcod.parser_run(my_parser,"config.txt", MyListener()) + */ + void run(const char *filename, ITCODParserListener *listener = NULL); + + /** + @PageName parser_run + @FuncTitle Destroying the parser + @FuncDesc Once you've done with the file parsing, you can release the resources used by the parser : + @Cpp TCODParser::~TCODParser() + @C void TCOD_parser_delete(TCOD_parser_t parser) + @Py parser_delete(parser) + @Param parser In the C version, the parser handler, returned by TCOD_parser_new. + */ + + // error during parsing. can be called by the parser listener + void error(const char *msg, ...); +#ifdef TCOD_VISUAL_STUDIO + // silly stuff to avoid VS warning + #pragma warning(disable: 4251) +#endif + TCODList defs; +#ifdef TCOD_VISUAL_STUDIO + // restore warning again + #pragma warning(default: 4251) +#endif + + bool hasProperty(const char *name) const; + bool getBoolProperty(const char *name) const; + int getIntProperty(const char *name) const; + int getCharProperty(const char *name) const; + float getFloatProperty(const char *name) const; + TCODColor getColorProperty(const char *name) const; + TCOD_dice_t getDiceProperty(const char *name) const; + const char * getStringProperty(const char *name) const; + void * getCustomProperty(const char *name) const; + TCOD_list_t getListProperty(const char *name, TCOD_value_type_t type) const; +private : + bool parseEntity(TCODParserStruct *def, ITCODParserListener *listener); + TCOD_parser_t data; +}; + +// a parser structure +class TCODLIB_API TCODParserStruct { +public : + /** + @PageName parser_str + @FuncTitle Adding a new flag + @FuncDesc Use this function to add a flag property to a structure type. A flag is a simplified boolean property. It cannot be mandatory: either it's present and it's true, or it's absent and it's false.
    Note that in the C++ version, the function returns its parent object, allowing for chaining. + @Cpp TCODParserStruct* TCODParserStruct::addFlag(const char *name) + @C void TCOD_struct_add_flag(TCOD_parser_struct_t str,char *name) + @Py struct_add_flag(str,name) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param name The name of the flag (in the example, this would be "abstract"). + @CppEx itemTypeStruct->addFlag("abstract")->addFlag("static"); + @CEx TCOD_struct_add_flag(item_type_struct, "abstract"); + @PyEx libtcod.struct_add_flag(item_type_struct, "abstract") + */ + TCODParserStruct* addFlag(const char *propname); + + /** + @PageName parser_str + @FuncTitle Adding a new property + @FuncDesc Use this function to add a standard property to a structure type. Check standard property types here.
    Note that in the C++ version, the function returns its parent object, allowing for chaining. + @Cpp TCODParserStruct* TCODParserStruct::addProperty(const char *name, TCOD_value_type_t type, bool mandatory) + @C void TCOD_struct_add_property(TCOD_parser_struct_t str, char *name, TCOD_value_type_t type, bool mandatory) + @Py struct_add_property(str, name, type, mandatory) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param name The name of the property (in the example, this would be "cost" or "damage" or ...). + @Param type The type of the property. It can be a standard type (see this). + @Param mandatory Is this property mandatory? If true and the property is not defined in the file, the parser will raise an error. + @CppEx + itemTypeStruct->addProperty("cost",TCOD_TYPE_INT,true) + ->addProperty("weight",TCOD_TYPE_FLOAT,true) + ->addProperty("deal_damage",TCOD_TYPE_BOOL,true) + ->addProperty("damaged_color",TCOD_TYPE_COLOR,true); + @CEx + TCOD_struct_add_property(item_type_struct, "cost", TCOD_TYPE_INT, true); + TCOD_struct_add_property(item_type_struct, "damages", TCOD_TYPE_DICE, true); + TCOD_struct_add_property(item_type_struct, "color", TCOD_TYPE_COLOR, true); + TCOD_struct_add_property(item_type_struct, "damaged_color", TCOD_TYPE_COLOR, true); + @PyEx + libtcod.struct_add_property(item_type_struct, "cost", libtcod.TYPE_INT, True) + libtcod.struct_add_property(item_type_struct, "damages", libtcod.TYPE_DICE, True) + libtcod.struct_add_property(item_type_struct, "color", libtcod.TYPE_COLOR, True) + libtcod.struct_add_property(item_type_struct, "damaged_color", libtcod.TYPE_COLOR, True) + */ + TCODParserStruct* addProperty(const char *propname, TCOD_value_type_t type, bool mandatory); + + /** + @PageName parser_str + @FuncTitle Adding a new value-list property + @FuncDesc A value-list property is a string property for which we define the list of allowed values. The parser will raise an error if the file contains an unauthorized value for this property. + The first value-list property that you add to a structure type will have the TCOD_TYPE_VALUELIST00 type. The next TCOD_TYPE_VALUELIST01. You can define up to 16 value list property for each structure type. The last one has the type TCOD_TYPE_VALUELIST15. + You must provide a value list as a NULL terminated array of strings.
    Note that in the C++ version, the function returns its parent object, allowing for chaining. + @Cpp TCODParserStruct* TCODParserStruct::addValueList(const char *name, const char **value_list, bool mandatory) + @C void TCOD_struct_add_value_list(TCOD_parser_struct_t str, char *name, char **value_list, bool mandatory) + @Py struct_add_value_list(str, name, value_list, mandatory) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param name The name of the property (in the example, this would be "damage_type"). + @Param value_list The list of allowed strings. + @Param mandatory Is this property mandatory ? If true and the property is not defined in the file, the parser will raise an error. + @CppEx + static const char *damageTypes[] = { "slash", "pierce", "bludgeon", NULL }; // note the ending NULL + itemTypeStruct->addValueList("damage_type", damageTypes, true); + @CEx + static const char *damage_types[] = { "slash", "pierce", "bludgeon", NULL }; + TCOD_struct_add_value_list(item_type_struct, "damage_type", damage_types, true); + @PyEx + damage_types = [ "slash", "pierce", "bludgeon" ] + litbcod.struct_add_value_list(item_type_struct, "damage_type", damage_types, True) + */ + TCODParserStruct* addValueList(const char *propname, const char **value_list, bool mandatory); + + /** + @PageName parser_str + @FuncTitle Adding a new list property + @FuncDesc Use this function to add a list property to a structure type.
    Note that in the C++ version, the function returns its parent object, allowing for chaining. + @Cpp TCODParserStruct* TCODParserStruct::addListProperty(const char *name, TCOD_value_type_t type, bool mandatory) + @C void TCOD_struct_add_list_property(TCOD_parser_struct_t str, char *name, TCOD_value_type_t type, bool mandatory) + @Py struct_add_list_property(str, name, type, mandatory) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param name The name of the property (in the example, this would be "cost" or "damages" or ...). + @Param type The type of the list elements. It must be a standard type (see this). It cannot be TCOD_TYPE_LIST. + @Param mandatory Is this property mandatory ? If true and the property is not defined in the file, the parser will raise an error. + @CppEx + itemTypeStruct->addListProperty("intList",TCOD_TYPE_INT,true) + ->addListProperty("floatList",TCOD_TYPE_FLOAT,true) + ->addListProperty("stringList",TCOD_TYPE_STRING,true); + @CEx + TCOD_struct_add_list_property(item_type_struct, "intList", TCOD_TYPE_INT, true); + TCOD_struct_add_list_property(item_type_struct, "floatList", TCOD_TYPE_FLOAT, true); + TCOD_struct_add_list_property(item_type_struct, "stringList", TCOD_TYPE_STRING, true); + @PyEx + libtcod.struct_add_list_property(item_type_struct, "intList", libtcod.TYPE_INT, True) + libtcod.struct_add_list_property(item_type_struct, "floatList", libtcod.TYPE_FLOAT, True) + libtcod.struct_add_list_property(item_type_struct, "stringList", libtcod.TYPE_STRING, True) + */ + TCODParserStruct* addListProperty(const char *propname, TCOD_value_type_t type, bool mandatory); + + /** + @PageName parser_str + @FuncTitle Adding a sub-structure + @FuncDesc A structure can contain others structures. You can tell the parser which structures are allowed inside one structure type with this function.
    Note that in the C++ version, the function returns its parent object, allowing for chaining. + @Cpp TCODParserStruct* TCODParserStruct::addStructure(TCODParserStruct *sub_structure) + @C void TCOD_struct_add_structure(TCOD_parser_struct_t str, TCOD_parser_struct_t sub_structure) + @Py struct_add_structure(str, sub_structure) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param sub_structure The structure type that can be embedded. + @CppEx + // The item_type structure can contain itself + itemTypeStruct->addStructure(itemTypeStruct); + @CEx TCOD_struct_add_value_list(item_type_struct, item_type_struct); + @PyEx libtcod.struct_add_value_list(item_type_struct, item_type_struct) + */ + TCODParserStruct* addStructure(TCODParserStruct *sub_entity); + + /** + @PageName parser_str + @FuncTitle Getting a structure type's name + @FuncDesc You can retrieve the name of the structure type with these functions. Warning ! Do not confuse the structure type's name with the structure's name : +

    item_type "sword" { ... }

    + Here, the structure type's name is "item_type", the structure name is "sword". Obviously, the structure name cannot be retrieved from the TCODParserStruct object because it's only known at "runtime" (while parsing the file). + @Cpp const char *TCODParserStruct::getName() const + @C const char *TCOD_struct_get_name(TCOD_parser_struct_t str) + @Py struct_get_name(str) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @CppEx const char *structName = itemTypeStruct->getName(); // returns "item_type" + @CEx const char *struct_name = TCOD_struct_get_name(item_type_struct); + @PyEx struct_name = libtcod.struct_get_name(item_type_struct) + */ + const char *getName() const; + + /** + @PageName parser_str + @FuncTitle Checking if a property is mandatory + @FuncDesc You can know if a property is mandatory : + @Cpp bool TCODParserStruct::isPropertyMandatory(const char *name) const + @C bool TCOD_struct_is_mandatory(TCOD_parser_struct_t str,const char *name) + @Py struct_is_mandatory(str,name) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param name The name of the property, as defined when you called addProperty or addValueList or addListProperty. + @CppEx bool costMandatory = itemTypeStruct->isPropertyMandatory("cost"); + @CEx bool cost_mandatory = TCOD_struct_is_mandatory(item_type_struct, "cost"); + @PyEx cost_mandatory = libtcod.struct_is_mandatory(item_type_struct, "cost") + */ + bool isPropertyMandatory(const char *propname) const; + + /** + @PageName parser_str + @FuncTitle Retrieving the type of a property + @FuncDesc You get the type of a property : + In the case of a list property, the value returned is a bitwise or of TCOD_TYPE_LIST and the list element's type. For example, for a list of int, it will return TCOD_TYPE_LIST | TCOD_TYPE_INT. + @Cpp TCOD_value_type_t TCODParserStruct::getPropertyType(const char *name) const + @C TCOD_value_type_t TCOD_struct_get_type(TCOD_parser_struct_t str, const char *name) + @Py struct_get_type(str, name) + @Param str In the C version, the structure handler, returned by TCOD_parser_new_struct. + @Param name The name of the property, as defined when you called addProperty or addValueList or addListProperty. + @CppEx + TCOD_value_type_t costType = itemTypeStruct->getPropertyType("cost"); // returns TCOD_TYPE_INT + TCOD_value_type_t intListType = itemTypeStruct->getPropertyType("intList"); // returns TCOD_TYPE_LIST|TCOD_TYPE_INT + @CEx TCOD_value_type_t cost_type = TCOD_struct_get_type(item_type_struct, "cost"); + @PyEx cost_type = libtcod.struct_get_type(item_type_struct, "cost") + */ + TCOD_value_type_t getPropertyType(const char *propname) const; + +// private stuff + TCOD_parser_struct_t data; +}; + +/** + @PageName parser_run + @FuncTitle Creating a listener + @FuncDesc For basic config files, you don't have to write a listener. Instead, use the default listener. The parser uses a SAX-like approach during the parsing of the file. This means that the whole file is not stored in memory in a tree structure. Instead, it works like a stream parser and raises events. Each event has an associated callback that is provided by a listener : + @Cpp + class ITCODParserListener { + public : + virtual bool parserNewStruct(TCODParser *parser,const TCODParserStruct *str,const char *name)=0; + virtual bool parserFlag(TCODParser *parser,const char *name)=0; + virtual bool parserProperty(TCODParser *parser,const char *name, TCOD_value_type_t type, TCOD_value_t value)=0; + virtual bool parserEndStruct(TCODParser *parser,const TCODParserStruct *str, const char *name)=0; + virtual void error(const char *msg) = 0; + }; + @C + typedef struct { + bool (*new_struct)(TCOD_parser_struct_t str,const char *name); + bool (*new_flag)(const char *name); + bool (*new_property)(const char *name, TCOD_value_type_t type, TCOD_value_t value); + bool (*end_struct)(TCOD_parser_struct_t str, const char *name); + void (*error)(const char *msg); + } TCOD_parser_listener_t; + @Py + class ParserListener : + def new_struct(str,name) : ... + def new_flag(name) : ... + def new_property(name,type,value) : ... + def end_struct(self, struct, name) : ... + def error(msg) : ... +*/ +/** + @PageName parser_run + @FuncDesc Before running the parser, you have to build a listener : + @Cpp + class MyListener : public ITCODParserListener { + bool parserNewStruct(TCODParser *parser,const TCODParserStruct *str,const char *name) { + printf ("new structure type '%s' with name '%s'\n",str->getname(),name ? name : "NULL"); + return true; + } + bool parserFlag(TCODParser *parser,const char *name) { + printf ("found new flag '%s'\n",name); + return true; + } + bool parserProperty(TCODParser *parser,const char *name, TCOD_value_type_t type, TCOD_value_t value) { + printf ("found new property '%s'\n",name); + return true; + } + bool parserEndStruct(TCODParser *parser,const TCODParserStruct *str,const char *name) { + printf ("end of structure type '%s'\n",name); + return true; + } + void error(char *msg) { + fprintf(stderr,msg); + exit(1); + } + }; + @C + bool my_parser_new_struct(TCOD_parser_struct_t str, const char *name) { + printf ("new structure type '%s' with name '%s'\n",TCOD_struct_get_name(str),name ? name : "NULL"); + return true; + } + bool my_parser_flag(const char *name) { + printf ("found new flag '%s'\n",name); + return true; + } + bool my_parser_property(const char *name, TCOD_value_type_t type, TCOD_value_t value) { + printf ("found new property '%s'\n",name); + return true; + } + bool my_parser_end_struct(TCOD_parser_struct_t str, const char *name) { + printf ("end of structure type '%s'\n",name); + return true; + } + void my_parser_error(const char *msg) { + fprintf(stderr,msg); + exit(1); + } + TCOD_parser_listener_t my_listener = { + my_parser_new_struct, + my_parser_flag, + my_parser_property, + my_parser_end_struct, + my_parser_error + }; + @Py + class MyListener: + def new_struct(self, struct, name): + print 'new structure type', libtcod.struct_get_name(struct), + ' named ', name + return True + def new_flag(self, name): + print 'new flag named ', name + return True + def new_property(self,name, typ, value): + type_names = ['NONE', 'BOOL', 'CHAR', 'INT', 'FLOAT', 'STRING', + 'COLOR', 'DICE'] + if typ == libtcod.TYPE_COLOR : + print 'new property named ', name,' type ',type_names[typ], + ' value ', value.r, value.g, value.b + elif typ == libtcod.TYPE_DICE : + print 'new property named ', name,' type ',type_names[typ], + ' value ', value.nb_rolls, value.nb_faces, + value.multiplier, value.addsub + else: + print 'new property named ', name,' type ',type_names[typ], + ' value ', value + return True + def end_struct(self, struct, name): + print 'end structure type', libtcod.struct_get_name(struct), + ' named ', name + return True + def error(self,msg): + print 'error : ', msg + return True + */ + +// sax event listener +class TCODLIB_API ITCODParserListener { +public : + virtual ~ITCODParserListener(){} + /** + @PageName parser_run + @FuncTitle Handling 'newStruct' events + @FuncDesc This callback is called each time the parser find a new structure declaration in the file. Example : +
    item_type "blade" { // <= newStruct event here
    +	...
    +}
    +
    +It must return true if everything is right, false if there is an error and the parser must exit. + @Cpp bool ITCODParserListener::parserNewStruct(TCODParser *parser,TCODParserStruct *str,const char *name) + @C bool new_struct(TCOD_parser_struct_t str,const char *name) + @Py new_struct(str,name) + @Param parser In the C++ version, the parser object, returned by TCODParser constructor. It's used for error handling. + @Param str The structure type. Can be used to retrieve the type's name with getName. In the example above, this would be "item_type". + @Param name The name of the structure or NULL if no name is present in the file. In the example above, this would be "blade". + */ + virtual bool parserNewStruct(TCODParser *parser,const TCODParserStruct *str,const char *name)=0; + + /** + @PageName parser_run + @FuncTitle Handling 'newFlag' events + @FuncDesc This callback is called each time the parser find a new flag in the file. Example : +
    item_type "blade" {
    +	abstract  // <= newFlag event here
    +}
    +
    +It must return true if everything is right, false if there is an error and the parser must exit. + @Cpp bool ITCODParserListener::parserFlag(TCODParser *parser,const char *name) + @C bool new_flag(const char *name) + @Py new_flag(name) + @Param parser In the C++ version, the parser object, returned by TCODParser constructor. It's used for error handling. + @Param name The name of the flag. In the example, this would be "abstract". + */ + virtual bool parserFlag(TCODParser *parser,const char *name)=0; + + /** + @PageName parser_run + @FuncTitle Handling 'newProperty' events + @FuncDesc This callback is called each time the parser find a new property in the file. Example : +
    item_type "blade" {
    +	abstract
    +	cost=300 // <= newProperty event here
    +}
    +
    +It must return true if everything is right, false if there is an error and the parser must exit. + @Cpp bool ITCODParserListener::parserProperty(TCODParser *parser,const char *name, TCOD_value_type_t type, TCOD_value_t value) + @C bool new_property(const char *name, TCOD_value_type_t type, TCOD_value_t value) + @Py new_property(name,type,value) + @Param parser In the C++ version, the parser object, returned by TCODParser constructor. It's used for error handling. + @Param name The name of the property. In the example, this would be "cost". + @Param type The type of the property as defined when you called addProperty or addValueList. In the example, this would be TCOD_TYPE_INT. + @Param value The value of the property, stored in a generic value structure. In the example, we would have value.i == 300. +In the case of a value-list property, the type would reflect the list id (between TCOD_TYPE_VALUELIST00 and TCOD_TYPE_VALUELIST15) and value.s would contain the actual string. + */ + virtual bool parserProperty(TCODParser *parser,const char *propname, TCOD_value_type_t type, TCOD_value_t value)=0; + + /** + @PageName parser_run + @FuncTitle Handling 'endStruct' events + @FuncDesc This callback is called each time the parser find the end of a structure declaration in the file. Example : +
    item_type "blade" {
    +	...
    +} // <= endStruct event here
    +
    +It must return true if everything is right, false if there is an error and the parser must exit. + @Cpp bool ITCODParserListener::parserEndStruct(TCODParser *parser,TCODParserStruct *str,const char *name) + @C bool end_struct(TCOD_parser_struct_t str,const char *name) + @Py end_struct(str,name) + @Param parser In the C++ version, the parser object, returned by TCODParser constructor. It's used for error handling. + @Param str The structure type. Can be used to retrieve the type's name with getName. In the example above, this would be "item_type". + @Param name The name of the structure or NULL if no name is present in the file. In the example above, this would be "blade". + */ + virtual bool parserEndStruct(TCODParser *parser,const TCODParserStruct *str, const char *name)=0; + + /** + @PageName parser_run + @FuncTitle Handling errors + @FuncDesc There are two kind of errors : + * Errors that are detected by the parser itself (malformed file, bad value syntax for a property, missing mandatory property in a structure, ...). + * Errors that you detect in your callbacks. + When the parser finds an error in the file, it will call the error callback and stop : + @Cpp void ITCODParserListener::error(const char *msg) + @C void error(const char *msg) + @Py error(msg) + @Param msg The error message from the parser with the file name and the line number. + */ + + /** + @PageName parser_run + @FuncDesc If you find an error in your callback, you have to call the parser error function. It will add the file name and line number to your error message, and then call your error callback : +The code in the example below will result in your error callback called with the following string : +"error in <filename> line <line_number> : Bad cost value %d. Cost must be between 0 and 1000" + @Cpp void TCODParser::error(const char *msg, ...) + @C void TCOD_parser_error(const char *msg, ...) + @Py parser_error(msg) + @Param msg printf-like format string for your error message. + @CppEx parser->error("Bad cost value %d. Cost must be between 0 and 1000", value.i); + @CEx TCOD_parser_error("Bad cost value %d. Cost must be between 0 and 1000", value.i); + @PyEx libtcod.parser_error("Bad cost value %d. Cost must be between 0 and 1000"%( value )) + */ + virtual void error(const char *msg) = 0; +}; + +/** + @PageName parser_types + @PageFather parser + @PageTitle Standard types + @FuncDesc The parser can parse natively several data types. It stores them in a generic union : + @C + typedef struct { + int nb_rolls; + int nb_faces; + float multiplier; + float addsub; + } TCOD_dice_t; + + typedef union { + bool b; + char c; + int32 i; + float f; + char *s; + TCOD_color_t col; + TCOD_dice_t dice; + TCOD_list_t list; + void *custom; + } TCOD_value_t; +*/ +/** + @PageName parser_types + @FuncDesc Possible types are defined by the TCOD_value_type_t enumeration : +For python, remove TCOD_ : libtcod.TYPE_BOOL + + + + + + + + + + + + + + + +
    TCOD_value_type_tValue in fileTCOD_value_t
    TCOD_TYPE_BOOLtrue
    false
    value.b == true/false
    TCOD_TYPE_CHARdecimal notation : 0 .. 255
    +hexadecimal notation : 0x00 .. 0xff
    +char notation : 'a' ';' ...
    +Special characters :
    +'\n' : carriage return (ascii 13)
    +'\t' : tabulation (ascii 9)
    + +'\r' : line feed (ascii 10)
    +'\\' : antislash (ascii 92)
    +'\"' : double-quote (ascii 34)
    +'\'' : simple quote (ascii 39)
    +'\xHH' : hexadecimal value, same as 0xHH, HH between 0 and FF
    +'\NNN' : octal value, NNN between 0 and 377
    +
    value.c == The corresponding ascii code
    TCOD_TYPE_INTdecimal notation : -2147483648 .. 2147483647
    hexadecimal notation : 0x0 .. 0xFFFFFFFF
    value.i == the integer value
    TCOD_TYPE_FLOATAny format parsable by atof. Examples:
    3.14159
    1.25E-3
    value.f == the float value
    TCOD_TYPE_STRINGA double-quote delimited string :
    "This is a string"
    Support the same special characters as TCOD_TYPE_CHAR.
    value.s == the corresponding string.
    Warning ! If you want to store this string, you have to duplicate it (with strdup) as it will be overwritten by the parser
    TCOD_TYPE_COLORdecimal notation : "16,32,64"
    hexadecimal notation : "#102040"
    value.col == the color.
    TCOD_TYPE_DICE[multiplier (x|*)] nb_rolls (d|D) nb_faces [(+|-) addsub] :
    "3d6"
    "3D6+2"
    "0.5x3d6-2"
    "2*3d8"
    value.dice == the dice components
    TCOD_TYPE_VALUELISTxxSame as TCOD_TYPE_STRINGvalue.s == the string value from the value list
    TCOD_TYPE_LIST[ <value1>,<value2>,... ]value.list == the TCOD_list_t containing the elements
    + +To define a list type, use the appropriate function (TCODParserStruct::addListProperty / TCOD_parser_add_list_property) and specify the type of the elements in the list. Lists of list are not supported. + */ + + +#endif diff --git a/tcod/tcod_sys/libtcod/include/path.h b/tcod/tcod_sys/libtcod/include/path.h new file mode 100644 index 00000000..1d3af42f --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/path.h @@ -0,0 +1,63 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_PATH_H +#define _TCOD_PATH_H + +typedef float (*TCOD_path_func_t)( int xFrom, int yFrom, int xTo, int yTo, void *user_data ); +typedef void *TCOD_path_t; + +TCODLIB_API TCOD_path_t TCOD_path_new_using_map(TCOD_map_t map, float diagonalCost); +TCODLIB_API TCOD_path_t TCOD_path_new_using_function(int map_width, int map_height, TCOD_path_func_t func, void *user_data, float diagonalCost); + +TCODLIB_API bool TCOD_path_compute(TCOD_path_t path, int ox,int oy, int dx, int dy); +TCODLIB_API bool TCOD_path_walk(TCOD_path_t path, int *x, int *y, bool recalculate_when_needed); +TCODLIB_API bool TCOD_path_is_empty(TCOD_path_t path); +TCODLIB_API int TCOD_path_size(TCOD_path_t path); +TCODLIB_API void TCOD_path_reverse(TCOD_path_t path); +TCODLIB_API void TCOD_path_get(TCOD_path_t path, int index, int *x, int *y); +TCODLIB_API void TCOD_path_get_origin(TCOD_path_t path, int *x, int *y); +TCODLIB_API void TCOD_path_get_destination(TCOD_path_t path, int *x, int *y); +TCODLIB_API void TCOD_path_delete(TCOD_path_t path); + +/* Dijkstra stuff - by Mingos*/ + +typedef void *TCOD_dijkstra_t; + +TCODLIB_API TCOD_dijkstra_t TCOD_dijkstra_new (TCOD_map_t map, float diagonalCost); +TCODLIB_API TCOD_dijkstra_t TCOD_dijkstra_new_using_function(int map_width, int map_height, TCOD_path_func_t func, void *user_data, float diagonalCost); +TCODLIB_API void TCOD_dijkstra_compute (TCOD_dijkstra_t dijkstra, int root_x, int root_y); +TCODLIB_API float TCOD_dijkstra_get_distance (TCOD_dijkstra_t dijkstra, int x, int y); +TCODLIB_API bool TCOD_dijkstra_path_set (TCOD_dijkstra_t dijkstra, int x, int y); +TCODLIB_API bool TCOD_dijkstra_is_empty(TCOD_dijkstra_t path); +TCODLIB_API int TCOD_dijkstra_size(TCOD_dijkstra_t path); +TCODLIB_API void TCOD_dijkstra_reverse(TCOD_dijkstra_t path); +TCODLIB_API void TCOD_dijkstra_get(TCOD_dijkstra_t path, int index, int *x, int *y); +TCODLIB_API bool TCOD_dijkstra_path_walk (TCOD_dijkstra_t dijkstra, int *x, int *y); +TCODLIB_API void TCOD_dijkstra_delete (TCOD_dijkstra_t dijkstra); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/path.hpp b/tcod/tcod_sys/libtcod/include/path.hpp new file mode 100644 index 00000000..2f1dea62 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/path.hpp @@ -0,0 +1,552 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_PATH_HPP +#define _TCOD_PATH_HPP + +class TCODLIB_API ITCODPathCallback { +public : + virtual ~ITCODPathCallback() {} + virtual float getWalkCost( int xFrom, int yFrom, int xTo, int yTo, void *userData ) const = 0; +}; + +/** + @PageName path + @PageTitle Path finding + @PageCategory Roguelike toolkits + @PageDesc This toolkit allows to easily calculate the optimal path between two points in your dungeon by using either the A* algorithm or Dijkstra's algorithm. +Please note that the paths generated with the two algorithms may differ slightly. Due to how they're implemented, A* will usually prefer diagonal moves over orthogonal, while Dijkstra will have the opposite preference. In other words, paths from point X to point Y will look like this: +
    +Dijkstra:      A*:
    +..........   ..........
    +.X........   .X*.......
    +..*.......   ...**.....
    +...*......   .....**...
    +....****Y.   .......*Y.
    +..........   ..........
    +
    + */ +class TCODLIB_API TCODPath { +public : + /** + @PageName path_init + @PageFather path + @PageTitle Creating a path + @FuncTitle Allocating a pathfinder from a map + @FuncDesc First, you have to allocate a path using a map from the Field of view module. + @Cpp + TCODPath::TCODPath(const TCODMap *map, float diagonalCost=1.41f) + TCODDijkstra::TCODDijkstra(const TCODMap *map, float diagonalCost=1.41f) + @C + TCOD_path_t TCOD_path_new_using_map(TCOD_map_t map, float diagonalCost) + TCOD_dijkstra_t TCOD_dijkstra_new(TCOD_map_t map, float diagonalCost) + @Py + path_new_using_map(map, diagonalCost=1.41) + dijkstra_new(map, diagonalCost=1.41) + @C# + TCODPath(TCODMap map, float diagonalCost) + TCODPath(TCODMap map) + TCODDijkstra(TCODMap map, float diagonalCost) + TCODDijkstra(TCODMap map) + @Param map The map. The path finder will use the 'walkable' property of the cells to find a path. + @Param diagonalCost Cost of a diagonal movement compared to an horizontal or vertical movement. On a standard cartesian map, it should be sqrt(2) (1.41f). + It you want the same cost for all movements, use 1.0f. + If you don't want the path finder to use diagonal movements, use 0.0f. + @CppEx + // A* : + TCODMap *myMap = new TCODMap(50,50); + TCODPath *path = new TCODPath(myMap); // allocate the path + // Dijkstra: + TCODMap *myMap = new TCODMap(50,50); + TCODDijkstra *dijkstra = new TCODDijkstra(myMap); // allocate the path + @CEx + // A* : + TCOD_map_t my_map=TCOD_map_new(50,50,true); + TCOD_path_t path = TCOD_path_new_using_map(my_map,1.41f); + // Dijkstra : + TCOD_map_t my_map=TCOD_map_new(50,50,true); + TCOD_dijkstra_t dijk = TCOD_dijkstra_new(my_map,1.41f); + @PyEx + # A* : + my_map=libtcod.map_new(50,50,True) + path = libtcod.path_new_using_map(my_map) + # Dijkstra + my_map=libtcod.map_new(50,50,True) + dijk = libtcod.dijkstra_new(my_map) + */ + TCODPath(const TCODMap *map, float diagonalCost=1.41f); + /** + @PageName path_init + @FuncTitle Allocating a pathfinder using a callback + @FuncDesc Since the walkable status of a cell may depend on a lot of parameters (the creature type, the weather, the terrain type...), you can also create a path by providing a function rather than relying on a TCODMap. + @Cpp + // Callback : + class ITCODPathCallback { + public: virtual float getWalkCost( int xFrom, int yFrom, int xTo, int yTo, void *userData ) const = 0; + }; + // A* constructor: + TCODPath::TCODPath(int width, int height, const ITCODPathCallback *callback, void *userData, float diagonalCost=1.41f) + // Dijkstra constructor + TCODDijkstra::TCODDijkstra(int width, int height, const ITCODPathCallback *callback, void *userData, float diagonalCost=1.41f) + @C + typedef float (*TCOD_path_func_t)( int xFrom, int yFrom, int xTo, int yTo, void *user_data ) + TCOD_path_t TCOD_path_new_using_function(int width, int height, TCOD_path_func_t callback, void *user_data, float diagonalCost) + TCOD_dijkstra_t TCOD_dijkstra_new_using_function(int width, int height, TCOD_path_func_t callback, void *user_data, float diagonalCost) + @Py + def path_func(xFrom,yFrom,xTo,yTo,userData) : ... + path_new_using_function(width, height, path_func, user_data=0, diagonalCost=1.41) + dijkstra_new_using_function(width, height, path_func, user_data=0, diagonalCost=1.41) + @C# + TCODPath(int width, int height, ITCODPathCallback listener, float diagonalCost) + TCODPath(int width, int height, ITCODPathCallback listener) + TCODDijkstra(int width, int height, ITCODPathCallback listener, float diagonalCost) + TCODDijkstra(int width, int height, ITCODPathCallback listener) + @Param width,height The size of the map (in map cells). + @Param callback A custom function that must return the walk cost from coordinates xFrom,yFrom to coordinates xTo,yTo. + The cost must be > 0.0f if the cell xTo,yTo is walkable. + It must be equal to 0.0f if it's not. + You must not take additional cost due to diagonal movements into account as it's already done by the pathfinder. + @Param userData Custom data that will be passed to the function. + @Param diagonalCost Cost of a diagonal movement compared to an horizontal or vertical movement. On a standard cartesian map, it should be sqrt(2) (1.41f). + It you want the same cost for all movements, use 1.0f. + If you don't want the path finder to use diagonal movements, use 0.0f. + @CppEx + class MyCallback : public ITCODPathCallback { + public : + float getWalkCost(int xFrom, int yFrom, int xTo, int yTo, void *userData ) const { ... } + }; + TCODPath *path = new TCODPath(50,50,new MyCallback(),NULL); // allocate the path + TCODDijkstra *dijkstra = new TCODDijkstra(50,50,new MyCallback(),NULL); // allocate Dijkstra + @CEx + float my_func(int xFrom, int yFrom, int xTo, int yTo, void *user_data) { ... } + TCOD_path_t path = TCOD_path_new_using_function(50,50,my_func,NULL,1.41f); + TCOD_dijkstra_t dijkstra = TCOD_dijkstra_new_using_function(50,50,my_func,NULL,1.41f); + @PyEx + def my_func(xFrom, yFrom, xTo, yTo, user_data) : + # return a float cost for this movement + return 1.0 + path = libtcod.path_new_using_function(50,50,my_func) + dijkstra = libtcod.dijkstra_new_using_function(50,50,my_func) + */ + TCODPath(int width, int height, const ITCODPathCallback *listener, void *userData, float diagonalCost=1.41f); + + /** + @PageName path_init + @FuncTitle Destroying a path + @FuncDesc To release the resources used by a path, destroy it with : + @Cpp + TCODPath::~TCODPath() + TCODDijkstra::~TCODDijkstra() + @C + void TCOD_path_delete(TCOD_path_t path) + void TCOD_dijkstra_delete(TCOD_dijkstra_t dijkstra) + @Py + path_delete(path) + dijkstra_delete(dijkstra) + @C# + void TCODPath::Dispose() + void TCODDijkstra::Dispose() + @Param path In the C version, the path handler returned by one of the TCOD_path_new_* function. + @Param dijkstra In the C version, the path handler returned by one of the TCOD_dijkstra_new* function. + @CppEx + TCODPath *path = new TCODPath(myMap); // allocate the path + // use the path... + delete path; // destroy the path + + TCODDijkstra *dijkstra = new TCODDijkstra(myMap); // allocate the path + // use the path... + delete dijkstra; // destroy the path + @CEx + TCOD_path_t path = TCOD_path_new_using_map(my_map); + // use the path ... + TCOD_path_delete(path); + + TCOD_dijkstra_t dijkstra = TCOD_dijkstra_new(my_map); + // use the path ... + TCOD_dijkstra_delete(dijkstra); + @PyEx + path = libtcod.path_new_using_map(my_map) + # use the path ... + libtcod.path_delete(path) + + dijkstra = libtcod.dijkstra_new(my_map) + # use the path ... + libtcod.dijkstra_delete(dijkstra) + */ + virtual ~TCODPath(); + + /** + @PageName path_compute + @PageFather path + @PageTitle Computing the path + @FuncTitle Computing an A* path + @FuncDesc Once you created a TCODPath object, you can compute the path between two points: + @Cpp bool TCODPath::compute(int ox, int oy, int dx, int dy) + @C bool TCOD_path_compute(TCOD_path_t path, int ox,int oy, int dx, int dy) + @Py path_compute(path, ox, oy, dx, dy) + @C# void TCODPath::compute(int ox, int oy, int dx, int dy) + @Param path In the C version, the path handler returned by a creation function. + @Param ox,oy Coordinates of the origin of the path. + @Param dx,dy Coordinates of the destination of the path. + Both points should be inside the map, and at a walkable position. The function returns false if there is no possible path. + @CppEx + TCODMap *myMap = new TCODMap(50,50); + TCODPath *path = new TCODPath(myMap); // allocate the path + path->compute(5,5,25,25); // calculate path from 5,5 to 25,25 + @CEx + TCOD_map_t my_map=TCOD_map_new(50,50); + TCOD_path_t path = TCOD_path_new_using_map(my_map); + TCOD_path_compute(path,5,5,25,25); + @PyEx + my_map=libtcod.map_new(50,50) + path = libtcod.path_new_using_map(my_map) + libtcod.path_compute(path,5,5,25,25) + */ + bool compute(int ox, int oy, int dx, int dy); + + /** + @PageName path_compute + @FuncTitle Reversing a path + @FuncDesc Once you computed a path, you can exchange origin and destination : + @Cpp + void TCODPath::reverse() + void TCODDijkstra::reverse() + @C + void TCOD_path_reverse(TCOD_path_t path) + void TCOD_dijkstra_reverse(TCOD_dijkstra_t dijkstra) + @Py + path_reverse(path) + dijkstra_reverse(dijkstra) + @C# + void TCODPath::reverse() + void TCODDijkstra::reverse() + @Param path In the C version, the path handler returned by a creation function. + @CppEx + TCODMap *myMap = new TCODMap(50,50); + TCODPath *path = new TCODPath(myMap); // allocate the path + path->compute(5,5,25,25); // calculate path from 5,5 to 25,25 + path->reverse(); // now the path goes from 25,25 to 5,5 + @CEx + TCOD_map_t my_map=TCOD_map_new(50,50); + TCOD_path_t path = TCOD_path_new_using_map(my_map); + TCOD_path_compute(path,5,5,25,25); // calculate path from 5,5 to 25,25 + TCOD_path_reverse(path); // now the path goes from 25,25 to 5,5 + @PyEx + my_map=libtcod.map_new(50,50) + path = libtcod.path_new_using_map(my_map) + libtcod.path_compute(path,5,5,25,25) # calculate path from 5,5 to 25,25 + libtcod.path_reverse(path) # now the path goes from 25,25 to 5,5 + */ + void reverse(); + + + /** + @PageName path_read + @PageTitle Reading path information + @PageFather path + @PageDescDesc Once the path has been computed, you can get information about it using of one those functions. + @FuncTitle Getting the path origin and destination + @FuncDesc + You can read the current origin and destination cells with getOrigin/getDestination. + Note that when you walk the path, the origin changes at each step. + @Cpp + void TCODPath::getOrigin(int *x,int *y) const + void TCODPath::getDestination(int *x,int *y) const + @C + void TCOD_path_get_origin(TCOD_path_t path, int *x, int *y) + void TCOD_path_get_destination(TCOD_path_t path, int *x, int *y) + @Py + path_get_origin(path) # returns x,y + path_get_destination(path) # returns x,y + @C# + void TCODPath::getOrigin(out int x, out int y) + void TCODPath::getDestination(out int x, out int y) + @Param path In the C version, the path handler returned by a creation function. + @Param x,y The function returns the cell coordinates in these variables + */ + void getOrigin(int *x,int *y) const; + void getDestination(int *x,int *y) const; + + /** + @PageName path_read + @FuncTitle Getting the path length + @FuncDesc You can get the number of steps needed to reach destination : + @Cpp + int TCODPath::size() const + int TCODDijkstra::size() const + @C + int TCOD_path_size(TCOD_path_t path) + int TCOD_dijkstra_size(TCOD_dijkstra_t dijkstra) + @Py + path_size(path) + dijkstra_size(dijkstra) + @C# + int TCODPath::size() + int TCODDijkstra::size() + @Param path, dijkstra In the C version, the path handler returned by a creation function. + */ + int size() const; + + /** + @PageName path_read + @FuncTitle Read the path cells' coordinates + @FuncDesc You can get the coordinates of each point along the path : + @Cpp + void TCODPath::get(int index, int *x, int *y) const + void TCODDijkstra::get(int index, int *x, int *y) const + @C + void TCOD_path_get(TCOD_path_t path, int index, int *x, int *y) + void TCOD_dijkstra_get(TCOD_dijkstra_t dijkstra, int index, int *x, int *y) + @Py + path_get(path, index) # returns x,y + dijkstra_get(dijkstra, index) # returns x,y + @C# + int TCODPath::size() + int TCODDijkstra::size() + @Param path, dijkstra In the C version, the path handler returned by a creation function. + @Param index Step number. + 0 <= index < path size + @Param x,y Address of the variables receiving the coordinates of the point. + @CppEx + for (int i=0; i < path->size(); i++ ) { + int x,y; + path->get(i,&x,&y); + printf ("Astar coord : %d %d\n", x,y ); + } + for (int i=0; i < dijkstra->size(); i++ ) { + int x,y; + dijkstra->get(i,&x,&y); + printf ("Dijkstra coord : %d %d\n", x,y ); + } + @CEx + int i; + for (i=0; i < TCOD_path_size(path); i++ ) { + int x,y; + TCOD_path_get(path,i,&x,&y); + printf ("Astar coord : %d %d\n", x,y ); + } + for (i=0; i < TCOD_dijkstra_size(dijkstra); i++ ) { + int x,y; + TCOD_dijkstra_get(dijkstra,i,&x,&y); + printf ("Dijsktra coord : %d %d\n", x,y ); + } + @PyEx + for i in range (libtcod.path_size(path)) : + x,y=libtcod.path_get(path,i) + print 'Astar coord : ',x,y + for i in range (libtcod.dijkstra_size(dijkstra)) : + x,y=libtcod.dijkstra_get(dijkstra,i) + print 'Dijkstra coord : ',x,y + */ + void get(int index, int *x, int *y) const; + + /** + @PageName path_read + @FuncTitle Checking if the path is empty + @FuncDesc If you want a creature to follow the path, a more convenient way is to walk the path : + You know when you reached destination when the path is empty : + @Cpp + bool TCODPath::isEmpty() const + bool TCODDijkstra::isEmpty() const + @C + bool TCOD_path_is_empty(TCOD_path_t path) + bool TCOD_dijkstra_is_empty(TCOD_dijkstra_t dijkstra) + @Py + path_is_empty(path) + dijkstra_is_empty(dijkstra) + @C# + bool TCODPath::isEmpty() + bool TCODDijkstra::isEmpty() + @Param path, dijkstra In the C version, the path handler returned by a creation function. + */ + bool isEmpty() const; + + /** + @PageName path_read + @FuncTitle Walking the path + @FuncDesc You can walk the path and go to the next step with : + Note that walking the path consume one step (and decrease the path size by one). The function returns false if recalculateWhenNeeded is false and the next cell on the path is no longer walkable, or if recalculateWhenNeeded is true, the next cell on the path is no longer walkable and no other path has been found. Also note that recalculateWhenNeeded only applies to A*. + @Cpp + bool TCODPath::walk(int *x, int *y, bool recalculateWhenNeeded) + bool TCODDijkstra::walk(int *x, int *y) + @C + bool TCOD_path_walk(TCOD_path_t path, int *x, int *y, bool recalculate_when_needed) + bool TCOD_dijkstra_walk(TCOD_dijkstra_t dijkstra, int *x, int *y) + @Py + path_walk(TCOD_path_t path, recalculate_when_needed) # returns x,y or None,None if no path + dijkstra_walk(TCOD_dijkstra_t dijkstra) + @C# + bool TCODPath::walk(ref int x, ref int y, bool recalculateWhenNeeded) + bool TCODDijkstra::walk(ref int x, ref int y) + @Param path, dijkstra In the C version, the path handler returned by a creation function. + @Param x,y Address of the variables receiving the coordinates of the next point. + @Param recalculateWhenNeeded If the next point is no longer walkable (another creature may be in the way), recalculate a new path and walk it. + @CppEx + while (! path->isEmpty()) { + int x,y; + if (path->walk(&x,&y,true)) { + printf ("Astar coord: %d %d\n",x,y ); + } else { + printf ("I'm stuck!\n" ); + break; + } + } + while (! dijkstra->isEmpty()) { + int x,y; + if (dijkstra->walk(&x,&y)) { + printf ("Dijkstra coord: %d %d\n",x,y ); + } else { + printf ("I'm stuck!\n" ); + break; + } + } + @CEx + while (! TCOD_path_is_empty(path)) { + int x,y; + if (TCOD_path_walk(path,&x,&y,true)) { + printf ("Astar coord: %d %d\n",x,y ); + } else { + printf ("I'm stuck!\n" ); + break; + } + } + while (! TCOD_dijkstra_is_empty(dijkstra)) { + int x,y; + if (TCOD_dijkstra_walk(dijkstra,&x,&y)) { + printf ("Dijkstra coord: %d %d\n",x,y ); + } else { + printf ("I'm stuck!\n" ); + break; + } + } + @PyEx + while not libtcod.path_is_empty(path)) : + x,y=libtcod.path_walk(path,True) + if not x is None : + print 'Astar coord: ',x,y + else : + print "I'm stuck!" + break + while not libtcod.dijkstra_is_empty(dijkstra)) : + x,y=libtcod.dijkstra_walk(dijkstra,True) + if not x is None : + print 'Dijkstra coord: ',x,y + else : + print "I'm stuck!" + break + */ + bool walk(int *x, int *y, bool recalculateWhenNeeded); + +protected : + friend float TCOD_path_func(int xFrom, int yFrom, int xTo,int yTo, void *data); + TCOD_path_t data; + struct WrapperData { + void *userData; + const ITCODPathCallback *listener; + } cppData; +}; + +//Dijkstra kit +class TCODLIB_API TCODDijkstra { + public: + TCODDijkstra (TCODMap *map, float diagonalCost=1.41f); + TCODDijkstra (int width, int height, const ITCODPathCallback *listener, void *userData, float diagonalCost=1.41f); + ~TCODDijkstra (void); + /** + @PageName path_compute + @FuncTitle Computing a Dijkstra grid + @FuncDesc In case of Dijkstra, this works in a slightly different way. In order to be able to compute a path, Dijkstra must first analyse the distances from the selected root (origin) node to all other nodes: + @Cpp void TCODDijkstra::compute(int rootX, int rootY) + @C void TCOD_dijkstra_compute(TCOD_dijkstra_t dijkstra, int root_x, int root_y) + @Py dijkstra_compute(dijkstra, root_x, root_y) + @C# void TCODDijkstra::compute(int rootX, int rootY) + @Param dijkstra In the C version, the path handler returned by a creation function. + @Param root_x,root_y Coordinates of the root node (origin) of the path. + The coordinates should be inside the map, at a walkable position. Otherwise, the function's behaviour will be undefined. + */ + void compute (int rootX, int rootY); + + /** + @PageName path_compute + @FuncTitle Computing a path from a Dijkstra grid + @FuncDesc After the map is analysed and all the distances from the root node are known, an unlimited number of paths can be set, all originating at the root node, using: + The path setting function will return true if there's a path from the root node to the destination node. Otherwise, it will return false. + @Cpp bool TCODDijkstra::setPath(int toX, int toY) + @C bool TCOD_dijkstra_path_set(TCOD_dijkstra_t dijkstra, int to_x, int to_y) + @Py dijkstra_path_set(dijkstra, to_x, to_y) + @C# bool TCODDijkstra::setPath(int toX, int toY) + @Param dijkstra In the C version, the path handler returned by a creation function. + @Param to_x,to_y Coordinates of the destination node of the path. + @CppEx + TCODMap *myMap = new TCODMap(50,50); + TCODDijkstra *dijkstra = new TCODDijkstra(myMap); // allocate the path + dijkstra->compute(25,25); // calculate distance from 25,25 to all other nodes + dijkstra->setPath(5,5); // calculate a path to node 5,5 + dijkstra->setPath(45,45); //calculate another path from the same origin + @CEx + TCOD_map_t my_map=TCOD_map_new(50,50); + TCOD_dijkstra_t dijkstra = TCOD_dijkstra_new(my_map); + TCOD_dijkstra_compute(dijkstra,25,25); + TCOD_dijkstra_path_set(dijkstra,5,5); + TCOD_dijkstra_path_set(dijkstra,45,45); + @PyEx + my_map=libtcod.map_new(50,50) + dijkstra = libtcod.dijkstra_new(my_map) + libtcod.dijkstra_compute(dijkstra,25,25) + libtcod.dijkstra_path_set(dijkstra,5,5) + libtcod.dijkstra_path_set(dijkstra,45,45) + */ + bool setPath (int toX, int toY); + + /** + @PageName path_read + @FuncTitle Getting the distance from a cell to the root node + @FuncDesc You can get the distance of any set of coordinates from the root node: + Note that if the coordinates x,y are outside of the map or are a non-walkable position, the function will return -1.0f. This functionality is only available for Dijkstra's algorithm. + @Cpp float TCODDijkstra::getDistance(int x, int y) + @C float TCOD_dijkstra_get_distance(TCOD_dijkstra_t dijkstra, int x, int y) + @Py dijkstra_get_distance(dijkstra, x, y) + @C# float TCODDijkstra::getDistance(int x, int y) + @Param dijkstra In the C version, the path handler returned by a creation function. + @Param x,y The coordinates whose distance from the root node are to be checked + */ + float getDistance (int x, int y); + bool walk (int *x, int *y); + bool isEmpty() const; + void reverse(); + int size() const; + void get(int index, int *x, int *y) const; + private: + TCOD_dijkstra_t data; + struct WrapperData { + void *userData; + const ITCODPathCallback *listener; + } cppData; +}; + +#endif + diff --git a/tcod/tcod_sys/libtcod/include/sys.h b/tcod/tcod_sys/libtcod/include/sys.h new file mode 100644 index 00000000..616ee38f --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/sys.h @@ -0,0 +1,119 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_SYS_H +#define _TCOD_SYS_H + +TCODLIB_API uint32 TCOD_sys_elapsed_milli(); +TCODLIB_API float TCOD_sys_elapsed_seconds(); +TCODLIB_API void TCOD_sys_sleep_milli(uint32 val); +TCODLIB_API void TCOD_sys_save_screenshot(const char *filename); +TCODLIB_API void TCOD_sys_force_fullscreen_resolution(int width, int height); +TCODLIB_API void TCOD_sys_set_renderer(TCOD_renderer_t renderer); +TCODLIB_API TCOD_renderer_t TCOD_sys_get_renderer(); +TCODLIB_API void TCOD_sys_set_fps(int val); +TCODLIB_API int TCOD_sys_get_fps(); +TCODLIB_API float TCOD_sys_get_last_frame_length(); +TCODLIB_API void TCOD_sys_get_current_resolution(int *w, int *h); +TCODLIB_API void TCOD_sys_get_fullscreen_offsets(int *offx, int *offy); +TCODLIB_API void TCOD_sys_update_char(int asciiCode, int fontx, int fonty, TCOD_image_t img, int x, int y); +TCODLIB_API void TCOD_sys_get_char_size(int *w, int *h); +TCODLIB_API void *TCOD_sys_get_SDL_window(); + +typedef enum { + TCOD_EVENT_NONE=0, + TCOD_EVENT_KEY_PRESS=1, + TCOD_EVENT_KEY_RELEASE=2, + TCOD_EVENT_KEY=TCOD_EVENT_KEY_PRESS|TCOD_EVENT_KEY_RELEASE, + TCOD_EVENT_MOUSE_MOVE=4, + TCOD_EVENT_MOUSE_PRESS=8, + TCOD_EVENT_MOUSE_RELEASE=16, + TCOD_EVENT_MOUSE=TCOD_EVENT_MOUSE_MOVE|TCOD_EVENT_MOUSE_PRESS|TCOD_EVENT_MOUSE_RELEASE, +/* #ifdef TCOD_TOUCH_INPUT */ + TCOD_EVENT_FINGER_MOVE=32, + TCOD_EVENT_FINGER_PRESS=64, + TCOD_EVENT_FINGER_RELEASE=128, + TCOD_EVENT_FINGER=TCOD_EVENT_FINGER_MOVE|TCOD_EVENT_FINGER_PRESS|TCOD_EVENT_FINGER_RELEASE, +/* #endif */ + TCOD_EVENT_ANY=TCOD_EVENT_KEY|TCOD_EVENT_MOUSE|TCOD_EVENT_FINGER, +} TCOD_event_t; +TCODLIB_API TCOD_event_t TCOD_sys_wait_for_event(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse, bool flush); +TCODLIB_API TCOD_event_t TCOD_sys_check_for_event(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse); + +/* filesystem stuff */ +TCODLIB_API bool TCOD_sys_create_directory(const char *path); +TCODLIB_API bool TCOD_sys_delete_file(const char *path); +TCODLIB_API bool TCOD_sys_delete_directory(const char *path); +TCODLIB_API bool TCOD_sys_is_directory(const char *path); +TCODLIB_API TCOD_list_t TCOD_sys_get_directory_content(const char *path, const char *pattern); +TCODLIB_API bool TCOD_sys_file_exists(const char * filename, ...); +TCODLIB_API bool TCOD_sys_read_file(const char *filename, unsigned char **buf, size_t *size); +TCODLIB_API bool TCOD_sys_write_file(const char *filename, unsigned char *buf, uint32 size); + +/* clipboard */ +TCODLIB_API void TCOD_sys_clipboard_set(const char *value); +TCODLIB_API char *TCOD_sys_clipboard_get(); + +/* thread stuff */ +typedef void *TCOD_thread_t; +typedef void *TCOD_semaphore_t; +typedef void *TCOD_mutex_t; +typedef void *TCOD_cond_t; +/* threads */ +TCODLIB_API TCOD_thread_t TCOD_thread_new(int (*func)(void *), void *data); +TCODLIB_API void TCOD_thread_delete(TCOD_thread_t th); +TCODLIB_API int TCOD_sys_get_num_cores(); +TCODLIB_API void TCOD_thread_wait(TCOD_thread_t th); +/* mutex */ +TCODLIB_API TCOD_mutex_t TCOD_mutex_new(); +TCODLIB_API void TCOD_mutex_in(TCOD_mutex_t mut); +TCODLIB_API void TCOD_mutex_out(TCOD_mutex_t mut); +TCODLIB_API void TCOD_mutex_delete(TCOD_mutex_t mut); +/* semaphore */ +TCODLIB_API TCOD_semaphore_t TCOD_semaphore_new(int initVal); +TCODLIB_API void TCOD_semaphore_lock(TCOD_semaphore_t sem); +TCODLIB_API void TCOD_semaphore_unlock(TCOD_semaphore_t sem); +TCODLIB_API void TCOD_semaphore_delete( TCOD_semaphore_t sem); +/* condition */ +TCODLIB_API TCOD_cond_t TCOD_condition_new(); +TCODLIB_API void TCOD_condition_signal(TCOD_cond_t sem); +TCODLIB_API void TCOD_condition_broadcast(TCOD_cond_t sem); +TCODLIB_API void TCOD_condition_wait(TCOD_cond_t sem, TCOD_mutex_t mut); +TCODLIB_API void TCOD_condition_delete( TCOD_cond_t sem); +/* dynamic library */ +typedef void *TCOD_library_t; +TCODLIB_API TCOD_library_t TCOD_load_library(const char *path); +TCODLIB_API void * TCOD_get_function_address(TCOD_library_t library, const char *function_name); +TCODLIB_API void TCOD_close_library(TCOD_library_t); +/* SDL renderer callback */ +#ifdef TCOD_SDL2 +typedef void (*SDL_renderer_t) (void *sdl_renderer); +#else +typedef void (*SDL_renderer_t) (void *sdl_surface); +#endif +TCODLIB_API void TCOD_sys_register_SDL_renderer(SDL_renderer_t renderer); +#endif diff --git a/tcod/tcod_sys/libtcod/include/sys.hpp b/tcod/tcod_sys/libtcod/include/sys.hpp new file mode 100644 index 00000000..048e3ff2 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/sys.hpp @@ -0,0 +1,541 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_SYS_HPP +#define _TCOD_SYS_HPP + +/** + @PageName system + @PageCategory Core + @PageTitle System layer + @PageDesc This toolkit contains some system specific miscellaneous utilities. Use them is you want your code to be easily portable. + */ + +class TCODLIB_API ITCODSDLRenderer { +public : + virtual ~ITCODSDLRenderer() {} + virtual void render(void *sdlSurface) = 0; +}; + +class TCODLIB_API TCODSystem { +public : + /** + @PageName system_time + @PageFather system + @PageTitle High precision time functions + @PageDesc These are functions specifically aimed at real time game development. + @FuncTitle Limit the frames per second + @FuncDesc The setFps function allows you to limit the number of frames per second. + If a frame is rendered faster than expected, the TCOD_console_flush function will wait so that the frame rate never exceed this value. + You can call this function during your game initialization. + You can dynamically change the frame rate. Just call this function once again. + You should always limit the frame rate, except during benchmarks, else your game will use 100% of the CPU power + @Cpp static void TCODSystem::setFps(int val) + @C void TCOD_sys_set_fps(int val) + @Py sys_set_fps(val) + @C# static void TCODSystem::setFps(int val) + @Lua tcod.system.setFps(val) + @Param val Maximum number of frames per second. 0 means unlimited frame rate. + */ + static void setFps(int val); + + /** + @PageName system_time + @FuncTitle Get the number of frames rendered during the last second + @FuncDesc The value returned by this function is updated every second. + @Cpp static int TCODSystem::getFps() + @C int TCOD_sys_get_fps() + @Py sys_get_fps() + @C# static int TCODSystem::getFps() + @Lua tcod.system.getFps() + */ + static int getFps(); + + /** + @PageName system_time + @FuncTitle Get the duration of the last frame + @FuncDesc This function returns the length in seconds of the last rendered frame. + You can use this value to update every time dependent object in the world. + @Cpp static float TCODSystem::getLastFrameLength() + @C float TCOD_sys_get_last_frame_length() + @Py sys_get_last_frame_length() + @C# static float TCODSystem::getLastFrameLength() + @Lua tcod.system.getLastFrameLength() + @CppEx + // moving an objet at 5 console cells per second + float x=0,y=0; // object coordinates + x += 5 * TCODSystem::getLastFrameLength(); + TCODConsole::root->putChar((int)(x),(int)(y),'X'); + @CEx + float x=0,y=0; + x += 5 * TCOD_sys_get_last_frame_length(); + TCOD_console_put_char(NULL,(int)(x),(int)(y),'X'); + @PyEx + x=0.0 + y=0.0 + x += 5 * libtcod.sys_get_last_frame_length() + libtcod.console_put_char(0,int(x),int(y),'X') + @LuaEx + -- moving an objet at 5 console cells per second + x=0 + y=0 -- object coordinates + x = x + 5 * tcod.system.getLastFrameLength() + libtcod.TCODConsole_root:putChar(x,y,'X') + */ + static float getLastFrameLength(); + + /** + @PageName system_time + @FuncTitle Pause the program + @FuncDesc Use this function to stop the program execution for a specified number of milliseconds. + @Cpp static void TCODSystem::sleepMilli(uint32 val) + @C void TCOD_sys_sleep_milli(uint32 val) + @Py sys_sleep_milli(val) + @C# static void TCODSystem::sleepMilli(uint val) + @Lua tcod.system.sleepMilli(val) + @Param val number of milliseconds before the function returns + */ + static void sleepMilli(uint32 val); + + /** + @PageName system_time + @FuncTitle Get global timer in milliseconds + @FuncDesc This function returns the number of milliseconds since the program has started. + @Cpp static uint32 TCODSystem::getElapsedMilli() + @C uint32 TCOD_sys_elapsed_milli() + @Py sys_elapsed_milli() + @C# static uint TCODSystem::getElapsedMilli() + @Lua tcod.system.getElapsedMilli() + */ + static uint32 getElapsedMilli(); + + /** + @PageName system_time + @FuncTitle Get global timer in seconds + @FuncDesc This function returns the number of seconds since the program has started. + @Cpp static float TCODSystem::getElapsedSeconds() + @C float TCOD_sys_elapsed_seconds() + @Py sys_elapsed_seconds() + @C# static float TCODSystem::getElapsedSeconds() + @Lua tcod.system.getElapsedSeconds() + */ + static float getElapsedSeconds(); + + /** + @PageName console_blocking_input + @FuncTitle Waiting for any event (mouse or keyboard) + @FuncDesc This function waits for an event from the user. The eventMask shows what events we're waiting for. + The return value indicate what event was actually triggered. Values in key and mouse structures are updated accordingly. + If flush is false, the function waits only if there are no pending events, else it returns the first event in the buffer. + @Cpp typedef enum { + TCOD_EVENT_NONE=0, + TCOD_EVENT_KEY_PRESS=1, + TCOD_EVENT_KEY_RELEASE=2, + TCOD_EVENT_KEY=TCOD_EVENT_KEY_PRESS|TCOD_EVENT_KEY_RELEASE, + TCOD_EVENT_MOUSE_MOVE=4, + TCOD_EVENT_MOUSE_PRESS=8, + TCOD_EVENT_MOUSE_RELEASE=16, + TCOD_EVENT_MOUSE=TCOD_EVENT_MOUSE_MOVE|TCOD_EVENT_MOUSE_PRESS|TCOD_EVENT_MOUSE_RELEASE, + TCOD_EVENT_ANY=TCOD_EVENT_KEY|TCOD_EVENT_MOUSE, + } TCOD_event_t; + static TCOD_event_t TCODSystem::waitForEvent(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse, bool flush) + @C TCOD_event_t TCOD_sys_wait_for_event(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse, bool flush) + @Py sys_wait_for_event(eventMask,key,mouse,flush) + @Param eventMask event types to wait for (other types are discarded) + @Param key updated in case of a key event. Can be null if eventMask contains no key event type + @Param mouse updated in case of a mouse event. Can be null if eventMask contains no mouse event type + @Param flush if true, all pending events are flushed from the buffer. Else, return the first available event + @CppEx + TCOD_key_t key; + TCOD_mouse_t mouse; + TCOD_event_t ev = TCODSystem::waitForEvent(TCOD_EVENT_ANY,&key,&mouse,true); + if ( ev == TCOD_EVENT_KEY_PRESS && key.c == 'i' ) { ... open inventory ... } + @CEx + TCOD_key_t key; + TCOD_mouse_t mouse; + TCOD_event_t ev = TCOD_sys_wait_for_event(TCOD_EVENT_ANY,&key,&mouse,true); + if ( ev == TCOD_EVENT_KEY_PRESS && key.c == 'i' ) { ... open inventory ... } + */ + static TCOD_event_t waitForEvent(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse, bool flush); + + /** + @PageName console_non_blocking_input + @FuncTitle Checking for any event (mouse or keyboard) + @FuncDesc This function checks if an event from the user is in the buffer. The eventMask shows what events we're waiting for. + The return value indicate what event was actually found. Values in key and mouse structures are updated accordingly. + @Cpp typedef enum { + TCOD_EVENT_KEY_PRESS=1, + TCOD_EVENT_KEY_RELEASE=2, + TCOD_EVENT_KEY=TCOD_EVENT_KEY_PRESS|TCOD_EVENT_KEY_RELEASE, + TCOD_EVENT_MOUSE_MOVE=4, + TCOD_EVENT_MOUSE_PRESS=8, + TCOD_EVENT_MOUSE_RELEASE=16, + TCOD_EVENT_MOUSE=TCOD_EVENT_MOUSE_MOVE|TCOD_EVENT_MOUSE_PRESS|TCOD_EVENT_MOUSE_RELEASE, + TCOD_EVENT_ANY=TCOD_EVENT_KEY|TCOD_EVENT_MOUSE, + } TCOD_event_t; + static TCOD_event_t TCODSystem::checkForEvent(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse) + @C TCOD_event_t TCOD_sys_check_for_event(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse) + @Py sys_check_for_event(eventMask,key,mouse) + @Param eventMask event types to wait for (other types are discarded) + @Param key updated in case of a key event. Can be null if eventMask contains no key event type + @Param mouse updated in case of a mouse event. Can be null if eventMask contains no mouse event type + @CppEx + TCOD_key_t key; + TCOD_mouse_t mouse; + TCOD_event_t ev = TCODSystem::checkForEvent(TCOD_EVENT_ANY,&key,&mouse); + if ( ev == TCOD_EVENT_KEY_PRESS && key.c == 'i' ) { ... open inventory ... } + @CEx + TCOD_key_t key; + TCOD_mouse_t mouse; + TCOD_event_t ev = TCOD_sys_check_for_event(TCOD_EVENT_ANY,&key,&mouse); + if ( ev == TCOD_EVENT_KEY_PRESS && key.c == 'i' ) { ... open inventory ... } + */ + static TCOD_event_t checkForEvent(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse); + /** + @PageName system_screenshots + @PageFather system + @PageTitle Easy screenshots + @FuncDesc This function allows you to save the current game screen in a png file, or possibly a bmp file if you provide a filename ending with .bmp. + @Cpp static void TCODSystem::saveScreenshot(const char *filename) + @C void TCOD_sys_save_screenshot(const char *filename) + @Py sys_save_screenshot(filename) + @C# static void TCODSystem::saveScreenshot(string filename); + @Lua tcod.system.saveScreenshot(filename) + @Param filename Name of the file. If NULL, a filename is automatically generated with the form "./screenshotNNN.png", NNN being the first free number (if a file named screenshot000.png already exist, screenshot001.png will be used, and so on...). + */ + static void saveScreenshot(const char *filename); + + /** + @PageName system_filesystem + @PageFather system + @PageTitle Filesystem utilities + @PageDesc Those are a few function that cannot be easily implemented in a portable way in C/C++. They have no python wrapper since python provides its own builtin functions. All those functions return false if an error occured. + @FuncTitle Create a directory + @Cpp static bool TCODSystem::createDirectory(const char *path) + @C bool TCOD_sys_create_directory(const char *path) + @Param path Directory path. The immediate father directory (/..) must exist and be writable. + */ + static bool createDirectory(const char *path); + + /** + @PageName system_filesystem + @FuncTitle Delete an empty directory + @Cpp static bool TCODSystem::deleteDirectory(const char *path) + @C bool TCOD_sys_delete_directory(const char *path) + @Param path directory path. This directory must exist, be writable and empty + */ + static bool deleteDirectory(const char *path); + + /** + @PageName system_filesystem + @FuncTitle Delete a file + @Cpp static bool TCODSystem::deleteFile(const char *path) + @C bool TCOD_sys_delete_file(const char *path) + @Param path File path. This file must exist and be writable. + */ + static bool deleteFile(const char *path); + + /** + @PageName system_filesystem + @FuncTitle Check if a path is a directory + @Cpp static bool TCODSystem::isDirectory(const char *path) + @C bool TCOD_sys_is_directory(const char *path) + @Param path a path to check + */ + static bool isDirectory(const char *path); + + /** + @PageName system_filesystem + @FuncTitle List files in a directory + @FuncDesc To get the list of entries in a directory (including sub-directories, except . and ..). + The returned list is allocated by the function and must be deleted by you. All the const char * inside must be also freed with TCODList::clearAndDelete. + @Cpp static TCODList TCODSystem::getDirectoryContent(const char *path, const char *pattern) + @C TCOD_list_t TCOD_sys_get_directory_content(const char *path) + @Param path a directory + @Param pattern If NULL or empty, returns all directory entries. Else returns only entries matching the pattern. The pattern is NOT a regular expression. It can only handle one '*' wildcard. Examples : *.png, saveGame*, font*.png + */ + static TCOD_list_t getDirectoryContent(const char *path, const char *pattern); + + /** + @PageName system_filesystem + @FuncTitle Check if a given file exists + @FuncDesc In order to check whether a given file exists in the filesystem. Useful for detecting errors caused by missing files. + @Cpp static bool TCODSystem::fileExists(const char *filename, ...) + @C bool TCOD_sys_file_exists(const char * filename, ...) + @Param filename the file name, using printf-like formatting + @Param ... optional arguments for filename formatting + @CppEx + if (!TCODSystem::fileExists("myfile.%s","txt")) { + fprintf(stderr,"no such file!"); + } + @CEx + if (!TCOD_sys_file_exists("myfile.%s","txt")) { + fprintf(stderr,"no such file!"); + } + */ + static bool fileExists(const char * filename, ...); + /** + @PageName system_filesystem + @FuncTitle Read the content of a file into memory + @FuncDesc This is a portable function to read the content of a file from disk or from the application apk (android). + buf must be freed with free(buf). + @Cpp static bool TCODSystem::readFile(const char *filename, unsigned char **buf, uint32 *size) + @C bool TCOD_sys_read_file(const char *filename, unsigned char **buf, uint32 *size) + @Param filename the file name + @Param buf a buffer to be allocated and filled with the file content + @Param size the size of the allocated buffer. + @CppEx + unsigned char *buf; + uint32 size; + if (TCODSystem::readFile("myfile.dat",&buf,&size)) { + // do something with buf + free(buf); + } + @CEx + if (TCOD_sys_read_file("myfile.dat",&buf,&size)) { + // do something with buf + free(buf); + } + */ + static bool readFile(const char *filename, unsigned char **buf, size_t *size); + /** + @PageName system_filesystem + @FuncTitle Write the content of a memory buffer to a file + @FuncDesc This is a portable function to write some data to a file. + @Cpp static bool TCODSystem::writeFile(const char *filename, unsigned char *buf, uint32 size) + @C bool TCOD_sys_write_file(const char *filename, unsigned char *buf, uint32 size) + @Param filename the file name + @Param buf a buffer containing the data to write + @Param size the number of bytes to write. + @CppEx + TCODSystem::writeFile("myfile.dat",buf,size)); + @CEx + TCOD_sys_write_file("myfile.dat",buf,size)); + */ + static bool writeFile(const char *filename, unsigned char *buf, uint32 size); + /** + @PageName system_sdlcbk + @PageFather system + @PageTitle Draw custom graphics on top of the root console + @PageDesc You can register a callback that will be called after the libtcod rendering phase, but before the screen buffer is swapped. This callback receives the screen SDL_Surface reference. + This makes it possible to use any SDL drawing functions (including openGL) on top of the libtcod console. + @FuncTitle Render custom graphics + @FuncDesc To disable the custom renderer, call the same method with a NULL parameter. + Note that to keep libtcod from requiring the SDL headers, the callback parameter is a void pointer. You have to include SDL headers and cast it to SDL_Surface in your code. + @Cpp + class TCODLIB_API ITCODSDLRenderer { + public : + virtual void render(void *sdlSurface) = 0; + }; + static void TCODSystem::registerSDLRenderer(ITCODSDLRenderer *callback); + @C + typedef void (*SDL_renderer_t) (void *sdl_surface); + void TCOD_sys_register_SDL_renderer(SDL_renderer_t callback) + @Py + def renderer ( sdl_surface ) : ... + TCOD_sys_register_SDL_renderer( callback ) + @Param callback The renderer to call before swapping the screen buffer. If NULL, custom rendering is disabled + @CppEx + class MyRenderer : public ITCODSDLRenderer { + public : + void render(void *sdlSurface) { + SDL_Surface *s = (SDL_Surface *)sdlSurface; + ... draw something on s + } + }; + TCODSystem::registerSDLRenderer(new MyRenderer()); + @CEx + void my_renderer( void *sdl_surface ) { + SDL_Surface *s = (SDL_Surface *)sdl_surface; + ... draw something on s + } + TCOD_sys_register_SDL_renderer(my_renderer); + @Py + def my_renderer(sdl_surface) : + ... draw something on sdl_surface using pygame + libtcod.sys_register_SDL_renderer(my_renderer) + */ + static void registerSDLRenderer(ITCODSDLRenderer *renderer); + + /** + @PageName system_sdlcbk + @FuncTitle Managing screen redraw + @FuncDesc libtcod is not aware of the part of the screen your SDL renderer has updated. If no change occured in the console, it won't redraw them except if you tell him to do so with this function + @Cpp void TCODConsole::setDirty(int x, int y, int w, int h) + @C void TCOD_console_set_dirty(int x, int y, int w, int h) + @Py TCOD_console_set_dirty(x, y, w, h) + @Param x,y,w,h Part of the root console you want to redraw even if nothing has changed in the console back/fore/char. + */ + + /** + @PageName system_misc + @PageFather system + @PageTitle Miscellaneous utilities + @FuncTitle Using a custom resolution for the fullscreen mode + @FuncDesc This function allows you to force the use of a specific resolution in fullscreen mode. + The default resolution depends on the root console size and the font character size. + @Cpp static void TCODSystem::forceFullscreenResolution(int width, int height) + @C void TCOD_sys_force_fullscreen_resolution(int width, int height) + @Py sys_force_fullscreen_resolution(width, height) + @C# static void TCODSystem::forceFullscreenResolution(int width, int height); + @Lua tcod.system.forceFullscreenResolution(width,height) + @Param width,height Resolution to use when switching to fullscreen. + Will use the smallest available resolution so that : + resolution width >= width and resolution width >= root console width * font char width + resolution width >= height and resolution height >= root console height * font char height + @CppEx + TCODSystem::forceFullscreenResolution(800,600); // use 800x600 in fullscreen instead of 640x400 + TCODConsole::initRoot(80,50,"",true); // 80x50 console with 8x8 char => 640x400 default resolution + @CEx + TCOD_sys_force_fullscreen_resolution(800,600); + TCOD_console_init_root(80,50,"",true); + @PyEx + libtcod.sys_force_fullscreen_resolution(800,600) + libtcod.console_init_root(80,50,"",True) + @LuaEx + tcod.system.forceFullscreenResolution(800,600) -- use 800x600 in fullscreen instead of 640x400 + tcod.console.initRoot(80,50,"",true) -- 80x50 console with 8x8 char => 640x400 default resolution + */ + static void forceFullscreenResolution(int width, int height); + + /** + @PageName system_misc + @FuncTitle Get current resolution + @FuncDesc You can get the current screen resolution with getCurrentResolution. You can use it for example to get the desktop resolution before initializing the root console. + @Cpp static void TCODSystem::getCurrentResolution(int *width, int *height) + @C void TCOD_sys_get_current_resolution(int *width, int *height) + @Py sys_get_current_resolution() # returns w,h + @C# static void TCODSystem::getCurrentResolution(out int w, out int h); + @Param width,height contains current resolution when the function returns + */ + static void getCurrentResolution(int *w, int *h); + /** + @PageName system_misc + @FuncTitle Get fullscreen offset + @FuncDesc If the fullscreen resolution does not matches the console size in pixels, black borders are added. This function returns the position in pixels of the console top left corner in the screen. + @Cpp static void TCODSystem::getFullscreenOffsets(int *offx, int *offy) + @C void TCOD_sys_get_fullscreen_offsets(int *offx, int *offy) + @C# static void TCODSystem::getFullscreenOffsets(out int offx, out int offy); + @Param offx,offy contains the position of the console on the screen when using fullscreen mode. + */ + static void getFullscreenOffsets(int *offx, int *offy); + /** + @PageName system_misc + @FuncTitle Get the font size + @FuncDesc You can get the size of the characters in the font + @Cpp static void TCODSystem::getCharSize(int *width, int *height) + @C void TCOD_sys_get_char_size(int *width, int *height) + @Py sys_get_char_size() # returns w,h + @C# static void TCODSystem::getCharSize(out int w, out int h); + @Param width,height contains a character size when the function returns + */ + static void getCharSize(int *w, int *h); + + /** + @PageName system_misc + @FuncTitle Dynamically updating the font bitmap + @FuncDesc You can dynamically change the bitmap of a character in the font. All cells using this ascii code will be updated at next flush call. + @Cpp static void TCODSystem::updateChar(int asciiCode, int fontx, int fonty,const TCODImage *img,int x,int y) + @C void TCOD_sys_update_char(int asciiCode, int fontx, int fonty, TCOD_image_t img, int x, int y) + @Py sys_update_char(asciiCode,fontx,fonty,img,x,y) + @Param asciiCode ascii code corresponding to the character to update + @Param fontx,fonty coordinate of the character in the bitmap font (in characters, not pixels) + @Param img image containing the new character bitmap + @Param x,y position in pixels of the top-left corner of the character in the image + */ + static void updateChar(int asciiCode, int fontx, int fonty,const TCODImage *img,int x,int y); + + /** + @PageName system_misc + @FuncTitle Dynamically change libtcod's internal renderer + @FuncDesc As of 1.5.1, libtcod contains 3 different renderers : + * SDL : historic libtcod renderer. Should work and be pretty fast everywhere + * OpenGL : requires OpenGL compatible video card. Might be much faster or much slower than SDL, depending on the drivers + * GLSDL : requires OpenGL 1.4 compatible video card with GL_ARB_shader_objects extension. Blazing fast if you have the proper hardware and drivers. + This function switches the current renderer dynamically. + @Cpp static void TCODSystem::setRenderer(TCOD_renderer_t renderer) + @C void TCOD_sys_set_renderer(TCOD_renderer_t renderer) + @Py sys_set_renderer(renderer) + @C# static void TCODSystem::setRenderer(TCODRendererType renderer); + @Param renderer Either TCOD_RENDERER_GLSL, TCOD_RENDERER_OPENGL or TCOD_RENDERER_SDL + */ + static void setRenderer(TCOD_renderer_t renderer); + + /** + @PageName system_misc + @FuncTitle Get the current internal renderer + @Cpp static TCOD_renderer_t TCODSystem::getRenderer() + @C TCOD_renderer_t TCOD_sys_get_renderer() + @Py sys_get_renderer() + @C# static TCODRendererType TCODSystem::getRenderer(); + */ + static TCOD_renderer_t getRenderer(); + + /** + @PageName system_clipboard + @PageTitle Clipboard integration + @PageDesc With these functions, you can copy data in your OS' clipboard from the game or retrieve data from the clipboard. + @PageFather system + @FuncTitle Copy data to the clipboard + @Cpp static void TCODSystem::setClipboard(const char *value) + @C void TCOD_sys_clipboard_set(const char *value) + @Param value Text to copy in the clipboard + */ + static void setClipboard(const char *value); + + /** + @PageName system_clipboard + @FuncTitle Paste data from the clipboard + @Cpp static char *TCODSystem::getClipboard() + @C char *TCOD_sys_clipboard_get() + */ + static char *getClipboard(); + + // thread stuff + static int getNumCores(); + static TCOD_thread_t newThread(int (*func)(void *), void *data); + static void deleteThread(TCOD_thread_t th); + static void waitThread(TCOD_thread_t th); + // mutex + static TCOD_mutex_t newMutex(); + static void mutexIn(TCOD_mutex_t mut); + static void mutexOut(TCOD_mutex_t mut); + static void deleteMutex(TCOD_mutex_t mut); + // semaphore + static TCOD_semaphore_t newSemaphore(int initVal); + static void lockSemaphore(TCOD_semaphore_t sem); + static void unlockSemaphore(TCOD_semaphore_t sem); + static void deleteSemaphore( TCOD_semaphore_t sem); + // condition + static TCOD_cond_t newCondition(); + static void signalCondition(TCOD_cond_t sem); + static void broadcastCondition(TCOD_cond_t sem); + static void waitCondition(TCOD_cond_t sem, TCOD_mutex_t mut); + static void deleteCondition( TCOD_cond_t sem); +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/tree.h b/tcod/tcod_sys/libtcod/include/tree.h new file mode 100644 index 00000000..ab0210eb --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/tree.h @@ -0,0 +1,40 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_TREE_H +#define _TCOD_TREE_H + +typedef struct _TCOD_tree_t { + struct _TCOD_tree_t *next; + struct _TCOD_tree_t *father; + struct _TCOD_tree_t *sons; +} TCOD_tree_t; + +TCODLIB_API TCOD_tree_t *TCOD_tree_new(); +TCODLIB_API void TCOD_tree_add_son(TCOD_tree_t *node, TCOD_tree_t *son); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/tree.hpp b/tcod/tcod_sys/libtcod/include/tree.hpp new file mode 100644 index 00000000..197a7377 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/tree.hpp @@ -0,0 +1,51 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_TREE_HPP +#define _TCOD_TREE_HPP + +class TCODLIB_API TCODTree { +public : + TCODTree *next; + TCODTree *father; + TCODTree *sons; + + TCODTree() : next(NULL),father(NULL),sons(NULL){} + void addSon(TCODTree *data) { + data->father=this; + TCODTree *lastson = sons; + while ( lastson && lastson->next ) lastson=lastson->next; + if ( lastson ) { + lastson->next=data; + } else { + sons=data; + } + } + +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/txtfield.h b/tcod/tcod_sys/libtcod/include/txtfield.h new file mode 100644 index 00000000..6e41bc62 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/txtfield.h @@ -0,0 +1,45 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef _TCOD_TEXT_H_ +#define _TCOD_TEXT_H_ + +typedef void * TCOD_text_t; + +TCODLIB_API TCOD_text_t TCOD_text_init(int x, int y, int w, int h, int max_chars); +TCODLIB_API TCOD_text_t TCOD_text_init2(int w, int h, int max_chars); +TCODLIB_API void TCOD_text_set_pos(TCOD_text_t txt, int x, int y); +TCODLIB_API void TCOD_text_set_properties(TCOD_text_t txt, int cursor_char, int blink_interval, const char * prompt, int tab_size); +TCODLIB_API void TCOD_text_set_colors(TCOD_text_t txt, TCOD_color_t fore, TCOD_color_t back, float back_transparency); +TCODLIB_API bool TCOD_text_update(TCOD_text_t txt, TCOD_key_t key); +TCODLIB_API void TCOD_text_render(TCOD_text_t txt, TCOD_console_t con); +TCODLIB_API const char * TCOD_text_get(TCOD_text_t txt); +TCODLIB_API void TCOD_text_reset(TCOD_text_t txt); +TCODLIB_API void TCOD_text_delete(TCOD_text_t txt); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/txtfield.hpp b/tcod/tcod_sys/libtcod/include/txtfield.hpp new file mode 100644 index 00000000..b3458503 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/txtfield.hpp @@ -0,0 +1,50 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_TEXT_HPP_ +#define _TCOD_TEXT_HPP_ + +#include "color.hpp" + +class TCODLIB_API TCODText { +public : + TCODText(int x, int y, int w, int h, int max_chars); + TCODText(int w, int h, int max_chars); + ~TCODText(); + void setProperties(int cursor_char, int blink_interval, const char * prompt, int tab_size); + void setColors(TCODColor fore, TCODColor back, float back_transparency); + void setPos(int x, int y); + bool update(TCOD_key_t key); + void render(TCODConsole * con); + const char *getText(); + void reset(); +protected : + TCOD_text_t data; +}; + + +#endif diff --git a/tcod/tcod_sys/libtcod/include/wrappers.h b/tcod/tcod_sys/libtcod/include/wrappers.h new file mode 100644 index 00000000..fe79284a --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/wrappers.h @@ -0,0 +1,148 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef WRAPPERS_H +#define WRAPPERS_H + +/* wrappers to ease other languages integration */ +typedef unsigned int colornum_t; + +/* color module */ +TCODLIB_API bool TCOD_color_equals_wrapper (colornum_t c1, colornum_t c2); +TCODLIB_API colornum_t TCOD_color_add_wrapper (colornum_t c1, + colornum_t c2); +TCODLIB_API colornum_t TCOD_color_subtract_wrapper (colornum_t c1, + colornum_t c2); +TCODLIB_API colornum_t TCOD_color_multiply_wrapper (colornum_t c1, + colornum_t c2); +TCODLIB_API colornum_t TCOD_color_multiply_scalar_wrapper (colornum_t c1, + float value); +TCODLIB_API colornum_t TCOD_color_lerp_wrapper(colornum_t c1, + colornum_t c2, float coef); +TCODLIB_API void TCOD_color_get_HSV_wrapper(colornum_t c,float * h, + float * s, float * v); +TCODLIB_API float TCOD_color_get_hue_ (colornum_t c); +TCODLIB_API float TCOD_color_get_saturation_ (colornum_t c); +TCODLIB_API float TCOD_color_get_value_ (colornum_t c); + +/* console module */ +/* TCODLIB_API void TCOD_console_set_custom_font_wrapper(const char *fontFile, + int char_width, int char_height, int nb_char_horiz, + int nb_char_vertic, bool chars_by_row, + colornum_t key_color); */ + +TCODLIB_API void TCOD_console_set_default_background_wrapper(TCOD_console_t con, + colornum_t col); +TCODLIB_API void TCOD_console_set_default_foreground_wrapper(TCOD_console_t con, + colornum_t col); +TCODLIB_API colornum_t TCOD_console_get_default_background_wrapper(TCOD_console_t con); +TCODLIB_API colornum_t TCOD_console_get_default_foreground_wrapper(TCOD_console_t con); +TCODLIB_API colornum_t TCOD_console_get_char_background_wrapper(TCOD_console_t con, + int x, int y); +TCODLIB_API void TCOD_console_set_char_background_wrapper(TCOD_console_t con,int x, int y, + colornum_t col, + TCOD_bkgnd_flag_t flag); +TCODLIB_API colornum_t TCOD_console_get_char_foreground_wrapper (TCOD_console_t con, + int x, int y); +TCODLIB_API void TCOD_console_set_char_foreground_wrapper(TCOD_console_t con,int x, int y, + colornum_t col); +TCODLIB_API void TCOD_console_put_char_ex_wrapper(TCOD_console_t con, int x, + int y, int c, colornum_t fore, colornum_t back); +TCODLIB_API void TCOD_console_set_fade_wrapper(uint8 val, colornum_t fade); +TCODLIB_API colornum_t TCOD_console_get_fading_color_wrapper(); +TCODLIB_API void TCOD_console_set_color_control_wrapper(TCOD_colctrl_t con, + colornum_t fore, + colornum_t back); +TCODLIB_API bool TCOD_console_check_for_keypress_wrapper(TCOD_key_t *holder, + int flags); +TCODLIB_API void TCOD_console_wait_for_keypress_wrapper(TCOD_key_t *holder, + bool flush); +TCODLIB_API uint32 TCOD_console_check_for_keypress_bitfield (int flags); +TCODLIB_API uint32 TCOD_console_wait_for_keypress_bitfield (bool flush); +TCODLIB_API void TCOD_console_fill_background(TCOD_console_t con, int *r, int *g, int *b); +TCODLIB_API void TCOD_console_fill_foreground(TCOD_console_t con, int *r, int *g, int *b); +TCODLIB_API void TCOD_console_fill_char(TCOD_console_t con, int *arr); + +TCODLIB_API void TCOD_console_double_hline(TCOD_console_t con,int x,int y, int l, + TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_double_vline(TCOD_console_t con,int x,int y, + int l, TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_print_double_frame(TCOD_console_t con,int x,int y, + int w,int h, bool empty, + TCOD_bkgnd_flag_t flag, + const char *fmt, ...); + +TCODLIB_API char *TCOD_console_print_return_string(TCOD_console_t con,int x, + int y, int rw, int rh, + TCOD_bkgnd_flag_t flag, + TCOD_alignment_t align, char *msg, + bool can_split, + bool count_only); +TCODLIB_API void console_set_key_color_wrapper (TCOD_console_t con, colornum_t c); + +/* image module */ + +TCODLIB_API void TCOD_image_clear_wrapper(TCOD_image_t image, + colornum_t color); +TCODLIB_API colornum_t TCOD_image_get_pixel_wrapper(TCOD_image_t image, + int x, int y); +TCODLIB_API colornum_t TCOD_image_get_mipmap_pixel_wrapper(TCOD_image_t image, + float x0,float y0, float x1, float y1); +TCODLIB_API void TCOD_image_put_pixel_wrapper(TCOD_image_t image,int x, int y, + colornum_t col); +TCODLIB_API void TCOD_image_set_key_color_wrapper(TCOD_image_t image, + colornum_t key_color); + +/* mouse module */ +TCODLIB_API void TCOD_mouse_get_status_wrapper(TCOD_mouse_t *holder); +TCODLIB_API int TCOD_mouse_get_x(); +TCODLIB_API int TCOD_mouse_get_y(); +TCODLIB_API int TCOD_mouse_get_cx(); +TCODLIB_API int TCOD_mouse_get_cy(); +TCODLIB_API int TCOD_mouse_get_dx(); +TCODLIB_API int TCOD_mouse_get_dy(); +TCODLIB_API int TCOD_mouse_get_dcx(); +TCODLIB_API int TCOD_mouse_get_dcy(); +TCODLIB_API uint32 TCOD_mouse_get_lbutton(); +TCODLIB_API uint32 TCOD_mouse_get_mbutton(); +TCODLIB_API uint32 TCOD_mouse_get_rbutton(); +TCODLIB_API uint32 TCOD_mouse_get_lbutton_pressed(); +TCODLIB_API uint32 TCOD_mouse_get_mbutton_pressed(); +TCODLIB_API uint32 TCOD_mouse_get_rbutton_pressed(); + +/* parser module */ +TCODLIB_API colornum_t TCOD_parser_get_color_property_wrapper(TCOD_parser_t parser, const char *name); + +/* namegen module */ +TCODLIB_API int TCOD_namegen_get_nb_sets_wrapper(); +TCODLIB_API void TCOD_namegen_get_sets_wrapper(char **sets); + +/* sys module */ +TCODLIB_API int TCOD_sys_get_current_resolution_x(); +TCODLIB_API int TCOD_sys_get_current_resolution_y(); + +#endif /* WRAPPERS_H */ + diff --git a/tcod/tcod_sys/libtcod/include/zip.h b/tcod/tcod_sys/libtcod/include/zip.h new file mode 100644 index 00000000..cba5b30d --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/zip.h @@ -0,0 +1,62 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_ZIP_H +#define _TCOD_ZIP_H + +typedef void *TCOD_zip_t; + +TCODLIB_API TCOD_zip_t TCOD_zip_new(); +TCODLIB_API void TCOD_zip_delete(TCOD_zip_t zip); + +/* output interface */ +TCODLIB_API void TCOD_zip_put_char(TCOD_zip_t zip, char val); +TCODLIB_API void TCOD_zip_put_int(TCOD_zip_t zip, int val); +TCODLIB_API void TCOD_zip_put_float(TCOD_zip_t zip, float val); +TCODLIB_API void TCOD_zip_put_string(TCOD_zip_t zip, const char *val); +TCODLIB_API void TCOD_zip_put_color(TCOD_zip_t zip, const TCOD_color_t val); +TCODLIB_API void TCOD_zip_put_image(TCOD_zip_t zip, const TCOD_image_t val); +TCODLIB_API void TCOD_zip_put_console(TCOD_zip_t zip, const TCOD_console_t val); +TCODLIB_API void TCOD_zip_put_data(TCOD_zip_t zip, int nbBytes, const void *data); +TCODLIB_API uint32 TCOD_zip_get_current_bytes(TCOD_zip_t zip); +TCODLIB_API int TCOD_zip_save_to_file(TCOD_zip_t zip, const char *filename); + +/* input interface */ +TCODLIB_API int TCOD_zip_load_from_file(TCOD_zip_t zip, const char *filename); +TCODLIB_API char TCOD_zip_get_char(TCOD_zip_t zip); +TCODLIB_API int TCOD_zip_get_int(TCOD_zip_t zip); +TCODLIB_API float TCOD_zip_get_float(TCOD_zip_t zip); +TCODLIB_API const char *TCOD_zip_get_string(TCOD_zip_t zip); +TCODLIB_API TCOD_color_t TCOD_zip_get_color(TCOD_zip_t zip); +TCODLIB_API TCOD_image_t TCOD_zip_get_image(TCOD_zip_t zip); +TCODLIB_API TCOD_console_t TCOD_zip_get_console(TCOD_zip_t zip); +TCODLIB_API int TCOD_zip_get_data(TCOD_zip_t zip, int nbBytes, void *data); +TCODLIB_API uint32 TCOD_zip_get_remaining_bytes(TCOD_zip_t zip); +TCODLIB_API void TCOD_zip_skip_bytes(TCOD_zip_t zip, uint32 nbBytes); + +#endif + diff --git a/tcod/tcod_sys/libtcod/include/zip.hpp b/tcod/tcod_sys/libtcod/include/zip.hpp new file mode 100644 index 00000000..f799db99 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/zip.hpp @@ -0,0 +1,331 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_ZIP_HPP +#define _TCOD_ZIP_HPP + +/** + @PageName zip + @PageCategory Base toolkits + @PageTitle Compression toolkit + @PageDesc This toolkit provides functions to save or read compressed data from a file. While the module is named Zip, it has nothing to do with the .zip format as it uses zlib compression (.gz format). + Note that this modules has no python wrapper. Use python built-in zip module instead. + + You can use the compression buffer in two modes: + * put data in the buffer, then save it to a file, + * load a file into the buffer, then get data from it. + */ +class TCODLIB_API TCODZip { +public : + + /** + @PageName zip_init + @PageFather zip + @PageTitle Creating a compression buffer + @FuncDesc This function initializes a compression buffer. + @Cpp TCODZip::TCODZip() + @C TCOD_zip_t TCOD_zip_new() + */ + TCODZip(); + + /** + @PageName zip_init + @FuncDesc Once you don't need the buffer anymore, you can release resources. Note that the adresses returned by the getString function are no longer valid once the buffer has been destroyed. + @Cpp TCODZip::~TCODZip() + @C void TCOD_zip_delete(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + @CppEx + TCODZip *zip = new TCODZip(); + zip->loadFromFile("myCompressedFile.gz"); + char c=zip->getChar(); + int i=zip->getInt(); + float f= zip->getFloat(); + const char *s=strdup(zip->getString()); // we duplicate the string to be able to use it after the buffer deletion + zip->getData(nbBytes, dataPtr); + delete zip; + @CEx + TCOD_zip_t zip=TCOD_zip_new(); + TCOD_zip_load_from_file(zip,"myCompressedFile.gz"); + char c=TCOD_zip_get_char(zip); + int i=TCOD_zip_get_int(zip); + float f=TCOD_zip_get_float(zip); + const char *s=strdup(TCOD_zip_get_string(zip)); + TCOD_zip_get_data(zip,nbBytes, dataPtr); + TCOD_zip_delete(zip); + */ + ~TCODZip(); + + /** + @PageName zip_put + @PageFather zip + @PageTitle Using the buffer in output mode + @FuncTitle Putting a char in the buffer + @Cpp void TCODZip::putChar(char val) + @C void TCOD_zip_put_char(TCOD_zip_t zip, char val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val A 8 bits value to store in the buffer + */ + void putChar(char val); + + /** + @PageName zip_put + @FuncTitle Putting an integer in the buffer + @Cpp void TCODZip::putInt(int val) + @C void TCOD_zip_put_int(TCOD_zip_t zip, int val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val An integer value to store in the buffer + */ + void putInt(int val); + + /** + @PageName zip_put + @FuncTitle Putting a floating point value in the buffer + @Cpp void TCODZip::putFloat(float val) + @C void TCOD_zip_put_float(TCOD_zip_t zip, float val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val A float value to store in the buffer + */ + void putFloat(float val); + + /** + @PageName zip_put + @FuncTitle Putting a string in the buffer + @Cpp void TCODZip::putString(const char *val) + @C void TCOD_zip_put_string(TCOD_zip_t zip, const char *val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val A string to store in the buffer + */ + void putString(const char *val); + + /** + @PageName zip_put + @FuncTitle Putting a color in the buffer + @Cpp void TCODZip::putColor(const TCODColor *val) + @C void TCOD_zip_put_color(TCOD_zip_t zip, const TCOD_color_t val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val A color to store in the buffer + */ + void putColor(const TCODColor *val); + + /** + @PageName zip_put + @FuncTitle Putting an image in the buffer + @Cpp void TCODZip::putImage(const TCODImage *val) + @C void TCOD_zip_put_image(TCOD_zip_t zip, const TCOD_image_t val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val An image to store in the buffer + */ + void putImage(const TCODImage *val); + + /** + @PageName zip_put + @FuncTitle Putting a console in the buffer + @Cpp void TCODZip::putConsole(const TCODConsole *val) + @C void TCOD_zip_put_console(TCOD_zip_t zip, const TCOD_console_t val) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param val A console to store in the buffer + */ + void putConsole(const TCODConsole *val); + + /** + @PageName zip_put + @FuncTitle Putting some custom data in the buffer + @Cpp void TCODZip::putData(int nbBytes, const void *data) + @C void TCOD_zip_put_data(TCOD_zip_t zip, int nbBytes, const void *data) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param nbBytes Number of bytes to store in the buffer + @Param val Address of the data to store in the buffer + */ + void putData(int nbBytes, const void *data); + + /** + @PageName zip_put + @FuncTitle Reading the number of (uncompressed) bytes in the buffer + @Cpp uint32 TCODZip::getCurrentBytes() + @C uint32 TCOD_zip_get_current_bytes(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + uint32 getCurrentBytes() const; + + /** + @PageName zip_put + @FuncTitle Saving the buffer on disk + @FuncDesc Once you have finished adding data in the buffer, you can compress it and save it in a file. + The function returns the number of (uncompressed) bytes saved. + @Cpp int TCODZip::saveToFile(const char *filename) + @C int TCOD_zip_save_to_file(TCOD_zip_t zip, const char *filename) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param filename Name of the file + @CppEx + TCODZip zip; + zip.putChar('A'); + zip.putInt(1764); + zip.putFloat(3.14f); + zip.putString("A string"); + zip.putData(nbBytes, dataPtr); + zip.saveToFile("myCompressedFile.gz"); + @CEx + TCOD_zip_t zip=TCOD_zip_new(); + TCOD_zip_put_char(zip,'A'); + TCOD_zip_put_int(zip,1764); + TCOD_zip_put_float(zip,3.14f); + TCOD_zip_put_string(zip,"A string"); + TCOD_zip_put_data(zip,nbBytes, dataPtr); + TCOD_zip_save_to_file(zip,"myCompressedFile.gz"); + */ + int saveToFile(const char *filename); + + /** + @PageName zip_load + @PageTitle Using the buffer in input mode + @PageFather zip + @FuncTitle Reading from a compressed file + @FuncDesc You can read data from a file (compressed or not) into the buffer. + The function returns the number of (uncompressed) bytes read or 0 if an error occured. + @Cpp int TCODZip::loadFromFile(const char *filename) + @C int TCOD_zip_load_from_file(TCOD_zip_t zip, const char *filename) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param filename Name of the file + */ + int loadFromFile(const char *filename); + + /** + @PageName zip_load + @FuncTitle Reading a char from the buffer + @Cpp char TCODZip::getChar() + @C char TCOD_zip_get_char(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor + */ + char getChar(); + + /** + @PageName zip_load + @FuncTitle Reading an integer from the buffer + @Cpp int TCODZip::getInt() + @C int TCOD_zip_get_int(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + int getInt(); + + /** + @PageName zip_load + @FuncTitle Reading a floating point value from the buffer + @Cpp float TCODZip::getFloat() + @C float TCOD_zip_get_float(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + float getFloat(); + + /** + @PageName zip_load + @FuncTitle Reading a string from the buffer + @FuncDesc The address returned is in the buffer. It is valid as long as you don't destroy the buffer. + @Cpp const char *TCODZip::getString() + @C const char *TCOD_zip_get_string(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + const char *getString(); + + /** + @PageName zip_load + @FuncTitle Reading a color from the buffer + @Cpp TCODColor TCODZip::getColor() + @C TCOD_color_t TCOD_zip_get_color(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + TCODColor getColor(); + + /** + @PageName zip_load + @FuncTitle Reading a color from the buffer + @Cpp TCODImage *TCODZip::getImage() + @C TCOD_image_t TCOD_zip_get_image(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + TCODImage *getImage(); + + /** + @PageName zip_load + @FuncTitle Reading a console from the buffer + @Cpp TCODConsole *TCODZip::getConsole() + @C TCOD_console_t TCOD_zip_get_console(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + TCODConsole *getConsole(); + + /** + @PageName zip_load + @FuncTitle Reading some custom data from the buffer + @FuncDesc Note that the getData length must match the length of the data when the file was created (with putData). + The function returns the number of bytes that were stored in the file by the putData call. If more than nbBytes were stored, the function read only nbBytes and skip the rest of them. + @Cpp int TCODZip::getData(int nbBytes, void *data) + @C int TCOD_zip_get_data(TCOD_zip_t zip, int nbBytes, void *data) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param nbBytes Number of bytes to read + @Param data Address of a pre-allocated buffer (at least nbBytes bytes) + @CppEx + TCODZip zip; + zip.loadFromFile("myCompressedFile.gz"); + char c=zip.getChar(); + int i=zip.getInt(); + float f= zip.getFloat(); + const char *s=zip.getString(); + zip.getData(nbBytes, dataPtr); + @CEx + TCOD_zip_t zip=TCOD_zip_new(); + TCOD_zip_load_from_file(zip,"myCompressedFile.gz"); + char c=TCOD_zip_get_char(zip); + int i=TCOD_zip_get_int(zip); + float f=TCOD_zip_get_float(zip); + const char *s=TCOD_zip_get_string(zip); + TCOD_zip_get_data(zip,nbBytes, dataPtr); + */ + int getData(int nbBytes, void *data); + + /** + @PageName zip_load + @FuncTitle Getting the number of remaining bytes in the buffer + @Cpp uint32 TCODZip::getRemainingBytes() const + @C uint32 TCOD_zip_get_remaining_bytes(TCOD_zip_t zip) + @Param zip In the C version, the buffer handler, returned by the constructor. + */ + uint32 getRemainingBytes() const; + + /** + @PageName zip_load + @FuncTitle Skiping some bytes in the buffer + @Cpp void TCODZip::skipBytes(uint32 nbBytes) + @C void TCOD_zip_skip_bytes(TCOD_zip_t zip, uint32 nbBytes) + @Param zip In the C version, the buffer handler, returned by the constructor. + @Param nbBytes number of uncompressed bytes to skip + */ + void skipBytes(uint32 nbBytes); +protected : + TCOD_zip_t data; +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/lib/donotremove b/tcod/tcod_sys/libtcod/lib/donotremove new file mode 100644 index 00000000..e69de29b diff --git a/tcod/tcod_sys/libtcod/libtcod-CHANGELOG.txt b/tcod/tcod_sys/libtcod/libtcod-CHANGELOG.txt new file mode 100644 index 00000000..5dc8028c --- /dev/null +++ b/tcod/tcod_sys/libtcod/libtcod-CHANGELOG.txt @@ -0,0 +1,491 @@ +X API break ++ new features +% modified features +- removed features, fixed bugs +========================================================= +1.5.2 : ? ++ added mid point displacement algorithm to the heightmap toolkit ++ added TCODConsole::hasMouseFocus() and TCODConsole::isActive() ++ added TCODParser::hasProperty to check if a property is defined when + using the default parser ++ added TCODText::setPos(int x, int y) +- fixed TCODConsole::waitForKeypress returning for both press and release events (returns only on press) +- fixed dynamic font switching not working +- fixed TCOD_image_blit_rect not working with odd width/height +- fixed TCODK_RWIN/TCODK_LWIN not detected +- fixed TCOD_sys_wait_event not returning on mouse events +- fixed mouse dcx/dcy fields always 0 when the cursor moves slowly +- fixed crash in python console_map_ascii_codes_to_font +========================================================= +1.5.1 : 2012 Aug 29 +X TCOD_console_wait_for_keypress, TCOD_console_check_for_keypress, TCOD_mouse_get_status + replaced with TCOD_sys_check_for_event and TCOD_sys_wait_for_event +X source width and height can be 0 in TCODConsole::blit to blit the whole console +X Some of the parser-related functions now can be chained. +X The RNG API now has less functions that choose the distribution based on the set flags. +X The noise API now has less functions that choose the noise type based on the set flags. +X Console default and cell foreground and background colour getters and setters renamed to more intuitive names: + * TCOD_console_set_background_color => TCOD_console_set_default_background + * TCOD_console_set_foreground_color => TCOD_console_set_default_foreground + * TCOD_console_get_background_color => TCOD_console_get_default_background + * TCOD_console_get_foreground_color => TCOD_console_get_default_foreground + * TCOD_console_set_back => TCOD_console_set_char_background + * TCOD_console_set_fore => TCOD_console_set_char_foreground + * TCOD_console_get_back => TCOD_console_get_char_background + * TCOD_console_get_fore => TCOD_console_get_char_foreground + * setBackgroundColor => setDefaultBackground + * setForegroundColor => setDefaultForeground + * getBackgroundColor => getDefaultBackground + * getForegroundColor => getDefaultForeground + * setBack => setCharBackground + * setFore => setCharForeground + * getBack => getCharBackground + * getFore => getCharForeground +X TCODConsole::printLeft/Right/Center replaced by + TCODConsole::setBackgroundFlag(TCOD_bkgnd_flag_t) + TCODConsole::setAlignment(TCOD_alignment_t) + TCODConsole::print(int x, int y, const char *fmt, ...) + TCODConsole::printEx(int x, int y, TCOD_bkgnd_flag_t bkgnd, TCOD_alignment_t alignment, const char *fmt, ...) + added TCOD_BKGND_DEFAULT as default value in rect / putChar / hline / vline / setBack + the default background flag for a console is BKGND_NONE + Warning ! That mean the rect/putChar/... functions now default to BKGND_NONE + instead of BKGND_SET, except if you call setBackgroundFlag before using them. +X TCODConsole::getHeightLeft/Right/CenterRect replaced by + TCODConsole::getHeightRect(int x, int y, int w, int h, const char *fmt, ...); + (the 3 functions were useless, the height does not depend on the alignement... X( ) +X TCODConsole::initRoot has an additional renderer parameter : + static void TCODConsole::initRoot(int w, int h, const char * title, bool fullscreen = false, + TCOD_renderer_t renderer=TCOD_RENDERER_SDL); + Possible values : TCOD_RENDERER_GLSL, TCOD_RENDERER_OPENGL or TCOD_RENDERER_SDL +X TCODMap::clear now sets walkable and transparent status of all cells: + void TCODMap::clear (bool transparent = false, bool walkable = false) + void TCOD_map_clear (TCOD_map_t map, bool transparent, bool walkable) + map_clear (map, transparent, walkable) ++ cmake compilation works on FreeBSD thanks to namor_ ++ added support for python3k. The samples run with python 3.2.3 ++ added support for colored tiles. Standard font characters MUST only use greyscale colors. ++ added native support for .ASC and .APF file (Ascii Paint format) + * TCODConsole::TCODConsole(const char *filename) + * bool TCODConsole::loadAsc(const char *filename) + * bool TCODConsole::saveAsc(const char *filename) const + * bool TCODConsole::loadApf(const char *filename) + * bool TCODConsole::saveApf(const char *filename) const ++ added mouse wheel support in TCOD_mouse_t.wheel_up/wheel_down ++ added TCODSystem::fileExists function for checking whether a given file exists ++ added dice to the TCODRandom toolkit ++ added support for dynamic property declaration in the parser ++ added TCODList::reverse(), TCODPath::reverse(), TCODDijkstra::reverse() ++ added weighted Gaussian distribution RNG ++ added Gaussian distribution RNG with no minimum/maximum bounds (using only mean and standard deviance) ++ added clipboard support in TCODSystem (on Linux, only X clipboard supported) ++ added GLSL and OpenGL(fixed pipeline) renderer (FPS increased 880% on true color sample !!!) ++ added libtcod.cfg (allows the player to tweaks libtcod overriding the game presets) ++ added more TCOD_CHAR_* constants ++ added TCODColor::scaleHSV (saturation and value scaling) ++ added TCODColor::shiftHue (hue shifting up and down) ++ added a TCODColor constructor for HSV values ++ added TCODColor H, S and V separate getters and setters ++ added TCODColor::rotate90 ++ added native Mac OSX support ++ added support for quote-less HTML color values in the parser (col=#FFFFFF instead of col="#FFFFFF") ++ added color control helpers for C# (TCODConsole.getColorControlString/getRGBColorControlString) +% Restrictive FOV algo updated to MRPAS v1.1 (faster, better-looking, improved symmetry) +% Gaussian distribution in TCODRandom now uses a more precise Box-Muller transform algorithm +% More default values for printFrame : + void printFrame(int x,int y,int w,int h, bool clear=true, TCOD_bkgnd_flag_t flag = TCOD_BKGND_DEFAULT, const char *fmt=NULL, ...) +% hardened fov module +% extended list of colour constants (the old names can produce slightly different colours) +% TCODMap memory consumption divided by 4 +% now mouse wheel events are properly detected +- fixed namegen crash if generator list is empty +- fixed permissive fov when light_walls is false +- fixed possible crash when clearing an offscreen console before calling initRoot +- fix possible crash when printing a string containing ascii codes > 127 +- fixed TCODNamegen returning integers in the python version +- fixed TCODDijkstra segfault when diagonal movement cost was zero +- fixed setDirty() not working for the last row or column of the console +- fixed python samples not compiling if numpy installed +- fixed python TCOD_parser_get_list_property +- fixed TCODDijkstra destructor crash bug +- fixed TCODColor::setHSV bug when using hues below 0 or above 359 grades +- fixed some rare issues in A* pathfinding +- fixed issue in TCODImage::blit2x when blitting only a subregion of the image +- fixed memory leak in TCODImage::save +========================================================= +1.5.0 : 2010 Feb 15 +X TCODRandom::getIntFromByteArray has been deleted +X the random number generator module now support two algorithms (Mingos) + Mersenne twister, used in previous versions of libtcod + Complementary Multiply With Carry, 2 to 3 times faster and has a much better period. This is the default algo. + You can choose the algorithm in the constructor : + typedef enum { + TCOD_RNG_MT, + TCOD_RNG_CMWC + } TCOD_random_algo_t; + TCODRandom() => CMWC, default seed + TCODRandom(uint32 seed) => CMWC, custom seed + TCODRandom(TCOD_random_algo_t algo) => default seed, custom algo + TCODRandom(uint32 seed, TCOD_random_algo_t aldo) => custom algo and seed +X removed bitfield from TCOD_key_t and TCOD_mouse_t to ease wrappers writing. + existing working wrappers might be broken, though. +X TCODConsole::printFrame now takes an extra argument: TCOD_bkgnd_flag_t +X renamed libraries on Linux to improve portability : + libtcod++.so => libtcodxx.so + libtcod-gui.so => libtcodgui.so ++ added text field toolkit (undocumented) ++ added functions for fast python full console coloring: + console_fill_foreground(con,r,g,b) + console_fill_background(con,r,g,b) + r,g,b are 1D arrays of console_width * console_height ++ added fast python rendering sample (Jotaf) ++ added TCODConsole::resetCredits() to restart credits animation before it's finished ++ added TCODConsole::setDirty(int x, int y, int w,int h) to force libtcod to redraw a part of the console + This might by needed when using the SDL renderer ++ added TCODSystem::getCharSize(int *w, int *h) to get the current font's character size ++ added name generation module (Mingos) ++ added Dijkstra pathfinding (Mingos) ++ added approximated gaussian distribution functions in the RNG module + float TCODRandom::getGaussian(float min, float max) ++ added subcell resolution blitting function TCODImage::blit2x ++ added more portable filesystem utilities : + static bool TCODSystem::isDirectory(const char *path) + static TCODList TCODSystem::getDirectoryContent(const char *path, const char *pattern) ++ added TCODConsole::putCharEx(int x, int y, int c, TCODColor &fore, TCODColor &back) (at last!) ++ added waitThread and thread conditions support in (undocumented) threading api ++ added unicode support and 4 unicode fonts courtesy of Mingos. Functions with unicode support are : + static void TCODConsole::mapStringToFont(const wchar_t *s, int fontCharX, int fontCharY); + void TCODConsole::printLeft(int x, int y, TCOD_bkgnd_flag_t flag, const wchar_t *fmt, ...); + void TCODConsole::printRight(int x, int y, TCOD_bkgnd_flag_t flag, const wchar_t *fmt, ...); + void TCODConsole::printCenter(int x, int y, TCOD_bkgnd_flag_t flag, const wchar_t *fmt, ...); + int TCODConsole::printLeftRect(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, const wchar_t *fmt, ...); + int TCODConsole::printRightRect(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, const wchar_t *fmt, ...); + int TCODConsole::printCenterRect(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, const wchar_t *fmt, ...); + int TCODConsole::getHeightLeftRect(int x, int y, int w, int h, const wchar_t *fmt, ...); + int TCODConsole::getHeightRightRect(int x, int y, int w, int h, const wchar_t *fmt, ...); + int TCODConsole::getHeightCenterRect(int x, int y, int w, int h,const wchar_t *fmt, ...); + C versions of the functions have _utf suffixes. Unicode fonts are : + fonts/consolas_unicode_10x10.png + fonts/consolas_unicode_12x12.png + fonts/consolas_unicode_16x16.png + fonts/consolas_unicode_8x8.png +% new compilation system with a debug and release version of the library +% makefiles have been moved to a makefiles subdirectory +% libtcod credits now use subcell resolution +- fixed wrong ascii code returned by check/waitForKeypress with AltGr+0-9 combination +- fixed RNG going mad if you delete the default RNG +- fixed wait_for_keypress not working in python +- now the parser can handle strings/identifiers with unlimited size (previously limited to 256 chars) +- fixed TCODZip module missing from MSVC release +- fixed issue with TCOD_COLCTRL_FORE_RGB and TCOD_COLCTRL_BACK_RGB when using 10 or 37 in rgb values +- fixed issue in color_set_hsv python wrapper +- fixed bug in console blitting when destination coordinates are outside the destination console +========================================================= +1.4.2 : 2009 Oct 06 +X TCODConsole::blit now takes 2 float parameters : + static void blit(const TCODConsole *src,int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole *dst, int xDst, int yDst, float foreground_alpha=1.0f, float background_alpha=1.0f) ++ added possiblity to use SDL drawing functions on top of the root console with TCODSystem::registerSDLRenderer ++ added Mingos' restrictive precise angle shadowcasting fov algorithm as FOV_RESTRICTIVE ++ heightmap : added missing TCOD_heightmap_set_value function ++ new consolas, dejavu, lucida and prestige fonts from Mingos +- fixed R/B inversion in color operations in python +- fixed a crash when saving a TCODImage before initializing the root console +- fixed a crash when destroying an empty TCODZip (file not found) +- fixed torch effect in C++ sample +- fixed ASCII_IN_ROW flag not working +- fixed path_new_using_function not working in python wrapper +- fixed alignment issues in TCOD_console_print_* with strings containing ascii codes > 127 +- fixed color controls not working with autowrap +- fixed fov post-processing step to handle opaque walkable cells (for example bush) +========================================================= +1.4.1 : 2009 Mar 22 +X Default colors have been changed/added. +X TCODMap::computeFov changed to support several algorithms : + void computeFov(int playerX,int playerY, int maxRadius,bool light_walls = true, TCOD_fov_algorithm_t algo = FOV_BASIC) + available algorithms : + FOV_BASIC : classic libtcod fov + FOV_DIAMOND : http://www.geocities.com/temerra/los_rays.html + FOV_SHADOW : http://roguebasin.roguelikedevelopment.org/index.php?title=FOV_using_recursive_shadowcasting + FOV_PERMISSIVE : http://roguebasin.roguelikedevelopment.org/index.php?title=Precise_Permissive_Field_of_View + light_walls : if false, wall cells are not put in the fov +X setCustomFont changed : + defines the font number of characters instead of character size + if not specified, it is deduced from the layout flag (16x16 for ascii, 32x8 for tcod) + setCustomFont(const char *fontFile, int flags=TCOD_FONT_LAYOUT_ASCII_INCOL,int nbCharHoriz=0, int nbCharVertic=0) + The flag values have changed too: + TCOD_FONT_LAYOUT_ASCII_INCOL=1, + TCOD_FONT_LAYOUT_ASCII_INROW=2, + TCOD_FONT_TYPE_GREYSCALE=4, + TCOD_FONT_TYPE_GRAYSCALE=4, + TCOD_FONT_LAYOUT_TCOD=8, ++ added python wrapper ++ added arial, courier fonts courtesy of Mingos ++ added some non portable filesystem utilities in TCODSystem : + bool TCODSystem::createDirectory(const char *path); + bool TCODSystem::deleteDirectory(const char *path); + bool TCODSystem::deleteFile(const char *path); ++ added multithread utilities in TCODSystem : + static TCOD_thread_t TCODSystem::newThread(int (*func)(void *), void *data); + static void TCODSystem::deleteThread(TCOD_thread_t th); + static TCOD_mutex_t TCODSystem::newMutex(); + static void TCODSystem::mutexIn(TCOD_mutex_t mut); + static void TCODSystem::mutexOut(TCOD_mutex_t mut); + static void TCODSystem::deleteMutex(TCOD_mutex_t mut); + static TCOD_semaphore_t TCODSystem::newSemaphore(int initVal); + static void TCODSystem::lockSemaphore(TCOD_semaphore_t sem); + static void TCODSystem::unlockSemaphore(TCOD_semaphore_t sem); + static void TCODSystem::deleteSemaphore( TCOD_semaphore_t sem); ++ added some image utilities : + void TCODImage::clear(const TCODColor col) + void TCODImage::invert() + void TCODImage::hflip() + void TCODImage::vflip() + void TCODImage::scale(int neww, int newh) + void TCODImage::setKeyColor(const TCODColor keyColor) + int TCODImage::getAlpha(int x,int y) const + bool TCODImage::isPixelTransparent(int x, int y) const ++ can now dynamically modify the content of the font bitmap : + static void TCODSystem::updateChar(int asciiCode, int fontx, int fonty,const TCODImage *img,int x,int y) ++ added C and python code generation in the heightmap tool ++ added function to calculate the height of a printed string (with autowrapping) + without actually printing it : + int TCODConsole::getHeightLeftRect(int x, int y, int w, int h, const char *fmt, ...) + int TCODConsole::getHeightRightRect(int x, int y, int w, int h, const char *fmt, ...) + int TCODConsole::getHeightCenterRect(int x, int y, int w, int h, const char *fmt, ...) ++ parser : now strings properties can be splitted. The parser concatenates them : + myProperty = "string value can use " + "multi line layout" ++ parser : added missing getCharProperty when using default listener ++ heightmap : added missing TCOD_heightmap_get_value function ++ now support fonts with unlimited number of characters (was limited to 1024 in 1.4.0) ++ added callback-based atomic bresenham function + static bool TCODLine::line(int xFrom, int yFrom, int xTo, int yTo, TCODLineListener *listener) ++ added TCODMap::copy function ++ added TCODList fast remove functions (don't preserve the list order) + template void TCODList::removeFast(const T elt) + template T * TCODList::removeFast(T *elt) +% pathfinding : you don't need to provide coordinates in x,y parameters of Path::walk +% improved double/simple walls special characters in tcod layout fonts +- fixed SDL dependant features not being available before initRoot is called. + If you want to draw on an offscreen console without calling initRoot, you + need to call at least setCustomFont to initialize the font. Else characters won't be rendered. +- fixed standalone credits page erasing previously fps limit +- fixed special characters TCOD_CHAR_DTEE* and TCOD_CHAR_DCROSS not printing correctly +- fixed heightmap tool generated code not compiling +- fixed parser C++ error function not prepending file name & line number to the error message +- fixed memory leak in pathfinding +- fixed fov issue with walkable, non transparent cells +- fixed numerical stability issues with heightmap rain erosion +- fixed calculation error in heightmap kernel transformation function +- fixed TCODConsole::renderCredits being able to render the credits only once +- fixed mouse cx,cy coordinates in "padded" fullscreen modes +- fixed mouse cursor hidden when switching fullscreen +- fixed mouse coordinates when going fullscreen->windowed +========================================================= +1.4.0 : 2008 Oct 16 +X Noise functions renamed : + TCODNoise::getNoise -> TCODNoise::getPerlin + TCODNoise::getFbm -> TCODNoise::getFbmPerlin + TCODNoise::getTurbulence -> TCODNoise::getTurbulencePerlin +X Some special char constants (TCOD_CHAR_xxx) added/removed +X setCustomFont changed : + setCustomFont(const char *fontFile,int charWidth=8, int charHeight=8, int flags=0) + flags : + TCOD_FONT_LAYOUT_ASCII_INROW=1 + TCOD_FONT_TYPE_GREYSCALE=2 + TCOD_FONT_LAYOUT_TCOD=4 ++ added pathfinding module ++ added BSP module ++ added heightmap module + heightmap tool ++ added compression toolkit ++ added possibility to pre-allocate TCODList's memory ++ added support for PNG images + antialiased fonts from PNG with alpha channel or greyscale ++ added ASCII mapping functions to map an ascii code to any character in your font : + static void TCODConsole::mapAsciiCodeToFont(int asciiCode, int fontCharX, int fontCharY); + static void TCODConsole::mapAsciiCodesToFont(int firstAsciiCode, int nbCodes, int fontCharX, int fontCharY); + static void TCODConsole::mapStringToFont(const char *s, int fontCharX, int fontCharY); ++ parser : now strings can contain octal/hexadecimal ascii values + myStringProperty1 = "embedded hex value : \x80" + myStringProperty2 = "embedded octal value : \200" ++ parser : now can handle list properties. + myStruct { + myProperty = [ 1, 2, 3 ] + } + to declare : struct.addListProperty("myProperty",TCOD_TYPE_INT,true); + to read (default parser) : TCODList prop( parser.getListProperty("myStruct.myProperty",TCOD_TYPE_INT) ); ++ added color map generator. Interpolate colors from an array of key colors : + TCODColor::genMap(TCODColor *map, int nbKey, TCODColor const *keyColor, int const *keyIndex) ++ added random generator backup function. You can save the state of a generator with + TCODRandom *TCODRandom::save() + and restore it with + void TCODRandom::restore(const TCODRandom *backup) ++ added simplex noise, similar to perlin but faster, especially in 4 dimensions and has better contrast : + TCODNoise::getSimplex + TCODNoise::getFbmSimplex + TCODNoise::getTurbulenceSimplex + Simplex should be prefered over Perlin for most usages. ++ added wavelet noise, similar to perlin, much slower but doesn't blur at high scales. Doesn't work in 4D : + TCODNoise::getWavelet + TCODNoise::getFbmWavelet + TCODNoise::getTurbulenceWavelet + Noise functions relative times : + 2D 3D 4D + simplex : 1 1 1 + perlin : 4 5 17 + wavelet : 32 14 X ++ you can capture a console to an existing image without creating a new image with TCODImage::refreshConsole ++ non rectangular offscreen consoles : + you can define a key color on offscreen consoles. Cells for which background color = key color are not blitted ++ added libtcod credits function. You can either call : + TCODConsole::credits() to print the credits page at the start of your game (just after initRoot) + or + bool TCODConsole::renderCredits(int x, int y, bool alpha) to print the credits on top of one of your + existing page (your game menu for example). Call it until it returns true. +% improved TCODConsole::flush performances : + frames per second for sample "True colors" (terminal.png font) on my reference computer (windowed mode) : + libtcod 1.3.2 : 130 + libtcod 1.4.0 : 300 +% TCODNoise::getTurbulence is twice faster +% improved mouse click detection. Even with a low framerate, mouse clicks will allways be detected and + reported in the Xbutton_pressed fields of TCOD_mouse_t. +% you don't need anymore to provide values in TCODLine::step parameters +- fixed memory leak in image module +- fixed DELETE and INSERT keys not detected +- fixed a rendering bug when using a white background color before any other background color +========================================================= +1.3.2 : 2008 Jul 14 ++ added documentation for the generic container module TCODList +- fixed not being able to open and close the root console more than once +- fixed parser not being able to attach a sub-structure to more than one structure +- fixed TCOD_image_from_console not working with root console on C version +- fixed TCODParser::newStruct, addFlag, addProperty handling only static names +- fixed web color parser (#rrggbb) in the parser module +- fixed TCODImage constructor / TCOD_image_new crashing if root console not initialized +- fixed mouse status not updated if the keyboard events are not read with checkForKeypress/waitForKeypress +- fixed fbm, turbulence functions returning NaN for high octaves values +========================================================= +1.3.1 : 2008 Jun 05 ++ now TCODConsole::putChar/setChar can use ascii code > 255 (ok, it's no more an ascii code, then) + this allows you to use fonts with more than 255 characters. ++ added default parser listener for basic config files. ++ added fields in TCOD_mouse_t to easily detect button press events : + lbutton_pressed : left button pressed event + rbutton_pressed : right button pressed event + mbutton_pressed : middle button pressed event + and to get the mouse movement in cell coordinates (instead of pixels) ++ added functions to retrieve data from TCODMap +- fixed const correctness in TCODConsole::print*Rect functions +- fixed a bug in fov toolkit if TCODMap width < height +- fixed TCOD_struct_get_type returning TCOD_TYPE_NONE instead of TCOD_TYPE_BOOL for flags. +========================================================= +1.3 : 2008 May 25 +X C++ : colors must be initialized by constructor : + 1.2.2 : TCODColor mycol={r,g,b}; + 1.3 : TCODColor mycol(r,g,b); +X TCOD_console_check_for_keypress now has a parameter that indicates which events are tracked + 1.2.2 : key = TCOD_console_check_for_keypress(); + 1.3 : key = TCOD_console_check_for_keypress(TCOD_KEY_PRESSED); ++ added mouse support ++ added the file parser module ++ added TCODColor::setHSV(float h, float s, float v) and TCODColor::getHSV(float *h, float *s, float *v) ++ added TCODColor addition and scalar multiplication. All r,g,b values are clamped to [0-255] : + C++ : color1 = color2 * 3.5f; + color1 = color1 + color2; + C : color1 = TCOD_color_multiply_scalar ( color2, 3.5f ); + color1 = TCOD_color_add( color1, color2 ); ++ added TCODConsole::setKeyboardRepeat(int initialDelay, int interval) and TCODConsole::disableKeyboardRepeat() ++ added TCODSystem::getCurrentResolution(int *w, int *h) +% now TCODFov::computeFov takes a maxRadius parameter. Use 0 for unlimited range (default) +% the mouse cursor is now automatically hidden when using fullscreen +- fixed closing the window resulting in a fake 'Q' keyboard event +- fixed TCODConsole::print* and TCODConsole::rect functions crashing when printing out of the console +- fixed f parameter modified when calling fbm and turbulence noise functions. Now f is no more modified. +- fixed wrong ascii code in TCOD_key_t.c when pressing Control and a letter key. +========================================================= +1.2.2 : 2008 Mar 18 ++ added helpers for real time games + void TCODSystem::setFps(int val) to limit the number of frames per second. Use 0 for unlimited fps (default) + int TCODSystem::getFps() to return the number of frames rendered during the last second + float TCODSystem::getLastFrameLength() to return the length of the last frame in seconds ++ added TCODImage::clear to fill an image with a color +% TCODConsole::hline and vline now have a TCOD_bkgnd_flag_t parameter +% now the TCODConsole::print*Rect functions return the height (number of console lines) of the printed string +- fixed TCODConsole::print*Rect functions not truncating the string if it reaches the bottom of the rectangle + using a rectangle height of 0 means unlimited height +- fixed a color bug when drawing text using the black color (0,0,0) +- fixed TCODConsole::waitForKeypress(true) resulting in Alt/Ctrl/Shift key state not cleared +========================================================= +1.2.1 : 2008 Mar 09 ++ added TCODImage::blitRect to easily map an image on a specific part of a console ++ added possibility to generate an image from an offscreen console ++ added TCODImage::save ++ image toolkit now support reading 8bpp bitmap files. +% Random number generators now support inverted ranges instead of crashing : + TCODRandom::getInstance()->getInt(10,2) + => return a value between 2 and 10. +- fixed image toolkit replacing the green component by the red one when loading a bitmap from a file +- fixed console print*Rect functions unnecessarily splitting the string in some cases +- on Linux, you don't need to link with SDL anymore when using libtcod/libtcod++ +- fixed linker issues with Visual Studio +========================================================= +1.2 : 2008 Feb 26 ++ new 'image' toolkit replacing some of the features previously in the 'system' toolkit. ++ now windowed mode works even on 16bits desktops ++ improved custom font support. + You can now use fonts with characters ordered in rows or columns and with a custom transparent color. + This allows you to use most existing character sets with the doryen library. + Font characters with grayscale are still not supported. ++ new time functions : + uint32 TCODSystem::getElapsedMilli() + float TCODSystem::getElapsedSeconds() ++ new background blending modes (see the line sample for a demo) : + TCOD_BKGND_LIGHTEN : newbk = MAX(oldbk,curbk) + TCOD_BKGND_DARKEN : newbk = MIN(oldbk,curbk) + TCOD_BKGND_SCREEN : newbk = white - (white - oldbk) * (white - curbk) // inverse of multiply : (1-newbk) = (1-oldbk)*(1-curbk) + TCOD_BKGND_COLOR_DODGE : newbk = curbk / (white - oldbk) + TCOD_BKGND_COLOR_BURN : newbk = white - (white - oldbk) / curbk + TCOD_BKGND_ADD : newbk = oldbk + curbk + TCOD_BKGND_ADDALPHA(alpha) : newbk = oldbk + alpha * curbk, 0.0<=alpha<=1.0 + TCOD_BKGND_BURN : newbk = oldbk + curbk - white + TCOD_BKGND_OVERLAY : newbk = curbk <= 0.5 ? 2*curbk*oldbk : white - 2*(white-curbk)*(white-oldbk) + TCOD_BKGND_ALPHA(alpha) : newbk = (1.0f-alpha)*oldbk + alpha*(curbk-oldbk), 0.0<=alpha<=1.0 ++ The samples can now use custom bitmap fonts / screen resolution. Use following syntax : + sample_c[pp] [options] + options : + -fullscreen : start directly in fullscreen mode + -font (default "terminal.bmp") + -font-char-size (default 8 8) + -font-layout (default 16 16) + -font-in-row : characters in the bitmap are ordered in rows (default : columns) + -font-key-color : transparent color, r,g,b between 0 and 255. (default 0 0 0) + -fullscreen-resolution (default 640 400) +% headers renamed from tcodlib.h* to libtcod.h* +% on Linux, the library is splitted into libtcod.so and libtcod++.so + allowing C developpers to use it without installing g++ +% the font name is no more a parameter of TCODConsole::initRoot. +% TCODConsole::setBitmapFontSize renamed to TCODConsole::setCustomFont +% TCODConsole::printFrame is now a variadic function, like the other text output functions +% some background blending flags have been renamed : + TCOD_BKGND_NOBK replaced by TCOD_BKGND_NONE + TCOD_BKGND_BK replaced by TCOD_BKGND_SET +% the fov toolkit now uses two properties per cell : transparent/walkable. + This is necessary to fix a fov issue with window cells (transparent, but not walkable). + void TCODFov::setTransparent(int x,int y, bool isTransparent) has been replaced by : + void TCODFov::setProperties(int x,int y, bool isTransparent, bool isWalkable) +% improved const correctness, added some default parameter values in the C++ API. +- fixed the window size when using a custom font size +- fixed TCODK_PRINTSCREEN key event not detected +- fixed crash in printing functions if the string length was > 255. Now they can handle strings of any size. +========================================================= +1.1 : 2008 Jan 27 ++ added the noise toolkit ++ added the field of view toolkit ++ added customizable bitmap font size +========================================================= +1.0.1 : 2008 Jan 19 ++ added C/C++ samples +% TCODConsole::waitForKeyPress now has a bool parameter indicating if we flush the keyboard buffer before waiting. +- fixed a color bug when drawing text using the grey color (196,196,196) +- fixed wrong key codes returned by wait/checkForKeyPress on some keyboard layouts +========================================================= +1.0 : 2008 Jan 05 +Initial release diff --git a/tcod/tcod_sys/libtcod/libtcod.cfg b/tcod/tcod_sys/libtcod/libtcod.cfg new file mode 100644 index 00000000..c092064e --- /dev/null +++ b/tcod/tcod_sys/libtcod/libtcod.cfg @@ -0,0 +1,32 @@ +/* + Use this file to customize the behaviour of libtcod, + overriding what's defined in the sample/game code. + The main goal of this file is to allow the player + to tweak the game in case it doesn't work properly + on his system and there are no options screen/config + files available in the game. +*/ +libtcod { + // uncomment to force the use of a specific renderer + // renderer = "GLSL" + // renderer = "OPENGL" + //renderer = "SDL" + + // uncomment to force a specific fullscreen resolution + /* + fullscreen=true + fullscreenWidth=1280 + fullscreenHeight=1024 + */ + + // uncomment to use a custom font. + /* + font="data/fonts/terminal8x8_gs_as.png" + fontInRow=false + fontGreyscale=true + fontTcodLayout=false + fontNbCharHoriz=16 + fontNbCharVertic=16 + */ +} + diff --git a/tcod/tcod_sys/libtcod/makefiles/README.txt b/tcod/tcod_sys/libtcod/makefiles/README.txt new file mode 100644 index 00000000..1d8bf873 --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/README.txt @@ -0,0 +1,26 @@ +******************* +List of makefiles : +******************* + +makefile-linux Linux 32 bits +makefile-linux64 Linux 64 bits +makefile-mingw Windows/Mingw32 +makefile-mingw-sdl2 Windows/Mingw32 using SDL 2 (experimental) +makefile-haiku Haiku +makefile-samples-linux Samples compilation on Linux +makefile-samples-mingw Samples compilation on Windows/Mingw32 + +******************* +Linux prerequisites +******************* +To be able to compile libtcod on Linux, make sure that following packages are installed : +* gcc +* g++ +* make +* zlib +* libpng12 +* libsdl1.2 +* upx +* electric-fence +* libpng12-dev +* libsdl1.2-dev diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-haiku b/tcod/tcod_sys/libtcod/makefiles/makefile-haiku new file mode 100644 index 00000000..8b5e31dd --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-haiku @@ -0,0 +1,217 @@ +# libtcod makefile +# to build debug version, run "make -f makefile-linux debug" +# to build release version, run "make -f makefile-linux release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL +SDL_FLAGS=`sdl-config --cflags` +SDL_LIBS=`sdl-config --libs` + +# ZLIB +ZLIB_FLAGS= +ZLIB_LIBS=-lz + +# PNG +PNG_LIBS=-lpng + +#OPENGL +OPENGL_LIB=-lGL + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui -Wall $(SDL_FLAGS) $(ZLIB_FLAGS) $(PNG_FLAGS) -fno-strict-aliasing -ansi -DNO_OPENGL +TEMP=/tmp +CC=gcc +CPP=g++ +.SUFFIXES: a .o .h .c + +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + $(CC) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + $(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + $(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< + +LIBOBJS_C_DEBUG= \ + $(TEMP)/libtcod/debug/bresenham_c.o \ + $(TEMP)/libtcod/debug/bsp_c.o \ + $(TEMP)/libtcod/debug/color_c.o \ + $(TEMP)/libtcod/debug/console_c.o \ + $(TEMP)/libtcod/debug/fov_c.o \ + $(TEMP)/libtcod/debug/fov_circular_raycasting.o \ + $(TEMP)/libtcod/debug/fov_diamond_raycasting.o \ + $(TEMP)/libtcod/debug/fov_recursive_shadowcasting.o \ + $(TEMP)/libtcod/debug/fov_permissive2.o \ + $(TEMP)/libtcod/debug/fov_restrictive.o \ + $(TEMP)/libtcod/debug/heightmap_c.o \ + $(TEMP)/libtcod/debug/image_c.o \ + $(TEMP)/libtcod/debug/lex_c.o \ + $(TEMP)/libtcod/debug/list_c.o \ + $(TEMP)/libtcod/debug/mersenne_c.o \ + $(TEMP)/libtcod/debug/noise_c.o \ + $(TEMP)/libtcod/debug/parser_c.o \ + $(TEMP)/libtcod/debug/path_c.o \ + $(TEMP)/libtcod/debug/sys_c.o \ + $(TEMP)/libtcod/debug/sys_opengl_c.o \ + $(TEMP)/libtcod/debug/sys_sdl_c.o \ + $(TEMP)/libtcod/debug/sys_sdl_img_bmp.o \ + $(TEMP)/libtcod/debug/sys_sdl_img_png.o \ + $(TEMP)/libtcod/debug/tree_c.o \ + $(TEMP)/libtcod/debug/txtfield_c.o \ + $(TEMP)/libtcod/debug/wrappers.o \ + $(TEMP)/libtcod/debug/zip_c.o \ + $(TEMP)/libtcod/debug/png/lodepng.o \ + $(TEMP)/libtcod/debug/namegen_c.o + +LIBOBJS_CPP_DEBUG= \ + $(TEMP)/libtcod/debug/bresenham.o \ + $(TEMP)/libtcod/debug/bsp.o \ + $(TEMP)/libtcod/debug/color.o \ + $(TEMP)/libtcod/debug/console.o \ + $(TEMP)/libtcod/debug/fov.o \ + $(TEMP)/libtcod/debug/heightmap.o \ + $(TEMP)/libtcod/debug/image.o \ + $(TEMP)/libtcod/debug/lex.o \ + $(TEMP)/libtcod/debug/mersenne.o \ + $(TEMP)/libtcod/debug/mouse.o \ + $(TEMP)/libtcod/debug/noise.o \ + $(TEMP)/libtcod/debug/parser.o \ + $(TEMP)/libtcod/debug/path.o \ + $(TEMP)/libtcod/debug/sys.o \ + $(TEMP)/libtcod/debug/txtfield.o \ + $(TEMP)/libtcod/debug/zip.o \ + $(TEMP)/libtcod/debug/namegen.o + +GUIOBJS_DEBUG= \ + $(TEMP)/libtcod/debug/gui/button.o \ + $(TEMP)/libtcod/debug/gui/container.o \ + $(TEMP)/libtcod/debug/gui/flatlist.o \ + $(TEMP)/libtcod/debug/gui/hbox.o \ + $(TEMP)/libtcod/debug/gui/image.o \ + $(TEMP)/libtcod/debug/gui/label.o \ + $(TEMP)/libtcod/debug/gui/radiobutton.o \ + $(TEMP)/libtcod/debug/gui/slider.o \ + $(TEMP)/libtcod/debug/gui/statusbar.o \ + $(TEMP)/libtcod/debug/gui/textbox.o \ + $(TEMP)/libtcod/debug/gui/togglebutton.o \ + $(TEMP)/libtcod/debug/gui/toolbar.o \ + $(TEMP)/libtcod/debug/gui/vbox.o \ + $(TEMP)/libtcod/debug/gui/widget.o + +LIBOBJS_C_RELEASE= \ + $(TEMP)/libtcod/release/bresenham_c.o \ + $(TEMP)/libtcod/release/bsp_c.o \ + $(TEMP)/libtcod/release/color_c.o \ + $(TEMP)/libtcod/release/console_c.o \ + $(TEMP)/libtcod/release/fov_c.o \ + $(TEMP)/libtcod/release/fov_circular_raycasting.o \ + $(TEMP)/libtcod/release/fov_diamond_raycasting.o \ + $(TEMP)/libtcod/release/fov_recursive_shadowcasting.o \ + $(TEMP)/libtcod/release/fov_permissive2.o \ + $(TEMP)/libtcod/release/fov_restrictive.o \ + $(TEMP)/libtcod/release/heightmap_c.o \ + $(TEMP)/libtcod/release/image_c.o \ + $(TEMP)/libtcod/release/lex_c.o \ + $(TEMP)/libtcod/release/list_c.o \ + $(TEMP)/libtcod/release/mersenne_c.o \ + $(TEMP)/libtcod/release/noise_c.o \ + $(TEMP)/libtcod/release/parser_c.o \ + $(TEMP)/libtcod/release/path_c.o \ + $(TEMP)/libtcod/release/sys_c.o \ + $(TEMP)/libtcod/release/sys_opengl_c.o \ + $(TEMP)/libtcod/release/sys_sdl_c.o \ + $(TEMP)/libtcod/release/sys_sdl_img_bmp.o \ + $(TEMP)/libtcod/release/sys_sdl_img_png.o \ + $(TEMP)/libtcod/release/txtfield_c.o \ + $(TEMP)/libtcod/release/tree_c.o \ + $(TEMP)/libtcod/release/wrappers.o \ + $(TEMP)/libtcod/release/zip_c.o \ + $(TEMP)/libtcod/release/png/lodepng.o \ + $(TEMP)/libtcod/release/namegen_c.o + +LIBOBJS_CPP_RELEASE= \ + $(TEMP)/libtcod/release/bresenham.o \ + $(TEMP)/libtcod/release/bsp.o \ + $(TEMP)/libtcod/release/color.o \ + $(TEMP)/libtcod/release/console.o \ + $(TEMP)/libtcod/release/fov.o \ + $(TEMP)/libtcod/release/heightmap.o \ + $(TEMP)/libtcod/release/image.o \ + $(TEMP)/libtcod/release/lex.o \ + $(TEMP)/libtcod/release/mersenne.o \ + $(TEMP)/libtcod/release/mouse.o \ + $(TEMP)/libtcod/release/noise.o \ + $(TEMP)/libtcod/release/parser.o \ + $(TEMP)/libtcod/release/path.o \ + $(TEMP)/libtcod/release/sys.o \ + $(TEMP)/libtcod/release/txtfield.o \ + $(TEMP)/libtcod/release/zip.o \ + $(TEMP)/libtcod/release/namegen.o + +GUIOBJS_RELEASE= \ + $(TEMP)/libtcod/release/gui/button.o \ + $(TEMP)/libtcod/release/gui/container.o \ + $(TEMP)/libtcod/release/gui/flatlist.o \ + $(TEMP)/libtcod/release/gui/hbox.o \ + $(TEMP)/libtcod/release/gui/image.o \ + $(TEMP)/libtcod/release/gui/label.o \ + $(TEMP)/libtcod/release/gui/radiobutton.o \ + $(TEMP)/libtcod/release/gui/slider.o \ + $(TEMP)/libtcod/release/gui/statusbar.o \ + $(TEMP)/libtcod/release/gui/textbox.o \ + $(TEMP)/libtcod/release/gui/togglebutton.o \ + $(TEMP)/libtcod/release/gui/toolbar.o \ + $(TEMP)/libtcod/release/gui/vbox.o \ + $(TEMP)/libtcod/release/gui/widget.o + +all : debug release + +debug : libtcod_debug.so libtcodxx_debug.so libtcodgui_debug.so + +release : libtcod.so libtcodxx.so libtcodgui.so + +$(TEMP)/libtcod/debug/png : + mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + mkdir -p $@ + +$(TEMP)/libtcod/release/png : + mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + mkdir -p $@ + +libtcod.a : $(LIBOBJS_C_DEBUG) + ar r $@ $(LIBOBJS_C_DEBUG) + +libtcodxx.a : $(LIBOBJS_CPP_DEBUG) + ar r $@ $(LIBOBJS_CPP_DEBUG) + +libtcod.so : $(TEMP)/libtcod/release/png $(LIBOBJS_C_RELEASE) + gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_C_RELEASE) $(ZLIB_LIBS) $(PNG_LIBS) $(SDL_LIBS) $(CFLAGS) $(OPENGL_LIB) + +libtcodxx.so : $(TEMP)/libtcod/release/png $(LIBOBJS_CPP_RELEASE) + gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_CPP_RELEASE) -L. -ltcod $(CFLAGS) + +libtcodgui.so : $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) + gcc -shared -Wl,-soname,$@ -o $@ $(GUIOBJS_RELEASE) -L. -ltcod -ltcodxx $(CFLAGS) + +libtcod_debug.so : $(TEMP)/libtcod/debug/png $(LIBOBJS_C_DEBUG) + gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_C_DEBUG) $(ZLIB_LIBS) $(PNG_LIBS) $(SDL_LIBS) $(CFLAGS) $(OPENGL_LIB) + +libtcodxx_debug.so : $(TEMP)/libtcod/debug/png $(LIBOBJS_CPP_DEBUG) + gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_CPP_DEBUG) -L. -ltcod_debug $(CFLAGS) + +libtcodgui_debug.so : $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) + gcc -shared -Wl,-soname,$@ -o $@ $(GUIOBJS_DEBUG) -L. -ltcod_debug -ltcodxx_debug $(CFLAGS) + +clean : + \rm -f $(LIBOBJS_C_RELEASE) $(LIBOBJS_CPP_RELEASE) $(GUIOBJS_RELEASE) $(LIBOBJS_C_DEBUG) $(LIBOBJS_CPP_DEBUG) $(GUIOBJS_DEBUG) libtcod.a libtcodxx.a libtcod.so libtcodxx.so libtcodgui.so libtcod_debug.so libtcodxx_debug.so libtcodgui_debug.so libtcodpy.pyc + diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-linux b/tcod/tcod_sys/libtcod/makefiles/makefile-linux new file mode 100644 index 00000000..46e3a3dd --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-linux @@ -0,0 +1,197 @@ +# libtcod makefile +# to build debug version, run "make -f makefile-linux debug" +# to build release version, run "make -f makefile-linux release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL +SDL_FLAGS=`sdl-config --cflags` +SDL_LIBS=`sdl-config --libs` + +# ZLIB +ZLIB_FLAGS=-I src/zlib +ZLIB_LIBS=lib/libz.a + +#OPENGL +OPENGL_LIB=-lGL +LIBS=$(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) -lm -ldl -lX11 -lpthread + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui -Wall $(SDL_FLAGS) $(ZLIB_FLAGS) -fno-strict-aliasing -ansi -fPIC +TEMP=/tmp +CC=gcc +CPP=g++ +.SUFFIXES: a .o .h .c + +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + @ echo Compiling release $(basename $<).c + @$(CC) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + @echo Compiling debug $(basename $<).c + @$(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/zlib/%.o : $(SRCDIR)/zlib/%.c + @ echo Compiling zlib $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -o $@ -c $< + +ZLIBOBJS=$(addprefix $(TEMP)/libtcod/zlib/, \ + adler32.o \ + crc32.o \ + deflate.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + trees.o \ + zutil.o \ + compress.o \ + uncompr.o \ + gzclose.o \ + gzlib.o \ + gzread.o \ + gzwrite.o ) + +LIBOBJS_C= \ + bresenham_c.o \ + bsp_c.o \ + color_c.o \ + console_c.o \ + fov_c.o \ + fov_circular_raycasting.o \ + fov_diamond_raycasting.o \ + fov_recursive_shadowcasting.o \ + fov_permissive2.o \ + fov_restrictive.o \ + heightmap_c.o \ + image_c.o \ + lex_c.o \ + list_c.o \ + mersenne_c.o \ + noise_c.o \ + parser_c.o \ + path_c.o \ + sys_c.o \ + sys_opengl_c.o \ + sys_sdl_c.o \ + sys_sdl_img_bmp.o \ + sys_sdl_img_png.o \ + tree_c.o \ + txtfield_c.o \ + wrappers.o \ + zip_c.o \ + namegen_c.o \ + png/lodepng.o + +LIBOBJS_CPP= \ + bresenham.o \ + bsp.o \ + color.o \ + console.o \ + fov.o \ + heightmap.o \ + image.o \ + lex.o \ + mersenne.o \ + mouse.o \ + noise.o \ + parser.o \ + path.o \ + sys.o \ + txtfield.o \ + zip.o \ + namegen.o + +GUIOBJS= \ + gui/button.o \ + gui/container.o \ + gui/flatlist.o \ + gui/hbox.o \ + gui/image.o \ + gui/label.o \ + gui/radiobutton.o \ + gui/slider.o \ + gui/statusbar.o \ + gui/textbox.o \ + gui/togglebutton.o \ + gui/toolbar.o \ + gui/vbox.o \ + gui/widget.o + + +LIBOBJS_C_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS_C)) +LIBOBJS_CPP_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS_CPP)) +GUIOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(GUIOBJS)) +LIBOBJS_C_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS_C)) +LIBOBJS_CPP_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS_CPP)) +GUIOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(GUIOBJS)) + +all : debug release + +debug : libtcod_debug.so libtcodxx_debug.so libtcodgui_debug.so + +release : libtcod.so libtcodxx.so libtcodgui.so + +$(TEMP)/libtcod/debug/png : + mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + mkdir -p $@ + +$(TEMP)/libtcod/release/png : + mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + mkdir -p $@ + +$(TEMP)/libtcod/zlib : + @mkdir -p $@ + +libtcod.a : $(LIBOBJS_C_DEBUG) + ar r $@ $(LIBOBJS_C_DEBUG) + +lib/libz.a : $(TEMP)/libtcod/zlib $(ZLIBOBJS) + @ar r $@ $(ZLIBOBJS) + +libtcodxx.a : $(LIBOBJS_CPP_DEBUG) + ar r $@ $(LIBOBJS_CPP_DEBUG) + +libtcod.so : $(TEMP)/libtcod/release/png $(LIBOBJS_C_RELEASE) lib/libz.a + @echo Linking $@ + @gcc -shared -Wl,-soname,libtcod.so.1 $(LDFLAGS) -o $@ $(LIBOBJS_C_RELEASE) $(LIBS) $(CFLAGS) + +libtcodxx.so : $(TEMP)/libtcod/release/png $(LIBOBJS_CPP_RELEASE) + @echo Linking $@ + @g++ -shared -Wl,-soname,libtcodxx.so.1 $(LDFLAGS) -o $@ $(LIBOBJS_CPP_RELEASE) -L. -ltcod $(CFLAGS) + +libtcodgui.so : $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) + @echo Linking $@ + @g++ -shared -Wl,-soname,libtcodgui.so.1 $(LDFLAGS) -o $@ $(GUIOBJS_RELEASE) -L. -ltcod -ltcodxx $(CFLAGS) + +libtcod_debug.so : $(TEMP)/libtcod/debug/png $(LIBOBJS_C_DEBUG) lib/libz.a + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_C_DEBUG) $(LIBS) $(CFLAGS) + +libtcodxx_debug.so : $(TEMP)/libtcod/debug/png $(LIBOBJS_CPP_DEBUG) + @echo Linking $@ + @g++ -shared -Wl,-soname,$@ $(LDFLAGS) -o $@ $(LIBOBJS_CPP_DEBUG) -L. -ltcod_debug $(CFLAGS) + +libtcodgui_debug.so : $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) + @echo Linking $@ + @g++ -shared -Wl,-soname,$@ $(LDFLAGS) -o $@ $(GUIOBJS_DEBUG) -L. -ltcod_debug -ltcodxx_debug $(CFLAGS) + +clean : + \rm -f $(LIBOBJS_C_RELEASE) $(LIBOBJS_CPP_RELEASE) $(GUIOBJS_RELEASE) $(LIBOBJS_C_DEBUG) $(LIBOBJS_CPP_DEBUG) $(GUIOBJS_DEBUG) libtcod.a libtcodxx.a libtcod.so libtcodxx.so libtcodgui.so libtcod_debug.so libtcodxx_debug.so libtcodgui_debug.so libtcodpy.pyc + +cleanall : clean + @rm -f $(ZLIBOBJS) diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-linux-win32 b/tcod/tcod_sys/libtcod/makefiles/makefile-linux-win32 new file mode 100644 index 00000000..89e87c1e --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-linux-win32 @@ -0,0 +1,195 @@ +# libtcod linux->mingw32 cross compilation makefile +# to build debug version, run "make -f makefile-mingw debug" +# to build release version, run "make -f makefile-mingw release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL +SDL_DIR=dependencies/SDL-1.2.15 +SDL_FLAGS=-I $(SDL_DIR)/include +SDL_LIBS=-L $(SDL_DIR)/lib/mingw -lSDL.dll + +# ZLIB +ZLIB_DIR=lib +ZLIB_FLAGS=-I src/zlib +ZLIB_LIBS=lib/libz.a + +# OPENGL +OPENGL_LIB=-lopengl32 + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui $(SDL_FLAGS) $(ZLIB_FLAGS) -Wall -fno-strict-aliasing -ansi +#MINGW_FLAGS=-static-libgcc -static-libstdc++ +CC=i586-mingw32msvc-gcc +CPP=i586-mingw32msvc-g++ +AR=i586-mingw32msvc-ar +UPX=dependencies/upx/win/upx.exe +TEMP=/tmp +.SUFFIXES: .dll .a .o .h .c .hpp .cpp + +#compilation rules +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -DLIBTCOD_GUI_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + @ echo Compiling debug $(basename $<).c + @$(CC) $(CFLAGS) -g -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_GUI_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + @ echo Compiling release $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/zlib/%.o : $(SRCDIR)/zlib/%.c + @ echo Compiling zlib $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -o $@ -c $< + +ZLIBOBJS=$(addprefix $(TEMP)/libtcod/zlib/, \ + adler32.o \ + crc32.o \ + deflate.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + trees.o \ + zutil.o \ + compress.o \ + uncompr.o \ + gzclose.o \ + gzlib.o \ + gzread.o \ + gzwrite.o ) + +LIBOBJS= \ + bresenham_c.o \ + bsp_c.o \ + color_c.o \ + console_c.o \ + fov_c.o \ + fov_circular_raycasting.o \ + fov_diamond_raycasting.o \ + fov_recursive_shadowcasting.o \ + fov_permissive2.o \ + fov_restrictive.o \ + heightmap_c.o \ + image_c.o \ + lex_c.o \ + list_c.o \ + mersenne_c.o \ + noise_c.o \ + parser_c.o \ + path_c.o \ + sys_c.o \ + sys_sdl_c.o \ + sys_sdl_img_bmp.o \ + sys_sdl_img_png.o \ + tree_c.o \ + txtfield_c.o \ + wrappers.o \ + zip_c.o \ + namegen_c.o \ + bresenham.o \ + bsp.o \ + color.o \ + console.o \ + fov.o \ + heightmap.o \ + image.o \ + lex.o \ + mersenne.o \ + mouse.o \ + noise.o \ + parser.o \ + path.o \ + sys.o \ + sys_opengl_c.o \ + txtfield.o \ + zip.o \ + namegen.o \ + png/lodepng.o + +GUIOBJS= \ + gui/button.o \ + gui/container.o \ + gui/flatlist.o \ + gui/hbox.o \ + gui/image.o \ + gui/label.o \ + gui/radiobutton.o \ + gui/slider.o \ + gui/statusbar.o \ + gui/textbox.o \ + gui/togglebutton.o \ + gui/toolbar.o \ + gui/vbox.o \ + gui/widget.o + + +LIBOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS) ) +GUIOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(GUIOBJS) ) +LIBOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS) ) +GUIOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(GUIOBJS) ) + +all : debug release + +release : libtcod-mingw.dll libtcod-gui-mingw.dll + +debug : libtcod-mingw-debug.dll libtcod-gui-mingw-debug.dll + +$(TEMP)/libtcod/debug/png : + @mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + @mkdir -p $@ + +$(TEMP)/libtcod/release/png : + @mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + @mkdir -p $@ + +$(TEMP)/libtcod/zlib : + @mkdir -p $@ + +lib/ : + @mkdir -p $@ + +libtcod-mingw.a : $(LIBOBJS_DEBUG) + @$(AR) r $@ $(LIBOBJS_DEBUG) + +lib/libz.a : $(TEMP)/libtcod/zlib $(ZLIBOBJS) + @$(AR) r $@ $(ZLIBOBJS) + +libtcod-mingw.dll : lib/ $(TEMP)/libtcod/release/png $(LIBOBJS_RELEASE) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-mingw.a $(LIBOBJS_RELEASE) $(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) $(MINGW_FLAGS) + +libtcod-gui-mingw.dll : lib/ $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-gui-mingw.a $(GUIOBJS_RELEASE) -Llib -ltcod-mingw $(MINGW_FLAGS) + +libtcod-mingw-debug.dll : lib/ $(TEMP)/libtcod/debug/png $(LIBOBJS_DEBUG) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-mingw-debug.a $(LIBOBJS_DEBUG) $(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) $(MINGW_FLAGS) + +libtcod-gui-mingw-debug.dll : lib/ $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-gui-mingw-debug.a $(GUIOBJS_DEBUG) -Llib -ltcod-mingw-debug $(MINGW_FLAGS) + +upx : + @echo Compressing... + @$(UPX) libtcod-mingw.dll libtcod-gui-mingw.dll + +clean : + @rm -f $(LIBOBJS_RELEASE) $(GUIOBJS_RELEASE) libtcod-mingw.dll lib/libtcod-mingw.a libtcod-gui-mingw.dll lib/libtcod-gui-mingw.a libtcodpy.pyc $(LIBOBJS_DEBUG) $(GUIOBJS_DEBUG) libtcod-mingw-debug.dll lib/libtcod-mingw-debug.a libtcod-gui-mingw-debug.dll lib/libtcod-gui-mingw-debug.a + +cleanall : clean + @rm -f $(ZLIBOBJS) + diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-linux64-32 b/tcod/tcod_sys/libtcod/makefiles/makefile-linux64-32 new file mode 100644 index 00000000..e49e19e0 --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-linux64-32 @@ -0,0 +1,197 @@ +# libtcod linux 64 -> 32 cross compilation makefile +# to build debug version, run "make -f makefile-linux64-32 debug" +# to build release version, run "make -f makefile-linux64-32 release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL +SDL_FLAGS=`sdl-config --cflags` +SDL_LIBS=-Llib32 -lSDL + +# ZLIB +ZLIB_FLAGS=-I src/zlib +ZLIB_LIBS=lib/libz.a + +#OPENGL +OPENGL_LIB=-lGL + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui -Wall $(SDL_FLAGS) $(ZLIB_FLAGS) -fno-strict-aliasing -ansi -m32 +TEMP=/tmp +CC=gcc +CPP=g++ +.SUFFIXES: a .o .h .c + +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + @ echo Compiling release $(basename $<).c + @$(CC) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + @echo Compiling debug $(basename $<).c + @$(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/zlib/%.o : $(SRCDIR)/zlib/%.c + @ echo Compiling zlib $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -o $@ -c $< + +ZLIBOBJS=$(addprefix $(TEMP)/libtcod/zlib/, \ + adler32.o \ + crc32.o \ + deflate.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + trees.o \ + zutil.o \ + compress.o \ + uncompr.o \ + gzclose.o \ + gzlib.o \ + gzread.o \ + gzwrite.o ) + +LIBOBJS_C= \ + bresenham_c.o \ + bsp_c.o \ + color_c.o \ + console_c.o \ + fov_c.o \ + fov_circular_raycasting.o \ + fov_diamond_raycasting.o \ + fov_recursive_shadowcasting.o \ + fov_permissive2.o \ + fov_restrictive.o \ + heightmap_c.o \ + image_c.o \ + lex_c.o \ + list_c.o \ + mersenne_c.o \ + noise_c.o \ + parser_c.o \ + path_c.o \ + sys_c.o \ + sys_opengl_c.o \ + sys_sdl_c.o \ + sys_sdl_img_bmp.o \ + sys_sdl_img_png.o \ + tree_c.o \ + txtfield_c.o \ + wrappers.o \ + zip_c.o \ + namegen_c.o \ + png/lodepng.o + +LIBOBJS_CPP= \ + bresenham.o \ + bsp.o \ + color.o \ + console.o \ + fov.o \ + heightmap.o \ + image.o \ + lex.o \ + mersenne.o \ + mouse.o \ + noise.o \ + parser.o \ + path.o \ + sys.o \ + txtfield.o \ + zip.o \ + namegen.o + +GUIOBJS= \ + gui/button.o \ + gui/container.o \ + gui/flatlist.o \ + gui/hbox.o \ + gui/image.o \ + gui/label.o \ + gui/radiobutton.o \ + gui/slider.o \ + gui/statusbar.o \ + gui/textbox.o \ + gui/togglebutton.o \ + gui/toolbar.o \ + gui/vbox.o \ + gui/widget.o + + +LIBOBJS_C_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS_C)) +LIBOBJS_CPP_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS_CPP)) +GUIOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(GUIOBJS)) +LIBOBJS_C_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS_C)) +LIBOBJS_CPP_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS_CPP)) +GUIOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(GUIOBJS)) + +all : debug release + +debug : libtcod_debug.so libtcodxx_debug.so libtcodgui_debug.so + +release : libtcod.so libtcodxx.so libtcodgui.so + +$(TEMP)/libtcod/debug/png : + mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + mkdir -p $@ + +$(TEMP)/libtcod/release/png : + mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + mkdir -p $@ + +$(TEMP)/libtcod/zlib : + @mkdir -p $@ + +libtcod.a : $(LIBOBJS_C_DEBUG) + ar r $@ $(LIBOBJS_C_DEBUG) + +lib/libz.a : $(TEMP)/libtcod/zlib $(ZLIBOBJS) + @ar r $@ $(ZLIBOBJS) + +libtcodxx.a : $(LIBOBJS_CPP_DEBUG) + ar r $@ $(LIBOBJS_CPP_DEBUG) + +libtcod.so : $(TEMP)/libtcod/release/png $(LIBOBJS_C_RELEASE) lib/libz.a + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_C_RELEASE) $(ZLIB_LIBS) $(SDL_LIBS) $(CFLAGS) $(OPENGL_LIB) + +libtcodxx.so : $(TEMP)/libtcod/release/png $(LIBOBJS_CPP_RELEASE) + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_CPP_RELEASE) -L. -ltcod $(CFLAGS) + +libtcodgui.so : $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(GUIOBJS_RELEASE) -L. -ltcod -ltcodxx $(CFLAGS) + +libtcod_debug.so : $(TEMP)/libtcod/debug/png $(LIBOBJS_C_DEBUG) lib/libz.a + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_C_DEBUG) $(ZLIB_LIBS) $(SDL_LIBS) $(CFLAGS) $(OPENGL_LIB) + +libtcodxx_debug.so : $(TEMP)/libtcod/debug/png $(LIBOBJS_CPP_DEBUG) + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(LIBOBJS_CPP_DEBUG) -L. -ltcod_debug $(CFLAGS) + +libtcodgui_debug.so : $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) + @echo Linking $@ + @gcc -shared -Wl,-soname,$@ -o $@ $(GUIOBJS_DEBUG) -L. -ltcod_debug -ltcodxx_debug $(CFLAGS) + +clean : + \rm -f $(LIBOBJS_C_RELEASE) $(LIBOBJS_CPP_RELEASE) $(GUIOBJS_RELEASE) $(LIBOBJS_C_DEBUG) $(LIBOBJS_CPP_DEBUG) $(GUIOBJS_DEBUG) libtcod.a libtcodxx.a libtcod.so libtcodxx.so libtcodgui.so libtcod_debug.so libtcodxx_debug.so libtcodgui_debug.so libtcodpy.pyc + + +cleanall : clean + @rm -f $(ZLIBOBJS) diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-mingw b/tcod/tcod_sys/libtcod/makefiles/makefile-mingw new file mode 100644 index 00000000..4fe41812 --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-mingw @@ -0,0 +1,191 @@ +# libtcod mingw32 makefile +# to build debug version, run "make -f makefile-mingw debug" +# to build release version, run "make -f makefile-mingw release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL +SDL_DIR=dependencies/SDL-1.2.15 +SDL_FLAGS=-I $(SDL_DIR)/include +SDL_LIBS=-L $(SDL_DIR)/lib/mingw -lSDL.dll + +# ZLIB +ZLIB_FLAGS=-I src/zlib +ZLIB_LIBS=lib/libz.a + +# OPENGL +OPENGL_LIB=-lopengl32 + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui $(SDL_FLAGS) $(ZLIB_FLAGS) -Wall -fno-strict-aliasing -ansi +MINGW_FLAGS=-static-libgcc -static-libstdc++ +CC=mingw32-gcc +CPP=mingw32-g++ +UPX=dependencies/upx/win/upx.exe +.SUFFIXES: .dll .a .o .h .c .hpp .cpp + +#compilation rules +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -DLIBTCOD_GUI_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + @ echo Compiling debug $(basename $<).c + @$(CC) $(CFLAGS) -g -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_GUI_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + @ echo Compiling release $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/zlib/%.o : $(SRCDIR)/zlib/%.c + @ echo Compiling zlib $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -o $@ -c $< + +ZLIBOBJS=$(addprefix $(TEMP)/libtcod/zlib/, \ + adler32.o \ + crc32.o \ + deflate.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + trees.o \ + zutil.o \ + compress.o \ + uncompr.o \ + gzclose.o \ + gzlib.o \ + gzread.o \ + gzwrite.o ) + +LIBOBJS= \ + bresenham_c.o \ + bsp_c.o \ + color_c.o \ + console_c.o \ + fov_c.o \ + fov_circular_raycasting.o \ + fov_diamond_raycasting.o \ + fov_recursive_shadowcasting.o \ + fov_permissive2.o \ + fov_restrictive.o \ + heightmap_c.o \ + image_c.o \ + lex_c.o \ + list_c.o \ + mersenne_c.o \ + noise_c.o \ + parser_c.o \ + path_c.o \ + sys_c.o \ + sys_sdl_c.o \ + sys_sdl_img_bmp.o \ + sys_sdl_img_png.o \ + tree_c.o \ + txtfield_c.o \ + wrappers.o \ + zip_c.o \ + namegen_c.o \ + bresenham.o \ + bsp.o \ + color.o \ + console.o \ + fov.o \ + heightmap.o \ + image.o \ + lex.o \ + mersenne.o \ + mouse.o \ + noise.o \ + parser.o \ + path.o \ + sys.o \ + sys_opengl_c.o \ + txtfield.o \ + zip.o \ + namegen.o \ + png/lodepng.o + +GUIOBJS= \ + gui/button.o \ + gui/container.o \ + gui/flatlist.o \ + gui/hbox.o \ + gui/image.o \ + gui/label.o \ + gui/radiobutton.o \ + gui/slider.o \ + gui/statusbar.o \ + gui/textbox.o \ + gui/togglebutton.o \ + gui/toolbar.o \ + gui/vbox.o \ + gui/widget.o + + +LIBOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS) ) +GUIOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(GUIOBJS) ) +LIBOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS) ) +GUIOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(GUIOBJS) ) + +all : debug release + +release : libtcod-mingw.dll libtcod-gui-mingw.dll upx + +debug : libtcod-mingw-debug.dll libtcod-gui-mingw-debug.dll + +$(TEMP)/libtcod/debug/png : + @mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + @mkdir -p $@ + +$(TEMP)/libtcod/release/png : + @mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + @mkdir -p $@ + +$(TEMP)/libtcod/zlib : + @mkdir -p $@ + +lib/ : + @mkdir -p $@ + +libtcod-mingw.a : $(LIBOBJS_DEBUG) + @ar r $@ $(LIBOBJS_DEBUG) + +lib/libz.a : $(TEMP)/libtcod/zlib $(ZLIBOBJS) + @ar r $@ $(ZLIBOBJS) + +libtcod-mingw.dll : lib/ $(TEMP)/libtcod/release/png $(LIBOBJS_RELEASE) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-mingw.a $(LIBOBJS_RELEASE) $(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) $(MINGW_FLAGS) + +libtcod-gui-mingw.dll : lib/ $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-gui-mingw.a $(GUIOBJS_RELEASE) -Llib -ltcod-mingw $(MINGW_FLAGS) + +libtcod-mingw-debug.dll : lib/ $(TEMP)/libtcod/debug/png $(LIBOBJS_DEBUG) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-mingw-debug.a $(LIBOBJS_DEBUG) $(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) $(MINGW_FLAGS) + +libtcod-gui-mingw-debug.dll : lib/ $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-gui-mingw-debug.a $(GUIOBJS_DEBUG) -Llib -ltcod-mingw-debug $(MINGW_FLAGS) + +upx : + @echo Compressing... + @$(UPX) libtcod-mingw.dll libtcod-gui-mingw.dll + +clean : + @rm -f $(LIBOBJS_RELEASE) $(GUIOBJS_RELEASE) libtcod-mingw.dll lib/libtcod-mingw.a libtcod-gui-mingw.dll lib/libtcod-gui-mingw.a libtcodpy.pyc $(LIBOBJS_DEBUG) $(GUIOBJS_DEBUG) libtcod-mingw-debug.dll lib/libtcod-mingw-debug.a libtcod-gui-mingw-debug.dll lib/libtcod-gui-mingw-debug.a + +cleanall : clean + @rm -f $(ZLIBOBJS) diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-mingw-sdl2 b/tcod/tcod_sys/libtcod/makefiles/makefile-mingw-sdl2 new file mode 100644 index 00000000..fd35c507 --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-mingw-sdl2 @@ -0,0 +1,194 @@ +# libtcod mingw32 makefile +# to build debug version, run "make -f makefile-mingw debug" +# to build release version, run "make -f makefile-mingw release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL (revision 7020:a500a9dbfb41) +SDL_DIR=dependencies/SDL2-hg +SDL_FLAGS=-I $(SDL_DIR)/include +SDL_LIBS=-L $(SDL_DIR)/lib/mingw -lSDL2 -lm -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lversion -luuid + +# ZLIB +ZLIB_FLAGS=-I src/zlib +ZLIB_LIBS=lib/libz.a + +# OPENGL +OPENGL_LIB=-lopengl32 + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui $(SDL_FLAGS) $(ZLIB_FLAGS) -Wall -fno-strict-aliasing -DTCOD_SDL2 -DNO_OPENGL +# -ansi +MINGW_FLAGS=-static-libgcc -static-libstdc++ +CC=mingw32-gcc +CPP=mingw32-g++ +UPX=dependencies/upx/win/upx.exe +.SUFFIXES: .dll .a .o .h .c .hpp .cpp + +# compilation rules +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -DLIBTCOD_GUI_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + @echo Compiling debug $(basename $<).c + @$(CC) $(CFLAGS) -g -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_GUI_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + @echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + @echo Compiling release $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -DLIBTCOD_EXPORTS -o $@ -c $< +$(TEMP)/libtcod/zlib/%.o : $(SRCDIR)/zlib/%.c + @echo COmpiling zlib $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -o $@ -c $< + + +ZLIBOBJS=$(addprefix $(TEMP)/libtcod/zlib/, \ + adler32.o \ + crc32.o \ + deflate.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + trees.o \ + zutil.o \ + compress.o \ + uncompr.o \ + gzclose.o \ + gzlib.o \ + gzread.o \ + gzwrite.o ) + +LIBOBJS= \ + bresenham_c.o \ + bsp_c.o \ + color_c.o \ + console_c.o \ + fov_c.o \ + fov_circular_raycasting.o \ + fov_diamond_raycasting.o \ + fov_recursive_shadowcasting.o \ + fov_permissive2.o \ + fov_restrictive.o \ + heightmap_c.o \ + image_c.o \ + lex_c.o \ + list_c.o \ + mersenne_c.o \ + noise_c.o \ + parser_c.o \ + path_c.o \ + sys_c.o \ + sys_sdl_c.o \ + sys_sdl_img_bmp.o \ + sys_sdl_img_png.o \ + tree_c.o \ + txtfield_c.o \ + wrappers.o \ + zip_c.o \ + namegen_c.o \ + bresenham.o \ + bsp.o \ + color.o \ + console.o \ + fov.o \ + heightmap.o \ + image.o \ + lex.o \ + mersenne.o \ + mouse.o \ + noise.o \ + parser.o \ + path.o \ + sys.o \ + sys_opengl_c.o \ + txtfield.o \ + zip.o \ + namegen.o \ + png/lodepng.o + +GUIOBJS= \ + gui/button.o \ + gui/container.o \ + gui/flatlist.o \ + gui/hbox.o \ + gui/image.o \ + gui/label.o \ + gui/radiobutton.o \ + gui/slider.o \ + gui/statusbar.o \ + gui/textbox.o \ + gui/togglebutton.o \ + gui/toolbar.o \ + gui/vbox.o \ + gui/widget.o + + +LIBOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS) ) +GUIOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(GUIOBJS) ) +LIBOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS) ) +GUIOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(GUIOBJS) ) + +all : debug release + +release : libtcod-mingw.dll libtcod-gui-mingw.dll upx + +debug : libtcod-mingw-debug.dll libtcod-gui-mingw-debug.dll + +$(TEMP)/libtcod/debug/png : + @mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + @mkdir -p $@ + +$(TEMP)/libtcod/release/png : + @mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + @mkdir -p $@ + +$(TEMP)/libtcod/zlib : + @mkdir -p $@ + +lib/ : + @mkdir -p $@ + +libtcod-mingw.a : $(LIBOBJS_DEBUG) + @ar r $@ $(LIBOBJS_DEBUG) + +lib/libz.a : $(TEMP)/libtcod/zlib $(ZLIBOBJS) + @ar r $@ $(ZLIBOBJS) + +libtcod-mingw.dll : lib/ $(TEMP)/libtcod/release/png $(LIBOBJS_RELEASE) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-mingw.a $(LIBOBJS_RELEASE) $(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) $(MINGW_FLAGS) + +libtcod-gui-mingw.dll : $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-gui-mingw.a $(GUIOBJS_RELEASE) -Llib -ltcod-mingw $(MINGW_FLAGS) + +libtcod-mingw-debug.dll : lib/ $(TEMP)/libtcod/debug/png $(LIBOBJS_DEBUG) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-mingw-debug.a $(LIBOBJS_DEBUG) $(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) $(MINGW_FLAGS) + +libtcod-gui-mingw-debug.dll : $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) lib/libz.a + @echo Linking $@ + @$(CPP) -mwindows -o $@ -shared -Wl,--out-implib,lib/libtcod-gui-mingw-debug.a $(GUIOBJS_DEBUG) -Llib -ltcod-mingw-debug $(MINGW_FLAGS) + +upx : + @echo Compressing... + @$(UPX) libtcod-mingw.dll libtcod-gui-mingw.dll + +clean : + @rm -f $(LIBOBJS_RELEASE) $(GUIOBJS_RELEASE) libtcod-mingw.dll lib/libtcod-mingw.a libtcod-gui-mingw.dll lib/libtcod-gui-mingw.a libtcodpy.pyc $(LIBOBJS_DEBUG) $(GUIOBJS_DEBUG) libtcod-mingw-debug.dll lib/libtcod-mingw-debug.a libtcod-gui-mingw-debug.dll lib/libtcod-gui-mingw-debug.a + +cleanall : clean + @rm -f $(ZLIBOBJS) + diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-osx b/tcod/tcod_sys/libtcod/makefiles/makefile-osx new file mode 100644 index 00000000..6f1a826a --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-osx @@ -0,0 +1,201 @@ +# libtcod makefile +# to build debug version, run "make -f makefile-linux debug" +# to build release version, run "make -f makefile-linux release" +SRCDIR=src +INCDIR=include + +#dependencies +# SDL +SDL_FLAGS=`sdl-config --cflags` +SDL_LIBS=`sdl-config --libs` + +# ZLIB +ZLIB_FLAGS=-I src/zlib +ZLIB_LIBS=lib/libz.a + +#OPENGL +OPENGL_LIB=-framework OpenGL + +OSXCOMPAT=osx/macsupport.m -framework Cocoa + +LIBS=$(ZLIB_LIBS) $(SDL_LIBS) $(OPENGL_LIB) -lm -ldl -lpthread + +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(INCDIR)/gui -Wall $(SDL_FLAGS) $(ZLIB_FLAGS) -fno-strict-aliasing -ansi -fPIC +TEMP=/tmp +CC=clang +CPP=clang++ +.SUFFIXES: a .o .h .c + +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.c + @ echo Compiling release $(basename $<).c + @$(CC) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/%.o : $(SRCDIR)/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/release/gui/%.o : $(SRCDIR)/gui/%.cpp + @ echo Compiling release $(basename $<).cpp + @$(CPP) $(CFLAGS) -O2 -DNDEBUG -s -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.c + @echo Compiling debug $(basename $<).c + @$(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/%.o : $(SRCDIR)/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/gui/%.o : $(SRCDIR)/gui/%.cpp + @echo Compiling debug $(basename $<).cpp + @$(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/zlib/%.o : $(SRCDIR)/zlib/%.c + @ echo Compiling zlib $(basename $<).c + @$(CC) $(CFLAGS) -DNDEBUG -O2 -s -o $@ -c $< + +ZLIBOBJS=$(addprefix $(TEMP)/libtcod/zlib/, \ + adler32.o \ + crc32.o \ + deflate.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + trees.o \ + zutil.o \ + compress.o \ + uncompr.o \ + gzclose.o \ + gzlib.o \ + gzread.o \ + gzwrite.o ) + +LIBOBJS_C= \ + bresenham_c.o \ + bsp_c.o \ + color_c.o \ + console_c.o \ + fov_c.o \ + fov_circular_raycasting.o \ + fov_diamond_raycasting.o \ + fov_recursive_shadowcasting.o \ + fov_permissive2.o \ + fov_restrictive.o \ + heightmap_c.o \ + image_c.o \ + lex_c.o \ + list_c.o \ + mersenne_c.o \ + noise_c.o \ + parser_c.o \ + path_c.o \ + sys_c.o \ + sys_opengl_c.o \ + sys_sdl_c.o \ + sys_sdl_img_bmp.o \ + sys_sdl_img_png.o \ + tree_c.o \ + txtfield_c.o \ + wrappers.o \ + zip_c.o \ + namegen_c.o \ + png/lodepng.o + +LIBOBJS_CPP= \ + bresenham.o \ + bsp.o \ + color.o \ + console.o \ + fov.o \ + heightmap.o \ + image.o \ + lex.o \ + mersenne.o \ + mouse.o \ + noise.o \ + parser.o \ + path.o \ + sys.o \ + txtfield.o \ + zip.o \ + namegen.o + +GUIOBJS= \ + gui/button.o \ + gui/container.o \ + gui/flatlist.o \ + gui/hbox.o \ + gui/image.o \ + gui/label.o \ + gui/radiobutton.o \ + gui/slider.o \ + gui/statusbar.o \ + gui/textbox.o \ + gui/togglebutton.o \ + gui/toolbar.o \ + gui/vbox.o \ + gui/widget.o + + +LIBOBJS_C_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS_C)) +LIBOBJS_CPP_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(LIBOBJS_CPP)) +GUIOBJS_DEBUG=$(addprefix $(TEMP)/libtcod/debug/, $(GUIOBJS)) +LIBOBJS_C_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS_C)) +LIBOBJS_CPP_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(LIBOBJS_CPP)) +GUIOBJS_RELEASE=$(addprefix $(TEMP)/libtcod/release/, $(GUIOBJS)) + +all : debug release + +debug : libtcod_debug.dylib libtcodxx_debug.dylib libtcodgui_debug.dylib + +release : libtcod.dylib libtcodxx.dylib libtcodgui.dylib + +$(TEMP)/libtcod/debug/png : + mkdir -p $@ + +$(TEMP)/libtcod/debug/gui : + mkdir -p $@ + +$(TEMP)/libtcod/release/png : + mkdir -p $@ + +$(TEMP)/libtcod/release/gui : + mkdir -p $@ + +$(TEMP)/libtcod/zlib : + @mkdir -p $@ + +libtcod.a : $(LIBOBJS_C_DEBUG) + ar r $@ $(LIBOBJS_C_DEBUG) + +lib/libz.a : $(TEMP)/libtcod/zlib $(ZLIBOBJS) + @ar r $@ $(ZLIBOBJS) + +libtcodxx.a : $(LIBOBJS_CPP_DEBUG) + ar r $@ $(LIBOBJS_CPP_DEBUG) + +libtcod.dylib : $(TEMP)/libtcod/release/png $(LIBOBJS_C_RELEASE) lib/libz.a + @echo Linking $@ + @$(CPP) -shared -Wl,-install_name,libtcod.dylib $(LDFLAGS) -o $@ $(LIBOBJS_C_RELEASE) $(OSXCOMPAT) $(LIBS) $(CFLAGS) + +libtcodxx.dylib : $(TEMP)/libtcod/release/png $(LIBOBJS_CPP_RELEASE) + @echo Linking $@ + @$(CPP) -shared -Wl,-install_name,libtcodxx.dylib $(LDFLAGS) -o $@ $(LIBOBJS_CPP_RELEASE) $(OSXCOMPAT) -L. -ltcod $(CFLAGS) + +libtcodgui.dylib : $(TEMP)/libtcod/release/gui $(GUIOBJS_RELEASE) + @echo Linking $@ + @$(CPP) -shared -Wl,-install_name,libtcodgui.dylib $(LDFLAGS) -o $@ $(GUIOBJS_RELEASE) $(OSXCOMPAT) -L. -ltcod -ltcodxx $(CFLAGS) + +libtcod_debug.dylib : $(TEMP)/libtcod/debug/png $(LIBOBJS_C_DEBUG) lib/libz.a + @echo Linking $@ + @$(CPP) -shared -Wl,-install_name,$@ $(LDFLAGS) -o $@ $(LIBOBJS_C_DEBUG) $(OSXCOMPAT) $(LIBS) $(CFLAGS) + +libtcodxx_debug.dylib : $(TEMP)/libtcod/debug/png $(LIBOBJS_CPP_DEBUG) + @echo Linking $@ + @$(CPP) -shared -Wl,-install_name,$@ $(LDFLAGS) -o $@ $(LIBOBJS_CPP_DEBUG) $(OSXCOMPAT) -L. -ltcod_debug $(CFLAGS) + +libtcodgui_debug.dylib : $(TEMP)/libtcod/debug/gui $(GUIOBJS_DEBUG) + @echo Linking $@ + @$(CPP) -shared -Wl,-install_name,$@ $(LDFLAGS) -o $@ $(GUIOBJS_DEBUG) $(OSXCOMPAT) -L. -ltcod_debug -ltcodxx_debug $(CFLAGS) + +clean : + \rm -f $(LIBOBJS_C_RELEASE) $(LIBOBJS_CPP_RELEASE) $(GUIOBJS_RELEASE) $(LIBOBJS_C_DEBUG) $(LIBOBJS_CPP_DEBUG) $(GUIOBJS_DEBUG) libtcod.a libtcodxx.a libtcod.dylib libtcodxx.dylib libtcodgui.dylib libtcod_debug.dylib libtcodxx_debug.dylib libtcodgui_debug.dylib libtcodpy.pyc + + +cleanall : clean + @rm -f $(ZLIBOBJS) diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-samples-haiku b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-haiku new file mode 100644 index 00000000..cbb4eeea --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-haiku @@ -0,0 +1,78 @@ +# libtcod samples linux makefile +# to build debug version, run "make -f makefile-samples-linux debug" +# to build release version, run "make -f makefile-samples-linux release" +SRCDIR=. +INCDIR=include +# SDL +SDL_FLAGS=`sdl-config --cflags` +SDL_LIBS=`sdl-config --libs` +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(SRCDIR) -Wall $(SDL_FLAGS) -DNO_OPENGL +CC=gcc +CPP=g++ +TEMP=/tmp +.SUFFIXES: .o .h .c .hpp .cpp + +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< + +C_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_c.o +CPP_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_cpp.o + +HMTOOLOBJS_DEBUG=$(TEMP)/libtcod/debug/samples/hmtool.o \ + $(TEMP)/libtcod/debug/samples/operation.o + +C_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_c.o +CPP_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_cpp.o + +HMTOOLOBJS_RELEASE=$(TEMP)/libtcod/release/samples/hmtool.o \ + $(TEMP)/libtcod/release/samples/operation.o + +all : debug release + +debug : samples_c_debug samples_cpp_debug hmtool_debug + +release : samples_c samples_cpp hmtool + +$(TEMP)/libtcod/debug/hmtool : + \mkdir -p $@ + +$(TEMP)/libtcod/release/hmtool : + \mkdir -p $@ + +$(TEMP)/libtcod/debug/samples : + \mkdir -p $@ + +$(TEMP)/libtcod/release/samples : + \mkdir -p $@ + +samples_c : $(TEMP)/libtcod/release/samples $(C_OBJS_RELEASE) + $(CC) $(C_OBJS_RELEASE) $(CFLAGS) -o $@ -L. -ltcod $(CFLAGS) -Wl,-rpath,. + +samples_cpp : $(TEMP)/libtcod/release/samples $(CPP_OBJS_RELEASE) + $(CPP) $(CPP_OBJS_RELEASE) -o $@ -L. -ltcod -ltcodxx $(CFLAGS) -Wl,-rpath,. + +hmtool : $(TEMP)/libtcod/release/hmtool $(HMTOOLOBJS_RELEASE) + $(CPP) -o $@ $(HMTOOLOBJS_RELEASE) -L. -ltcod -ltcodxx -ltcodgui $(CFLAGS) -Wl,-rpath,. + +samples_c_debug : $(TEMP)/libtcod/debug/samples $(C_OBJS_DEBUG) + $(CC) $(C_OBJS_DEBUG) $(CFLAGS) -o $@ -L. -ltcod_debug $(CFLAGS) -Wl,-rpath,. + +samples_cpp_debug : $(TEMP)/libtcod/debug/samples $(CPP_OBJS_DEBUG) + $(CPP) $(CPP_OBJS_DEBUG) -o $@ -L. -ltcod_debug -ltcodxx_debug $(CFLAGS) -Wl,-rpath,. + +hmtool_debug : $(TEMP)/libtcod/debug/hmtool $(HMTOOLOBJS_DEBUG) + $(CPP) -o $@ $(HMTOOLOBJS_DEBUG) -L. -ltcod_debug -ltcodxx_debug -ltcodgui_debug $(CFLAGS) -Wl,-rpath,. + +clean : + \rm -f $(C_OBJS_RELEASE) $(CPP_OBJS_RELEASE) $(HMTOOLOBJS_RELEASE) samples_c samples_cpp hmtool $(C_OBJS_DEBUG) $(CPP_OBJS_DEBUG) $(HMTOOLOBJS_DEBUG) samples_c_debug samples_cpp_debug hmtool_debug + diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux new file mode 100644 index 00000000..1f9caa3c --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux @@ -0,0 +1,78 @@ +# libtcod samples linux makefile +# to build debug version, run "make -f makefile-samples-linux debug" +# to build release version, run "make -f makefile-samples-linux release" +SRCDIR=. +INCDIR=include +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(SRCDIR) -Wall +CC=gcc +CPP=g++ +TEMP=/tmp +.SUFFIXES: .o .h .c .hpp .cpp + +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< + +C_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_c.o +CPP_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_cpp.o + +HMTOOLOBJS_DEBUG=$(TEMP)/libtcod/debug/samples/hmtool.o \ + $(TEMP)/libtcod/debug/samples/operation.o + +C_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_c.o +CPP_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_cpp.o + +HMTOOLOBJS_RELEASE=$(TEMP)/libtcod/release/samples/hmtool.o \ + $(TEMP)/libtcod/release/samples/operation.o + +all : debug release + +debug : samples_c_debug samples_cpp_debug hmtool_debug + +release : samples_c samples_cpp hmtool + +$(TEMP)/libtcod/debug/hmtool : + \mkdir -p $@ + +$(TEMP)/libtcod/release/hmtool : + \mkdir -p $@ + +$(TEMP)/libtcod/debug/samples : + \mkdir -p $@ + +$(TEMP)/libtcod/release/samples : + \mkdir -p $@ + +samples_c : $(TEMP)/libtcod/release/samples $(C_OBJS_RELEASE) + $(CC) $(C_OBJS_RELEASE) $(CFLAGS) -o $@ -L. -ltcod -lm $(CFLAGS) -Wl,-rpath,. + upx ./samples_c + +samples_cpp : $(TEMP)/libtcod/release/samples $(CPP_OBJS_RELEASE) + $(CPP) $(CPP_OBJS_RELEASE) -o $@ -L. -ltcod -ltcodxx -lm $(CFLAGS) -Wl,-rpath,. + upx ./samples_cpp + +hmtool : $(TEMP)/libtcod/release/hmtool $(HMTOOLOBJS_RELEASE) + $(CPP) -o $@ $(HMTOOLOBJS_RELEASE) -L. -ltcod -ltcodxx -ltcodgui $(CFLAGS) -Wl,-rpath,. + upx ./hmtool + +samples_c_debug : $(TEMP)/libtcod/debug/samples $(C_OBJS_DEBUG) + $(CC) $(C_OBJS_DEBUG) $(CFLAGS) -o $@ -L. -ltcod_debug -lm $(CFLAGS) -Wl,-rpath,. + +samples_cpp_debug : $(TEMP)/libtcod/debug/samples $(CPP_OBJS_DEBUG) + $(CPP) $(CPP_OBJS_DEBUG) -o $@ -L. -ltcod_debug -ltcodxx_debug -lm $(CFLAGS) -Wl,-rpath,. + +hmtool_debug : $(TEMP)/libtcod/debug/hmtool $(HMTOOLOBJS_DEBUG) + $(CPP) -o $@ $(HMTOOLOBJS_DEBUG) -L. -ltcod_debug -ltcodxx_debug -ltcodgui_debug $(CFLAGS) -Wl,-rpath,. + +clean : + \rm -f $(C_OBJS_RELEASE) $(CPP_OBJS_RELEASE) $(HMTOOLOBJS_RELEASE) samples_c samples_cpp hmtool $(C_OBJS_DEBUG) $(CPP_OBJS_DEBUG) $(HMTOOLOBJS_DEBUG) samples_c_debug samples_cpp_debug hmtool_debug + diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux-win32 b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux-win32 new file mode 100644 index 00000000..46025131 --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux-win32 @@ -0,0 +1,82 @@ +# libtcod samples linux->mingw32 cross compilation makefile +# to build debug version, run "make -f makefile-samples-mingw debug" +# to build release version, run "make -f makefile-samples-mingw release" +SRCDIR=. +INCDIR=include +SDLDIR=dependencies/SDL-1.2.15 +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(SDLDIR)/include -I$(SRCDIR) -Wall +CC=i586-mingw32msvc-gcc +CPP=i586-mingw32msvc-g++ +UPX=dependencies/upx/win/upx.exe +TEMP=/tmp + +#MINGW_FLAGS=-static-libgcc -static-libstdc++ + +.SUFFIXES: .dll .a .o .h .c .hpp .cpp + +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< + +C_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_c.o +CPP_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_cpp.o + +HMTOOLOBJS_DEBUG=$(TEMP)/libtcod/debug/samples/hmtool.o \ + $(TEMP)/libtcod/debug/samples/operation.o + +C_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_c.o +CPP_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_cpp.o + +HMTOOLOBJS_RELEASE=$(TEMP)/libtcod/release/samples/hmtool.o \ + $(TEMP)/libtcod/release/samples/operation.o + +all : debug release + +debug : samples_c_debug.exe samples_cpp_debug.exe hmtool_debug.exe + +release : samples_c.exe samples_cpp.exe hmtool.exe + +$(TEMP)/libtcod/debug/hmtool : + mkdir -p $@ + +$(TEMP)/libtcod/release/hmtool : + mkdir -p $@ + +$(TEMP)/libtcod/debug/samples : + mkdir -p $@ + +$(TEMP)/libtcod/release/samples : + mkdir -p $@ + +samples_c.exe : $(TEMP)/libtcod/release/samples $(C_OBJS_RELEASE) + $(CPP) $(C_OBJS_RELEASE) -o $@ -Llib -ltcod-mingw -L$(SDLDIR)/lib/mingw -lSDL.dll -mwindows $(MINGW_FLAGS) + +samples_cpp.exe : $(TEMP)/libtcod/release/samples $(CPP_OBJS_RELEASE) + $(CPP) $(CPP_OBJS_RELEASE) -o $@ -Llib -ltcod-mingw -L$(SDLDIR)/lib/mingw -lSDL.dll -mwindows $(MINGW_FLAGS) + +hmtool.exe : $(TEMP)/libtcod/release/hmtool $(HMTOOLOBJS_RELEASE) + $(CPP) $(HMTOOLOBJS_RELEASE) -o $@ -Llib -ltcod-mingw -ltcod-gui-mingw -mwindows $(MINGW_FLAGS) + +samples_c_debug.exe : $(TEMP)/libtcod/debug/samples $(C_OBJS_DEBUG) + $(CPP) $(C_OBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -L$(SDLDIR)/lib/mingw -lSDL.dll $(MINGW_FLAGS) + +samples_cpp_debug.exe : $(TEMP)/libtcod/debug/samples $(CPP_OBJS_DEBUG) + $(CPP) $(CPP_OBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -L$(SDLDIR)/lib/mingw -lSDL.dll $(MINGW_FLAGS) + +hmtool_debug.exe : $(TEMP)/libtcod/debug/hmtool $(HMTOOLOBJS_DEBUG) + $(CPP) $(HMTOOLOBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -ltcod-gui-mingw-debug $(MINGW_FLAGS) + +clean : + rm -f $(C_OBJS_RELEASE) $(CPP_OBJS_RELEASE) $(HMTOOLOBJS_RELEASE) \ + samples_c.exe samples_cpp.exe hmtool.exe \ + $(C_OBJS_DEBUG) $(CPP_OBJS_DEBUG) $(HMTOOLOBJS_DEBUG) \ + samples_c_debug.exe samples_cpp_debug.exe hmtool_debug.exe diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux64-32 b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux64-32 new file mode 100644 index 00000000..21464b2a --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-linux64-32 @@ -0,0 +1,78 @@ +# libtcod samples linux 64 -> 32 cross compilation makefile +# to build debug version, run "make -f makefile-samples-linux64-32 debug" +# to build release version, run "make -f makefile-samples-linux64-32 release" +SRCDIR=. +INCDIR=include +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(SRCDIR) -Wall -m32 +CC=gcc +CPP=g++ +TEMP=/tmp +.SUFFIXES: .o .h .c .hpp .cpp + +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< + +C_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_c.o +CPP_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_cpp.o + +HMTOOLOBJS_DEBUG=$(TEMP)/libtcod/debug/samples/hmtool.o \ + $(TEMP)/libtcod/debug/samples/operation.o + +C_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_c.o +CPP_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_cpp.o + +HMTOOLOBJS_RELEASE=$(TEMP)/libtcod/release/samples/hmtool.o \ + $(TEMP)/libtcod/release/samples/operation.o + +all : debug release + +debug : samples_c_debug samples_cpp_debug hmtool_debug + +release : samples_c samples_cpp hmtool + +$(TEMP)/libtcod/debug/hmtool : + \mkdir -p $@ + +$(TEMP)/libtcod/release/hmtool : + \mkdir -p $@ + +$(TEMP)/libtcod/debug/samples : + \mkdir -p $@ + +$(TEMP)/libtcod/release/samples : + \mkdir -p $@ + +samples_c : $(TEMP)/libtcod/release/samples $(C_OBJS_RELEASE) + $(CC) $(C_OBJS_RELEASE) $(CFLAGS) -o $@ -L. -Llib32 -ltcod -lm $(CFLAGS) -Wl,-rpath,. -Wl,--unresolved-symbols=ignore-in-shared-libs + upx ./samples_c + +samples_cpp : $(TEMP)/libtcod/release/samples $(CPP_OBJS_RELEASE) + $(CPP) $(CPP_OBJS_RELEASE) -o $@ -L. -Llib32 -ltcod -ltcodxx -lm $(CFLAGS) -Wl,-rpath,. -Wl,--unresolved-symbols=ignore-in-shared-libs + upx ./samples_cpp + +hmtool : $(TEMP)/libtcod/release/hmtool $(HMTOOLOBJS_RELEASE) + $(CPP) -o $@ $(HMTOOLOBJS_RELEASE) -L. -Llib32 -ltcod -ltcodxx -ltcodgui $(CFLAGS) -Wl,-rpath,. -Wl,--unresolved-symbols=ignore-in-shared-libs + upx ./hmtool + +samples_c_debug : $(TEMP)/libtcod/debug/samples $(C_OBJS_DEBUG) + $(CC) $(C_OBJS_DEBUG) $(CFLAGS) -o $@ -L. -Llib32 -lGL -lSDL -ltcod_debug -lm $(CFLAGS) -Wl,-rpath,. -Wl,--unresolved-symbols=ignore-in-shared-libs + +samples_cpp_debug : $(TEMP)/libtcod/debug/samples $(CPP_OBJS_DEBUG) + $(CPP) $(CPP_OBJS_DEBUG) -o $@ -L. -Llib32 -ltcod_debug -ltcodxx_debug -lm $(CFLAGS) -Wl,-rpath,. -Wl,--unresolved-symbols=ignore-in-shared-libs + +hmtool_debug : $(TEMP)/libtcod/debug/hmtool $(HMTOOLOBJS_DEBUG) + $(CPP) -o $@ $(HMTOOLOBJS_DEBUG) -L. -Llib32 -ltcod_debug -ltcodxx_debug -ltcodgui_debug $(CFLAGS) -Wl,-rpath,. -Wl,--unresolved-symbols=ignore-in-shared-libs + +clean : + \rm -f $(C_OBJS_RELEASE) $(CPP_OBJS_RELEASE) $(HMTOOLOBJS_RELEASE) samples_c samples_cpp hmtool $(C_OBJS_DEBUG) $(CPP_OBJS_DEBUG) $(HMTOOLOBJS_DEBUG) samples_c_debug samples_cpp_debug hmtool_debug + diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw new file mode 100644 index 00000000..fb7908ad --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw @@ -0,0 +1,84 @@ +# libtcod samples mingw32 makefile +# to build debug version, run "make -f makefile-samples-mingw debug" +# to build release version, run "make -f makefile-samples-mingw release" +SRCDIR=. +INCDIR=include +SDLDIR=dependencies/SDL-1.2.15 +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(SDLDIR)/include -I$(SRCDIR) -Wall +CC=mingw32-gcc +CPP=mingw32-g++ +UPX=dependencies/upx/win/upx.exe + +MINGW_FLAGS=-static-libgcc -static-libstdc++ + +.SUFFIXES: .dll .a .o .h .c .hpp .cpp + +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< + +C_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_c.o +CPP_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_cpp.o + +HMTOOLOBJS_DEBUG=$(TEMP)/libtcod/debug/samples/hmtool.o \ + $(TEMP)/libtcod/debug/samples/operation.o + +C_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_c.o +CPP_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_cpp.o + +HMTOOLOBJS_RELEASE=$(TEMP)/libtcod/release/samples/hmtool.o \ + $(TEMP)/libtcod/release/samples/operation.o + +all : debug release + +debug : samples_c_debug.exe samples_cpp_debug.exe hmtool_debug.exe + +release : samples_c.exe samples_cpp.exe hmtool.exe + +$(TEMP)/libtcod/debug/hmtool : + mkdir -p $@ + +$(TEMP)/libtcod/release/hmtool : + mkdir -p $@ + +$(TEMP)/libtcod/debug/samples : + mkdir -p $@ + +$(TEMP)/libtcod/release/samples : + mkdir -p $@ + +samples_c.exe : $(TEMP)/libtcod/release/samples $(C_OBJS_RELEASE) + $(CPP) $(C_OBJS_RELEASE) -o $@ -Llib -ltcod-mingw -L$(SDLDIR)/lib/mingw -lSDL.dll -mwindows $(MINGW_FLAGS) + $(UPX) samples_c.exe + +samples_cpp.exe : $(TEMP)/libtcod/release/samples $(CPP_OBJS_RELEASE) + $(CPP) $(CPP_OBJS_RELEASE) -o $@ -Llib -ltcod-mingw -L$(SDLDIR)/lib/mingw -lSDL.dll -mwindows $(MINGW_FLAGS) + $(UPX) samples_cpp.exe + +hmtool.exe : $(TEMP)/libtcod/release/hmtool $(HMTOOLOBJS_RELEASE) + $(CPP) $(HMTOOLOBJS_RELEASE) -o $@ -Llib -ltcod-mingw -ltcod-gui-mingw -mwindows $(MINGW_FLAGS) + $(UPX) hmtool.exe + +samples_c_debug.exe : $(TEMP)/libtcod/debug/samples $(C_OBJS_DEBUG) + $(CPP) $(C_OBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -L$(SDLDIR)/lib/mingw -lSDL.dll $(MINGW_FLAGS) + +samples_cpp_debug.exe : $(TEMP)/libtcod/debug/samples $(CPP_OBJS_DEBUG) + $(CPP) $(CPP_OBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -L$(SDLDIR)/lib/mingw -lSDL.dll $(MINGW_FLAGS) + +hmtool_debug.exe : $(TEMP)/libtcod/debug/hmtool $(HMTOOLOBJS_DEBUG) + $(CPP) $(HMTOOLOBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -ltcod-gui-mingw-debug $(MINGW_FLAGS) + +clean : + rm -f $(C_OBJS_RELEASE) $(CPP_OBJS_RELEASE) $(HMTOOLOBJS_RELEASE) \ + samples_c.exe samples_cpp.exe hmtool.exe \ + $(C_OBJS_DEBUG) $(CPP_OBJS_DEBUG) $(HMTOOLOBJS_DEBUG) \ + samples_c_debug.exe samples_cpp_debug.exe hmtool_debug.exe diff --git a/tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw-sdl2 b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw-sdl2 new file mode 100644 index 00000000..cf032eb2 --- /dev/null +++ b/tcod/tcod_sys/libtcod/makefiles/makefile-samples-mingw-sdl2 @@ -0,0 +1,81 @@ +# libtcod samples mingw32 makefile +# to build debug version, run "make -f makefile-samples-mingw debug" +# to build release version, run "make -f makefile-samples-mingw release" +SRCDIR=. +INCDIR=include +SDLDIR=dependencies/SDL2-hg +CFLAGS=$(FLAGS) -I$(INCDIR) -I$(SDLDIR)/include -I$(SRCDIR) -Wall -DTCOD_SDL2 +CC=mingw32-gcc +CPP=mingw32-g++ +UPX=dependencies/upx/win/upx.exe +.SUFFIXES: .dll .a .o .h .c .hpp .cpp + +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/debug/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -g -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/%.c + $(CC) $(CFLAGS) -O2 -s -o $@ -c $< +$(TEMP)/libtcod/release/samples/%.o : $(SRCDIR)/samples/hmtool/%.cpp + $(CPP) $(CFLAGS) -O2 -s -o $@ -c $< + +C_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_c.o +CPP_OBJS_DEBUG=$(TEMP)/libtcod/debug/samples/samples_cpp.o + +HMTOOLOBJS_DEBUG=$(TEMP)/libtcod/debug/samples/hmtool.o \ + $(TEMP)/libtcod/debug/samples/operation.o + +C_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_c.o +CPP_OBJS_RELEASE=$(TEMP)/libtcod/release/samples/samples_cpp.o + +HMTOOLOBJS_RELEASE=$(TEMP)/libtcod/release/samples/hmtool.o \ + $(TEMP)/libtcod/release/samples/operation.o + +all : debug release + +debug : samples_c_debug.exe samples_cpp_debug.exe hmtool_debug.exe + +release : samples_c.exe samples_cpp.exe hmtool.exe + +$(TEMP)/libtcod/debug/hmtool : + mkdir -p $@ + +$(TEMP)/libtcod/release/hmtool : + mkdir -p $@ + +$(TEMP)/libtcod/debug/samples : + mkdir -p $@ + +$(TEMP)/libtcod/release/samples : + mkdir -p $@ + +samples_c.exe : $(TEMP)/libtcod/release/samples $(C_OBJS_RELEASE) + $(CC) $(C_OBJS_RELEASE) $(CFLAGS) -o $@ -Llib -ltcod-mingw -L$(SDLDIR)/lib/mingw -lSDL2 + $(UPX) samples_c.exe + +samples_cpp.exe : $(TEMP)/libtcod/release/samples $(CPP_OBJS_RELEASE) + $(CPP) $(CPP_OBJS_RELEASE) -o $@ -Llib -ltcod-mingw -L$(SDLDIR)/lib/mingw -lSDL2 + $(UPX) samples_cpp.exe + +hmtool.exe : $(TEMP)/libtcod/release/hmtool $(HMTOOLOBJS_RELEASE) + $(CPP) -o $@ $(HMTOOLOBJS_RELEASE) -Llib -ltcod-mingw -ltcod-gui-mingw + $(UPX) hmtool.exe + +samples_c_debug.exe : $(TEMP)/libtcod/debug/samples $(C_OBJS_DEBUG) + $(CC) $(C_OBJS_DEBUG) $(CFLAGS) -o $@ -Llib -ltcod-mingw-debug -L$(SDLDIR)/lib/mingw -lSDL2 + +samples_cpp_debug.exe : $(TEMP)/libtcod/debug/samples $(CPP_OBJS_DEBUG) + $(CPP) $(CPP_OBJS_DEBUG) -o $@ -Llib -ltcod-mingw-debug -L$(SDLDIR)/lib/mingw -lSDL2 + +hmtool_debug.exe : $(TEMP)/libtcod/debug/hmtool $(HMTOOLOBJS_DEBUG) + $(CPP) -o $@ $(HMTOOLOBJS_DEBUG) -Llib -ltcod-mingw-debug -ltcod-gui-mingw-debug + +clean : + rm -f $(C_OBJS_RELEASE) $(CPP_OBJS_RELEASE) $(HMTOOLOBJS_RELEASE) \ + samples_c.exe samples_cpp.exe hmtool.exe \ + $(C_OBJS_DEBUG) $(CPP_OBJS_DEBUG) $(HMTOOLOBJS_DEBUG) \ + samples_c_debug.exe samples_cpp_debug.exe hmtool_debug.exe diff --git a/tcod/tcod_sys/libtcod/osx/._hmtool_Info.plist b/tcod/tcod_sys/libtcod/osx/._hmtool_Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..3cc14a77a79f1527b2f2cfcf5809a39cb313dee1 GIT binary patch literal 222 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@fsio@$UgK5x_AdBnYYuq+J^qI7A5ADWagzZ6zUro7#Lcc8mC%XB$^poyXWVp=cL9|7#TQc t6y@ipTDzJ#x>`7z8R}ZNIlJkan7JA1IvF~d>$;j)nwS~7m>2$Vqox1Ojhs@R)|o50+1L3ClDI}@fsio@$UgK5x_AdBnYYuq+J^qI7A5ADWagzZ6zUro7#Lcc8mC%XB$^poyXWVp=cL9|7#TQc t6y@ipTDzJ#x>`7z8R}ZNIlJkan7JA1IvF~d>$;j)nwS~7m>2$Vqox1Ojhs@R)|o50+1L3ClDI}@fsio@$UgK5x_AdBnYYuq+J^qI7A5ADWagzZ6zUro7#Lcc8mC%XB$^poyXWVp=cL9|7#TQc t6y@ipTDzJ#x>`7z8R}ZNIlJkan7JA1IvF~d>$;j)nwS~7m>2$Vqox1Ojhs@R)|o50+1L3ClDI}@fsio@$UgK5x_AdBnYYuq+J^qI7A5ADWagzZ6zUro7#Lcc8mC%XB$^poyXWVp=cL9|7#TQc t6y@ipTDzJ#x>`7z8R}ZNIlJkan7JA1IvF~d>$;j)nwS~7m>2$Vqox1Ojhs@R)|o50+1L3ClDI}@fsio@$UgK5x_AdBnYYuq+J^qI7A5ADWagzZ6zUro7#Lcc8mC%XB$^poyXWVp=cL9|7#TQc t6y@ipTDzJ#x>`7z8R}ZNIlJkan7JA1IvF~d>$;j)nwS~7m>2 + + + + CFBundleExecutable + hmtool + + diff --git a/tcod/tcod_sys/libtcod/osx/macsupport.h b/tcod/tcod_sys/libtcod/osx/macsupport.h new file mode 100644 index 00000000..308fec1f --- /dev/null +++ b/tcod/tcod_sys/libtcod/osx/macsupport.h @@ -0,0 +1,16 @@ +/* SDLMain.m - main entry point for our Cocoa-ized SDL app + Initial Version: Darrell Walisser + Non-NIB-Code & other changes: Max Horn + + Feel free to customize this file to suit your needs + */ + +#ifndef _macsupport_h_ +#define _macsupport_h_ + +#import + +@interface SDLMain : NSObject +@end + +#endif /* _macsupport_h_ */ diff --git a/tcod/tcod_sys/libtcod/osx/macsupport.m b/tcod/tcod_sys/libtcod/osx/macsupport.m new file mode 100644 index 00000000..8de61401 --- /dev/null +++ b/tcod/tcod_sys/libtcod/osx/macsupport.m @@ -0,0 +1,29 @@ +#import "macsupport.h" + +/* Portions of CPS.h */ +typedef struct CPSProcessSerNum +{ + UInt32 lo; + UInt32 hi; +} CPSProcessSerNum; + +extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); +extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 + _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); +extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); + +void CustomSDLMain() +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [ NSApplication sharedApplication ]; + [ NSApp setMainMenu:[[NSMenu alloc] init] ]; + + { + CPSProcessSerNum PSN; + /* Tell the dock about us */ + if (!CPSGetCurrentProcess(&PSN)) + if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) + if (!CPSSetFrontProcess(&PSN)) + [NSApplication sharedApplication]; + } +} diff --git a/tcod/tcod_sys/libtcod/osx/samples_c_Info.plist b/tcod/tcod_sys/libtcod/osx/samples_c_Info.plist new file mode 100644 index 00000000..16cb54e1 --- /dev/null +++ b/tcod/tcod_sys/libtcod/osx/samples_c_Info.plist @@ -0,0 +1,8 @@ + + + + + CFBundleExecutable + samples_c + + diff --git a/tcod/tcod_sys/libtcod/osx/samples_cpp_Info.plist b/tcod/tcod_sys/libtcod/osx/samples_cpp_Info.plist new file mode 100644 index 00000000..2f697e09 --- /dev/null +++ b/tcod/tcod_sys/libtcod/osx/samples_cpp_Info.plist @@ -0,0 +1,8 @@ + + + + + CFBundleExecutable + samples_cpp + + diff --git a/tcod/tcod_sys/libtcod/src/README.txt b/tcod/tcod_sys/libtcod/src/README.txt new file mode 100644 index 00000000..f3e663ed --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/README.txt @@ -0,0 +1,46 @@ +This is the Doryen library source code. + +libtcod.h and libtcod.hpp are the main headers, included respectively by +the C and C++ programs that use libtcod. + +Each "toolkit" is in a separate file set. For each toolkit, you may have : +* include/.h : the C header +* include/.hpp : the C++ header +* src/_c.c : the C source code that contains the actual implementation +* src/.cpp : the C++ wrapper + +Current toolkits : +bresenham : line drawing using the Bresenham algorithm. +bsp : binary space partition tree module +color : 24 bits colors operations. +console : true color console emulator. It relies on some private functions of the sys toolkit. +fov : field of view calculator. +heightmap : heightmap toolkit. +image : image manipulation. It relies on some private functions of the sys toolkit. +list : a fast and lightweight generic container (faster than STL). +mersenne : pseudorandom number generator using the Mersenne twister algorithm. +mouse : mouse support. +namegen : name generator +noise : various noise generators. +parser : config file parser. +path : path finding module. +sys : system specific functions. +txtfield : work-in-progress text input utility +zip : compression module + +Note that some of the sys toolkits rely on system dependant functions. +They have currently a single working implementation relying on SDL : sys_sdl_c.c +As it is heavily system dependant, the mouse C implementation is in sys_sdl_c.c. +As of 1.4, the image load/save functions are isolated in sys_sdl_XXX.c, +XXX being the image type (currently bmp and png). +As of 1.5.1, sys_opengl_c.c contains OpenGL and GLSL renderers. Those two +renderers are still dependant on SDL. + +libtcod_int.h contains everything that is exported by the toolkits +(implemented in a toolkit and used in another one) but should not be seen +by the user of the library. + +These are the private (or undocumented) modules : +lex : a generic lexical parser. +tree : a minimalist tree toolkit. +sys : sys also contains an undocumented threading toolkit. diff --git a/tcod/tcod_sys/libtcod/src/bresenham.cpp b/tcod/tcod_sys/libtcod/src/bresenham.cpp new file mode 100644 index 00000000..0c4c6951 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/bresenham.cpp @@ -0,0 +1,51 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "libtcod.hpp" + +// ********** bresenham line drawing ********** +void TCODLine::init(int xFrom, int yFrom, int xTo, int yTo) { + TCOD_line_init(xFrom,yFrom,xTo,yTo); +} + +bool TCODLine::step(int *xCur, int *yCur) { + return TCOD_line_step(xCur,yCur) != 0; +} + +static TCODLineListener *listener=NULL; + +// C to C++ bridge +extern "C" uint8 internalListener(int x,int y) { + return listener->putPoint(x,y) ? 1 : 0; +} + +bool TCODLine::line(int xFrom, int yFrom, int xTo, int yTo, TCODLineListener *plistener) { + listener=plistener; + return TCOD_line(xFrom,yFrom,xTo,yTo,internalListener) != 0; +} + + diff --git a/tcod/tcod_sys/libtcod/src/bresenham_c.c b/tcod/tcod_sys/libtcod/src/bresenham_c.c new file mode 100644 index 00000000..f0ad050d --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/bresenham_c.c @@ -0,0 +1,103 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "libtcod.h" + +static TCOD_bresenham_data_t bresenham_data; + +/* ********** bresenham line drawing ********** */ +void TCOD_line_init_mt(int xFrom, int yFrom, int xTo, int yTo, TCOD_bresenham_data_t *data) { + data->origx=xFrom; + data->origy=yFrom; + data->destx=xTo; + data->desty=yTo; + data->deltax=xTo - xFrom; + data->deltay=yTo - yFrom; + if ( data->deltax > 0 ) { + data->stepx=1; + } else if ( data->deltax < 0 ){ + data->stepx=-1; + } else data->stepx=0; + if ( data->deltay > 0 ) { + data->stepy=1; + } else if ( data->deltay < 0 ){ + data->stepy=-1; + } else data->stepy = 0; + if ( data->stepx*data->deltax > data->stepy*data->deltay ) { + data->e = data->stepx*data->deltax; + data->deltax *= 2; + data->deltay *= 2; + } else { + data->e = data->stepy*data->deltay; + data->deltax *= 2; + data->deltay *= 2; + } +} + +bool TCOD_line_step_mt(int *xCur, int *yCur, TCOD_bresenham_data_t *data) { + if ( data->stepx*data->deltax > data->stepy*data->deltay ) { + if ( data->origx == data->destx ) return true; + data->origx+=data->stepx; + data->e -= data->stepy*data->deltay; + if ( data->e < 0) { + data->origy+=data->stepy; + data->e+=data->stepx*data->deltax; + } + } else { + if ( data->origy == data->desty ) return true; + data->origy+=data->stepy; + data->e -= data->stepx*data->deltax; + if ( data->e < 0) { + data->origx+=data->stepx; + data->e+=data->stepy*data->deltay; + } + } + *xCur=data->origx; + *yCur=data->origy; + return false; +} + +bool TCOD_line_mt(int xo, int yo, int xd, int yd, TCOD_line_listener_t listener, TCOD_bresenham_data_t *data) { + TCOD_line_init_mt(xo,yo,xd,yd,data); + do { + if (! listener(xo,yo)) return false; + } while (! TCOD_line_step_mt(&xo,&yo,data)); + return true; +} + +void TCOD_line_init(int xFrom, int yFrom, int xTo, int yTo) { + TCOD_line_init_mt(xFrom,yFrom,xTo,yTo,&bresenham_data); +} + +bool TCOD_line_step(int *xCur, int *yCur) { + return TCOD_line_step_mt(xCur,yCur,&bresenham_data); +} + +bool TCOD_line(int xo, int yo, int xd, int yd, TCOD_line_listener_t listener) { + return TCOD_line_mt(xo,yo,xd,yd,listener,&bresenham_data); +} + diff --git a/tcod/tcod_sys/libtcod/src/bsp.cpp b/tcod/tcod_sys/libtcod/src/bsp.cpp new file mode 100644 index 00000000..44df469c --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/bsp.cpp @@ -0,0 +1,168 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" + +TCODBsp::TCODBsp(TCODBsp *father, bool left) { + if ( father->horizontal ) { + x=father->x; + w=father->w; + y = left ? father->y : father->position; + h = left ? father->position - y: father->y + father->h - father->position; + } else { + y=father->y; + h=father->h; + x = left ? father->x : father->position; + w = left ? father->position - x: father->x + father->w - father->position; + } + level=father->level+1; +} + +TCODBsp::~TCODBsp() { + removeSons(); +} + +bool TCODBsp::traversePreOrder(ITCODBspCallback *listener, void *userData) { + if (!listener->visitNode(this,userData)) return false; + if ( getLeft() && !getLeft()->traversePreOrder(listener,userData) ) return false; + if ( getRight() && !getRight()->traversePreOrder(listener,userData)) return false; + return true; +} + +bool TCODBsp::traverseInOrder(ITCODBspCallback *listener, void *userData) { + if ( getLeft() && !getLeft()->traverseInOrder(listener,userData) ) return false; + if (!listener->visitNode(this,userData)) return false; + if ( getRight() && !getRight()->traverseInOrder(listener,userData)) return false; + return true; +} + +bool TCODBsp::traversePostOrder(ITCODBspCallback *listener,void *userData) { + if ( getLeft() && !getLeft()->traversePostOrder(listener,userData)) return false; + if ( getRight() && !getRight()->traversePostOrder(listener,userData)) return false; + if (!listener->visitNode(this,userData)) return false; + return true; +} + +bool TCODBsp::traverseLevelOrder(ITCODBspCallback *listener, void *userData) { + TCODList stack; + stack.push(this); + while ( ! stack.isEmpty() ) { + TCODBsp *node=stack.get(0); + stack.remove(node); + if ( node->getLeft() ) stack.push(node->getLeft()); + if ( node->getRight() ) stack.push(node->getRight()); + if (!listener->visitNode(node,userData)) return false; + } + return true; +} + +bool TCODBsp::traverseInvertedLevelOrder(ITCODBspCallback *listener, void *userData) { + TCODList stack1; + TCODList stack2; + stack1.push(this); + while ( ! stack1.isEmpty() ) { + TCODBsp *node=stack1.get(0); + stack2.push(node); + stack1.remove(node); + if ( node->getLeft() ) stack1.push(node->getLeft()); + if ( node->getRight() ) stack1.push(node->getRight()); + } + while ( ! stack2.isEmpty() ) { + TCODBsp *node=stack2.pop(); + if (!listener->visitNode(node,userData)) return false; + } + return true; +} + +void TCODBsp::removeSons() { + TCODBsp *node=(TCODBsp *)sons; + while ( node ) { + TCODBsp *nextNode=(TCODBsp *)node->next; + node->removeSons(); + delete node; + node=nextNode; + } + sons=NULL; +} + +void TCODBsp::splitOnce(bool horizontal, int position) { + this->horizontal = horizontal; + this->position=position; + addSon(new TCODBsp(this,true)); + addSon(new TCODBsp(this,false)); +} + +void TCODBsp::splitRecursive(TCODRandom *randomizer, int nb, int minHSize, int minVSize, float maxHRatio, float maxVRatio) { + if ( nb == 0 || (w < 2*minHSize && h < 2*minVSize ) ) return; + bool horiz; + if (! randomizer ) randomizer=TCODRandom::getInstance(); + // promote square rooms + if ( h < 2*minVSize || w > h * maxHRatio ) horiz = false; + else if ( w < 2*minHSize || h > w * maxVRatio) horiz = true; + else horiz = randomizer->getInt(0,1) == 0; + int position; + if ( horiz ) { + position = randomizer->getInt(y+minVSize,y+h-minVSize); + } else { + position = randomizer->getInt(x+minHSize,x+w-minHSize); + } + splitOnce(horiz,position); + getLeft()->splitRecursive(randomizer,nb-1,minHSize,minVSize,maxHRatio,maxVRatio); + getRight()->splitRecursive(randomizer,nb-1,minHSize,minVSize,maxHRatio,maxVRatio); +} + +void TCODBsp::resize(int x,int y, int w, int h) { + this->x=x; + this->y=y; + this->w=w; + this->h=h; + if ( getLeft() ) { + if ( horizontal ) { + getLeft()->resize(x,y,w,position-y); + getRight()->resize(x,position,w,y+h-position); + } else { + getLeft()->resize(x,y,position-x,h); + getRight()->resize(position,y,x+w-position,h); + } + } +} + +bool TCODBsp::contains(int px, int py) const { + return (px >= x && py >= y && px < x+w && py < y+h); +} + +TCODBsp *TCODBsp::findNode(int px, int py) { + if ( ! contains(px,py) ) return NULL; + if ( ! isLeaf() ) { + TCODBsp *left,*right; + left=getLeft(); + if ( left->contains(px,py) ) return left->findNode(px,py); + right=getRight(); + if ( right->contains(px,py) ) return right->findNode(px,py); + } + return this; +} + diff --git a/tcod/tcod_sys/libtcod/src/bsp_c.c b/tcod/tcod_sys/libtcod/src/bsp_c.c new file mode 100644 index 00000000..fa7a4b0d --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/bsp_c.c @@ -0,0 +1,213 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.h" + +TCOD_bsp_t *TCOD_bsp_new() { + return (TCOD_bsp_t *)calloc(sizeof(TCOD_bsp_t),1); +} + +TCOD_bsp_t *TCOD_bsp_new_with_size(int x,int y,int w, int h) { + TCOD_bsp_t *bsp=(TCOD_bsp_t *)calloc(sizeof(TCOD_bsp_t),1); + bsp->x=x; + bsp->y=y; + bsp->w=w; + bsp->h=h; + return bsp; +} + +TCOD_bsp_t * TCOD_bsp_left(TCOD_bsp_t *node) { + return (TCOD_bsp_t *)node->tree.sons; +} + +TCOD_bsp_t * TCOD_bsp_right(TCOD_bsp_t *node) { + return node->tree.sons ? (TCOD_bsp_t *)node->tree.sons->next : NULL; +} + +TCOD_bsp_t * TCOD_bsp_father(TCOD_bsp_t *node) { + return (TCOD_bsp_t *)node->tree.father; +} + +bool TCOD_bsp_is_leaf(TCOD_bsp_t *node) { + return node->tree.sons==NULL; +} + +void TCOD_bsp_delete(TCOD_bsp_t *node) { + TCOD_bsp_remove_sons(node); + free(node); +} + +static TCOD_bsp_t *TCOD_bsp_new_intern(TCOD_bsp_t *father, bool left) { + TCOD_bsp_t *bsp=(TCOD_bsp_t *)calloc(sizeof(TCOD_bsp_t),1); + if ( father->horizontal ) { + bsp->x=father->x; + bsp->w=father->w; + bsp->y = left ? father->y : father->position; + bsp->h = left ? father->position - bsp->y: father->y + father->h - father->position; + } else { + bsp->y=father->y; + bsp->h=father->h; + bsp->x = left ? father->x : father->position; + bsp->w = left ? father->position - bsp->x: father->x + father->w - father->position; + } + bsp->level=father->level+1; + return bsp; +} + +bool TCOD_bsp_traverse_pre_order(TCOD_bsp_t *node, TCOD_bsp_callback_t listener, void *userData) { + if (!listener(node,userData)) return false; + if ( TCOD_bsp_left(node) && !TCOD_bsp_traverse_pre_order(TCOD_bsp_left(node),listener,userData)) return false; + if ( TCOD_bsp_right(node) && !TCOD_bsp_traverse_pre_order(TCOD_bsp_right(node),listener,userData)) return false; + return true; +} + +bool TCOD_bsp_traverse_in_order(TCOD_bsp_t *node, TCOD_bsp_callback_t listener, void *userData) { + if ( TCOD_bsp_left(node) && !TCOD_bsp_traverse_in_order(TCOD_bsp_left(node),listener,userData)) return false; + if (!listener(node,userData)) return false; + if ( TCOD_bsp_right(node) && !TCOD_bsp_traverse_in_order(TCOD_bsp_right(node),listener,userData)) return false; + return true; +} + +bool TCOD_bsp_traverse_post_order(TCOD_bsp_t *node, TCOD_bsp_callback_t listener, void *userData) { + if ( TCOD_bsp_left(node) && !TCOD_bsp_traverse_post_order(TCOD_bsp_left(node),listener,userData)) return false; + if ( TCOD_bsp_right(node) && !TCOD_bsp_traverse_post_order(TCOD_bsp_right(node),listener,userData)) return false; + if (!listener(node,userData)) return false; + return true; +} + +bool TCOD_bsp_traverse_level_order(TCOD_bsp_t *node, TCOD_bsp_callback_t listener, void *userData) { + TCOD_list_t stack=TCOD_list_new(); + TCOD_list_push(stack,node); + while ( ! TCOD_list_is_empty(stack) ) { + TCOD_bsp_t *node=(TCOD_bsp_t *)TCOD_list_get(stack,0); + TCOD_list_remove(stack,node); + if ( TCOD_bsp_left(node) ) TCOD_list_push(stack,TCOD_bsp_left(node)); + if ( TCOD_bsp_right(node) ) TCOD_list_push(stack,TCOD_bsp_right(node)); + if (!listener(node,userData)) { + TCOD_list_delete(stack); + return false; + } + } + TCOD_list_delete(stack); + return true; +} + +bool TCOD_bsp_traverse_inverted_level_order(TCOD_bsp_t *node, TCOD_bsp_callback_t listener, void *userData) { + TCOD_list_t stack1=TCOD_list_new(); + TCOD_list_t stack2=TCOD_list_new(); + TCOD_list_push(stack1,node); + while ( ! TCOD_list_is_empty(stack1) ) { + TCOD_bsp_t *node=(TCOD_bsp_t *)TCOD_list_get(stack1,0); + TCOD_list_push(stack2,node); + TCOD_list_remove(stack1,node); + if ( TCOD_bsp_left(node) ) TCOD_list_push(stack1,TCOD_bsp_left(node)); + if ( TCOD_bsp_right(node) ) TCOD_list_push(stack1,TCOD_bsp_right(node)); + } + while ( ! TCOD_list_is_empty(stack2) ) { + TCOD_bsp_t *node=(TCOD_bsp_t *)TCOD_list_pop(stack2); + if (!listener(node,userData)) { + TCOD_list_delete(stack1); + TCOD_list_delete(stack2); + return false; + } + } + TCOD_list_delete(stack1); + TCOD_list_delete(stack2); + return true; +} + +void TCOD_bsp_remove_sons(TCOD_bsp_t *root) { + TCOD_bsp_t *node=(TCOD_bsp_t *)root->tree.sons; + while ( node ) { + TCOD_bsp_t *nextNode=(TCOD_bsp_t *)node->tree.next; + TCOD_bsp_remove_sons(node); + free( node ); + node=nextNode; + } + root->tree.sons=NULL; +} + +void TCOD_bsp_split_once(TCOD_bsp_t *node, bool horizontal, int position) { + node->horizontal = horizontal; + node->position=position; + TCOD_tree_add_son(&node->tree,&TCOD_bsp_new_intern(node,true)->tree); + TCOD_tree_add_son(&node->tree,&TCOD_bsp_new_intern(node,false)->tree); +} + +void TCOD_bsp_split_recursive(TCOD_bsp_t *node, TCOD_random_t randomizer, int nb, + int minHSize, int minVSize, float maxHRatio, float maxVRatio) { + bool horiz; + int position; + if ( nb == 0 || (node->w < 2*minHSize && node->h < 2*minVSize ) ) return; + if (! randomizer ) randomizer=TCOD_random_get_instance(); + /* promote square rooms */ + if ( node->h < 2*minVSize || node->w > node->h * maxHRatio ) horiz = false; + else if ( node->w < 2*minHSize || node->h > node->w * maxVRatio) horiz = true; + else horiz = (TCOD_random_get_int(randomizer,0,1) == 0); + if ( horiz ) { + position = TCOD_random_get_int(randomizer,node->y+minVSize,node->y+node->h-minVSize); + } else { + position = TCOD_random_get_int(randomizer,node->x+minHSize,node->x+node->w-minHSize); + } + TCOD_bsp_split_once(node,horiz,position); + TCOD_bsp_split_recursive(TCOD_bsp_left(node),randomizer,nb-1,minHSize,minVSize,maxHRatio,maxVRatio); + TCOD_bsp_split_recursive(TCOD_bsp_right(node),randomizer,nb-1,minHSize,minVSize,maxHRatio,maxVRatio); +} + +void TCOD_bsp_resize(TCOD_bsp_t *node, int x,int y, int w, int h) { + node->x=x; + node->y=y; + node->w=w; + node->h=h; + if ( TCOD_bsp_left(node) ) { + if ( node->horizontal ) { + TCOD_bsp_resize(TCOD_bsp_left(node),x,y,w,node->position-y); + TCOD_bsp_resize(TCOD_bsp_right(node),x,node->position,w,y+h-node->position); + } else { + TCOD_bsp_resize(TCOD_bsp_left(node),x,y,node->position-x,h); + TCOD_bsp_resize(TCOD_bsp_right(node),node->position,y,x+w-node->position,h); + } + } +} + +bool TCOD_bsp_contains(TCOD_bsp_t *node, int x, int y) { + return (x >= node->x && y >= node->y && x < node->x+node->w && y < node->y+node->h); +} + +TCOD_bsp_t * TCOD_bsp_find_node(TCOD_bsp_t *node, int x, int y) { + if ( ! TCOD_bsp_contains(node,x,y) ) return NULL; + if ( ! TCOD_bsp_is_leaf(node) ) { + TCOD_bsp_t *left,*right; + left=TCOD_bsp_left(node); + if ( TCOD_bsp_contains(left,x,y) ) return TCOD_bsp_find_node(left,x,y); + right=TCOD_bsp_right(node); + if ( TCOD_bsp_contains(right,x,y) ) return TCOD_bsp_find_node(right,x,y); + } + return node; +} + + diff --git a/tcod/tcod_sys/libtcod/src/color.cpp b/tcod/tcod_sys/libtcod/src/color.cpp new file mode 100644 index 00000000..a6cf8ae0 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/color.cpp @@ -0,0 +1,348 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "libtcod_int.h" + +// grey levels +const TCODColor TCODColor::black(TCOD_BLACK); +const TCODColor TCODColor::darkestGrey(TCOD_DARKEST_GREY); +const TCODColor TCODColor::darkerGrey(TCOD_DARKER_GREY); +const TCODColor TCODColor::darkGrey(TCOD_DARK_GREY); +const TCODColor TCODColor::grey(TCOD_GREY); +const TCODColor TCODColor::lightGrey(TCOD_LIGHT_GREY); +const TCODColor TCODColor::lighterGrey(TCOD_LIGHTER_GREY); +const TCODColor TCODColor::lightestGrey(TCOD_LIGHTEST_GREY); +const TCODColor TCODColor::white(TCOD_WHITE); + +//sepia +const TCODColor TCODColor::darkestSepia(TCOD_DARKEST_SEPIA); +const TCODColor TCODColor::darkerSepia(TCOD_DARKER_SEPIA); +const TCODColor TCODColor::darkSepia(TCOD_DARK_SEPIA); +const TCODColor TCODColor::sepia(TCOD_SEPIA); +const TCODColor TCODColor::lightSepia(TCOD_LIGHT_SEPIA); +const TCODColor TCODColor::lighterSepia(TCOD_LIGHTER_SEPIA); +const TCODColor TCODColor::lightestSepia(TCOD_LIGHTEST_SEPIA); + +// standard colors +const TCODColor TCODColor::red(TCOD_RED); +const TCODColor TCODColor::flame(TCOD_FLAME); +const TCODColor TCODColor::orange(TCOD_ORANGE); +const TCODColor TCODColor::amber(TCOD_AMBER); +const TCODColor TCODColor::yellow(TCOD_YELLOW); +const TCODColor TCODColor::lime(TCOD_LIME); +const TCODColor TCODColor::chartreuse(TCOD_CHARTREUSE); +const TCODColor TCODColor::green(TCOD_GREEN); +const TCODColor TCODColor::sea(TCOD_SEA); +const TCODColor TCODColor::turquoise(TCOD_TURQUOISE); +const TCODColor TCODColor::cyan(TCOD_CYAN); +const TCODColor TCODColor::sky(TCOD_SKY); +const TCODColor TCODColor::azure(TCOD_AZURE); +const TCODColor TCODColor::blue(TCOD_BLUE); +const TCODColor TCODColor::han(TCOD_HAN); +const TCODColor TCODColor::violet(TCOD_VIOLET); +const TCODColor TCODColor::purple(TCOD_PURPLE); +const TCODColor TCODColor::fuchsia(TCOD_FUCHSIA); +const TCODColor TCODColor::magenta(TCOD_MAGENTA); +const TCODColor TCODColor::pink(TCOD_PINK); +const TCODColor TCODColor::crimson(TCOD_CRIMSON); + +// dark colors +const TCODColor TCODColor::darkRed(TCOD_DARK_RED); +const TCODColor TCODColor::darkFlame(TCOD_DARK_FLAME); +const TCODColor TCODColor::darkOrange(TCOD_DARK_ORANGE); +const TCODColor TCODColor::darkAmber(TCOD_DARK_AMBER); +const TCODColor TCODColor::darkYellow(TCOD_DARK_YELLOW); +const TCODColor TCODColor::darkLime(TCOD_DARK_LIME); +const TCODColor TCODColor::darkChartreuse(TCOD_DARK_CHARTREUSE); +const TCODColor TCODColor::darkGreen(TCOD_DARK_GREEN); +const TCODColor TCODColor::darkSea(TCOD_DARK_SEA); +const TCODColor TCODColor::darkTurquoise(TCOD_DARK_TURQUOISE); +const TCODColor TCODColor::darkCyan(TCOD_DARK_CYAN); +const TCODColor TCODColor::darkSky(TCOD_DARK_SKY); +const TCODColor TCODColor::darkAzure(TCOD_DARK_AZURE); +const TCODColor TCODColor::darkBlue(TCOD_DARK_BLUE); +const TCODColor TCODColor::darkHan(TCOD_DARK_HAN); +const TCODColor TCODColor::darkViolet(TCOD_DARK_VIOLET); +const TCODColor TCODColor::darkPurple(TCOD_DARK_PURPLE); +const TCODColor TCODColor::darkFuchsia(TCOD_DARK_FUCHSIA); +const TCODColor TCODColor::darkMagenta(TCOD_DARK_MAGENTA); +const TCODColor TCODColor::darkPink(TCOD_DARK_PINK); +const TCODColor TCODColor::darkCrimson(TCOD_DARK_CRIMSON); + +// darker colors +const TCODColor TCODColor::darkerRed(TCOD_DARKER_RED); +const TCODColor TCODColor::darkerFlame(TCOD_DARKER_FLAME); +const TCODColor TCODColor::darkerOrange(TCOD_DARKER_ORANGE); +const TCODColor TCODColor::darkerAmber(TCOD_DARKER_AMBER); +const TCODColor TCODColor::darkerYellow(TCOD_DARKER_YELLOW); +const TCODColor TCODColor::darkerLime(TCOD_DARKER_LIME); +const TCODColor TCODColor::darkerChartreuse(TCOD_DARKER_CHARTREUSE); +const TCODColor TCODColor::darkerGreen(TCOD_DARKER_GREEN); +const TCODColor TCODColor::darkerSea(TCOD_DARKER_SEA); +const TCODColor TCODColor::darkerTurquoise(TCOD_DARKER_TURQUOISE); +const TCODColor TCODColor::darkerCyan(TCOD_DARKER_CYAN); +const TCODColor TCODColor::darkerSky(TCOD_DARKER_SKY); +const TCODColor TCODColor::darkerAzure(TCOD_DARKER_AZURE); +const TCODColor TCODColor::darkerBlue(TCOD_DARKER_BLUE); +const TCODColor TCODColor::darkerHan(TCOD_DARKER_HAN); +const TCODColor TCODColor::darkerViolet(TCOD_DARKER_VIOLET); +const TCODColor TCODColor::darkerPurple(TCOD_DARKER_PURPLE); +const TCODColor TCODColor::darkerFuchsia(TCOD_DARKER_FUCHSIA); +const TCODColor TCODColor::darkerMagenta(TCOD_DARKER_MAGENTA); +const TCODColor TCODColor::darkerPink(TCOD_DARKER_PINK); +const TCODColor TCODColor::darkerCrimson(TCOD_DARKER_CRIMSON); + +// darkest colors +const TCODColor TCODColor::darkestRed(TCOD_DARKEST_RED); +const TCODColor TCODColor::darkestFlame(TCOD_DARKEST_FLAME); +const TCODColor TCODColor::darkestOrange(TCOD_DARKEST_ORANGE); +const TCODColor TCODColor::darkestAmber(TCOD_DARKEST_AMBER); +const TCODColor TCODColor::darkestYellow(TCOD_DARKEST_YELLOW); +const TCODColor TCODColor::darkestLime(TCOD_DARKEST_LIME); +const TCODColor TCODColor::darkestChartreuse(TCOD_DARKEST_CHARTREUSE); +const TCODColor TCODColor::darkestGreen(TCOD_DARKEST_GREEN); +const TCODColor TCODColor::darkestSea(TCOD_DARKEST_SEA); +const TCODColor TCODColor::darkestTurquoise(TCOD_DARKEST_TURQUOISE); +const TCODColor TCODColor::darkestCyan(TCOD_DARKEST_CYAN); +const TCODColor TCODColor::darkestSky(TCOD_DARKEST_SKY); +const TCODColor TCODColor::darkestAzure(TCOD_DARKEST_AZURE); +const TCODColor TCODColor::darkestBlue(TCOD_DARKEST_BLUE); +const TCODColor TCODColor::darkestHan(TCOD_DARKEST_HAN); +const TCODColor TCODColor::darkestViolet(TCOD_DARKEST_VIOLET); +const TCODColor TCODColor::darkestPurple(TCOD_DARKEST_PURPLE); +const TCODColor TCODColor::darkestFuchsia(TCOD_DARKEST_FUCHSIA); +const TCODColor TCODColor::darkestMagenta(TCOD_DARKEST_MAGENTA); +const TCODColor TCODColor::darkestPink(TCOD_DARKEST_PINK); +const TCODColor TCODColor::darkestCrimson(TCOD_DARKEST_CRIMSON); + +// light colors +const TCODColor TCODColor::lightRed(TCOD_LIGHT_RED); +const TCODColor TCODColor::lightFlame(TCOD_LIGHT_FLAME); +const TCODColor TCODColor::lightOrange(TCOD_LIGHT_ORANGE); +const TCODColor TCODColor::lightAmber(TCOD_LIGHT_AMBER); +const TCODColor TCODColor::lightYellow(TCOD_LIGHT_YELLOW); +const TCODColor TCODColor::lightLime(TCOD_LIGHT_LIME); +const TCODColor TCODColor::lightChartreuse(TCOD_LIGHT_CHARTREUSE); +const TCODColor TCODColor::lightGreen(TCOD_LIGHT_GREEN); +const TCODColor TCODColor::lightSea(TCOD_LIGHT_SEA); +const TCODColor TCODColor::lightTurquoise(TCOD_LIGHT_TURQUOISE); +const TCODColor TCODColor::lightCyan(TCOD_LIGHT_CYAN); +const TCODColor TCODColor::lightSky(TCOD_LIGHT_SKY); +const TCODColor TCODColor::lightAzure(TCOD_LIGHT_AZURE); +const TCODColor TCODColor::lightBlue(TCOD_LIGHT_BLUE); +const TCODColor TCODColor::lightHan(TCOD_LIGHT_HAN); +const TCODColor TCODColor::lightViolet(TCOD_LIGHT_VIOLET); +const TCODColor TCODColor::lightPurple(TCOD_LIGHT_PURPLE); +const TCODColor TCODColor::lightFuchsia(TCOD_LIGHT_FUCHSIA); +const TCODColor TCODColor::lightMagenta(TCOD_LIGHT_MAGENTA); +const TCODColor TCODColor::lightPink(TCOD_LIGHT_PINK); +const TCODColor TCODColor::lightCrimson(TCOD_LIGHT_CRIMSON); + +// lighter colors +const TCODColor TCODColor::lighterRed(TCOD_LIGHTER_RED); +const TCODColor TCODColor::lighterFlame(TCOD_LIGHTER_FLAME); +const TCODColor TCODColor::lighterOrange(TCOD_LIGHTER_ORANGE); +const TCODColor TCODColor::lighterAmber(TCOD_LIGHTER_AMBER); +const TCODColor TCODColor::lighterYellow(TCOD_LIGHTER_YELLOW); +const TCODColor TCODColor::lighterLime(TCOD_LIGHTER_LIME); +const TCODColor TCODColor::lighterChartreuse(TCOD_LIGHTER_CHARTREUSE); +const TCODColor TCODColor::lighterGreen(TCOD_LIGHTER_GREEN); +const TCODColor TCODColor::lighterSea(TCOD_LIGHTER_SEA); +const TCODColor TCODColor::lighterTurquoise(TCOD_LIGHTER_TURQUOISE); +const TCODColor TCODColor::lighterCyan(TCOD_LIGHTER_CYAN); +const TCODColor TCODColor::lighterSky(TCOD_LIGHTER_SKY); +const TCODColor TCODColor::lighterAzure(TCOD_LIGHTER_AZURE); +const TCODColor TCODColor::lighterBlue(TCOD_LIGHTER_BLUE); +const TCODColor TCODColor::lighterHan(TCOD_LIGHTER_HAN); +const TCODColor TCODColor::lighterViolet(TCOD_LIGHTER_VIOLET); +const TCODColor TCODColor::lighterPurple(TCOD_LIGHTER_PURPLE); +const TCODColor TCODColor::lighterFuchsia(TCOD_LIGHTER_FUCHSIA); +const TCODColor TCODColor::lighterMagenta(TCOD_LIGHTER_MAGENTA); +const TCODColor TCODColor::lighterPink(TCOD_LIGHTER_PINK); +const TCODColor TCODColor::lighterCrimson(TCOD_LIGHTER_CRIMSON); + +// lightest colors +const TCODColor TCODColor::lightestRed(TCOD_LIGHTEST_RED); +const TCODColor TCODColor::lightestFlame(TCOD_LIGHTEST_FLAME); +const TCODColor TCODColor::lightestOrange(TCOD_LIGHTEST_ORANGE); +const TCODColor TCODColor::lightestAmber(TCOD_LIGHTEST_AMBER); +const TCODColor TCODColor::lightestYellow(TCOD_LIGHTEST_YELLOW); +const TCODColor TCODColor::lightestLime(TCOD_LIGHTEST_LIME); +const TCODColor TCODColor::lightestChartreuse(TCOD_LIGHTEST_CHARTREUSE); +const TCODColor TCODColor::lightestGreen(TCOD_LIGHTEST_GREEN); +const TCODColor TCODColor::lightestSea(TCOD_LIGHTEST_SEA); +const TCODColor TCODColor::lightestTurquoise(TCOD_LIGHTEST_TURQUOISE); +const TCODColor TCODColor::lightestCyan(TCOD_LIGHTEST_CYAN); +const TCODColor TCODColor::lightestSky(TCOD_LIGHTEST_SKY); +const TCODColor TCODColor::lightestAzure(TCOD_LIGHTEST_AZURE); +const TCODColor TCODColor::lightestBlue(TCOD_LIGHTEST_BLUE); +const TCODColor TCODColor::lightestHan(TCOD_LIGHTEST_HAN); +const TCODColor TCODColor::lightestViolet(TCOD_LIGHTEST_VIOLET); +const TCODColor TCODColor::lightestPurple(TCOD_LIGHTEST_PURPLE); +const TCODColor TCODColor::lightestFuchsia(TCOD_LIGHTEST_FUCHSIA); +const TCODColor TCODColor::lightestMagenta(TCOD_LIGHTEST_MAGENTA); +const TCODColor TCODColor::lightestPink(TCOD_LIGHTEST_PINK); +const TCODColor TCODColor::lightestCrimson(TCOD_LIGHTEST_CRIMSON); + +// desaturated colors +const TCODColor TCODColor::desaturatedRed(TCOD_DESATURATED_RED); +const TCODColor TCODColor::desaturatedFlame(TCOD_DESATURATED_FLAME); +const TCODColor TCODColor::desaturatedOrange(TCOD_DESATURATED_ORANGE); +const TCODColor TCODColor::desaturatedAmber(TCOD_DESATURATED_AMBER); +const TCODColor TCODColor::desaturatedYellow(TCOD_DESATURATED_YELLOW); +const TCODColor TCODColor::desaturatedLime(TCOD_DESATURATED_LIME); +const TCODColor TCODColor::desaturatedChartreuse(TCOD_DESATURATED_CHARTREUSE); +const TCODColor TCODColor::desaturatedGreen(TCOD_DESATURATED_GREEN); +const TCODColor TCODColor::desaturatedSea(TCOD_DESATURATED_SEA); +const TCODColor TCODColor::desaturatedTurquoise(TCOD_DESATURATED_TURQUOISE); +const TCODColor TCODColor::desaturatedCyan(TCOD_DESATURATED_CYAN); +const TCODColor TCODColor::desaturatedSky(TCOD_DESATURATED_SKY); +const TCODColor TCODColor::desaturatedAzure(TCOD_DESATURATED_AZURE); +const TCODColor TCODColor::desaturatedBlue(TCOD_DESATURATED_BLUE); +const TCODColor TCODColor::desaturatedHan(TCOD_DESATURATED_HAN); +const TCODColor TCODColor::desaturatedViolet(TCOD_DESATURATED_VIOLET); +const TCODColor TCODColor::desaturatedPurple(TCOD_DESATURATED_PURPLE); +const TCODColor TCODColor::desaturatedFuchsia(TCOD_DESATURATED_FUCHSIA); +const TCODColor TCODColor::desaturatedMagenta(TCOD_DESATURATED_MAGENTA); +const TCODColor TCODColor::desaturatedPink(TCOD_DESATURATED_PINK); +const TCODColor TCODColor::desaturatedCrimson(TCOD_DESATURATED_CRIMSON); + +//special +const TCODColor TCODColor::brass(TCOD_BRASS); +const TCODColor TCODColor::copper(TCOD_COPPER); +const TCODColor TCODColor::gold(TCOD_GOLD); +const TCODColor TCODColor::silver(TCOD_SILVER); + +//miscellaneous +const TCODColor TCODColor::celadon(TCOD_CELADON); +const TCODColor TCODColor::peach(TCOD_PEACH); + +#ifndef TCOD_HAIKU +// color array +const TCODColor TCODColor::colors[TCOD_COLOR_NB][TCOD_COLOR_LEVELS] = { + {TCODColor(TCOD_DESATURATED_RED),TCODColor(TCOD_LIGHTEST_RED),TCODColor(TCOD_LIGHTER_RED),TCODColor(TCOD_LIGHT_RED),TCODColor(TCOD_RED),TCODColor(TCOD_DARK_RED),TCODColor(TCOD_DARKER_RED),TCODColor(TCOD_DARKEST_RED)}, + {TCODColor(TCOD_DESATURATED_FLAME),TCODColor(TCOD_LIGHTEST_FLAME),TCODColor(TCOD_LIGHTER_FLAME),TCODColor(TCOD_LIGHT_FLAME),TCODColor(TCOD_FLAME),TCODColor(TCOD_DARK_FLAME),TCODColor(TCOD_DARKER_FLAME),TCODColor(TCOD_DARKEST_FLAME)}, + {TCODColor(TCOD_DESATURATED_ORANGE),TCODColor(TCOD_LIGHTEST_ORANGE),TCODColor(TCOD_LIGHTER_ORANGE),TCODColor(TCOD_LIGHT_ORANGE),TCODColor(TCOD_ORANGE),TCODColor(TCOD_DARK_ORANGE),TCODColor(TCOD_DARKER_ORANGE),TCODColor(TCOD_DARKEST_ORANGE)}, + {TCODColor(TCOD_DESATURATED_AMBER),TCODColor(TCOD_LIGHTEST_AMBER),TCODColor(TCOD_LIGHTER_AMBER),TCODColor(TCOD_LIGHT_AMBER),TCODColor(TCOD_AMBER),TCODColor(TCOD_DARK_AMBER),TCODColor(TCOD_DARKER_AMBER),TCODColor(TCOD_DARKEST_AMBER)}, + {TCODColor(TCOD_DESATURATED_YELLOW),TCODColor(TCOD_LIGHTEST_YELLOW),TCODColor(TCOD_LIGHTER_YELLOW),TCODColor(TCOD_LIGHT_YELLOW),TCODColor(TCOD_YELLOW),TCODColor(TCOD_DARK_YELLOW),TCODColor(TCOD_DARKER_YELLOW),TCODColor(TCOD_DARKEST_YELLOW)}, + {TCODColor(TCOD_DESATURATED_LIME),TCODColor(TCOD_LIGHTEST_LIME),TCODColor(TCOD_LIGHTER_LIME),TCODColor(TCOD_LIGHT_LIME),TCODColor(TCOD_LIME),TCODColor(TCOD_DARK_LIME),TCODColor(TCOD_DARKER_LIME),TCODColor(TCOD_DARKEST_LIME)}, + {TCODColor(TCOD_DESATURATED_CHARTREUSE),TCODColor(TCOD_LIGHTEST_CHARTREUSE),TCODColor(TCOD_LIGHTER_CHARTREUSE),TCODColor(TCOD_LIGHT_CHARTREUSE),TCODColor(TCOD_CHARTREUSE),TCODColor(TCOD_DARK_CHARTREUSE),TCODColor(TCOD_DARKER_CHARTREUSE),TCODColor(TCOD_DARKEST_CHARTREUSE)}, + {TCODColor(TCOD_DESATURATED_GREEN),TCODColor(TCOD_LIGHTEST_GREEN),TCODColor(TCOD_LIGHTER_GREEN),TCODColor(TCOD_LIGHT_GREEN),TCODColor(TCOD_GREEN),TCODColor(TCOD_DARK_GREEN),TCODColor(TCOD_DARKER_GREEN),TCODColor(TCOD_DARKEST_GREEN)}, + {TCODColor(TCOD_DESATURATED_SEA),TCODColor(TCOD_LIGHTEST_SEA),TCODColor(TCOD_LIGHTER_SEA),TCODColor(TCOD_LIGHT_SEA),TCODColor(TCOD_SEA),TCODColor(TCOD_DARK_SEA),TCODColor(TCOD_DARKER_SEA),TCODColor(TCOD_DARKEST_SEA)}, + {TCODColor(TCOD_DESATURATED_TURQUOISE),TCODColor(TCOD_LIGHTEST_TURQUOISE),TCODColor(TCOD_LIGHTER_TURQUOISE),TCODColor(TCOD_LIGHT_TURQUOISE),TCODColor(TCOD_TURQUOISE),TCODColor(TCOD_DARK_TURQUOISE),TCODColor(TCOD_DARKER_TURQUOISE),TCODColor(TCOD_DARKEST_TURQUOISE)}, + {TCODColor(TCOD_DESATURATED_CYAN),TCODColor(TCOD_LIGHTEST_CYAN),TCODColor(TCOD_LIGHTER_CYAN),TCODColor(TCOD_LIGHT_CYAN),TCODColor(TCOD_CYAN),TCODColor(TCOD_DARK_CYAN),TCODColor(TCOD_DARKER_CYAN),TCODColor(TCOD_DARKEST_CYAN)}, + {TCODColor(TCOD_DESATURATED_SKY),TCODColor(TCOD_LIGHTEST_SKY),TCODColor(TCOD_LIGHTER_SKY),TCODColor(TCOD_LIGHT_SKY),TCODColor(TCOD_SKY),TCODColor(TCOD_DARK_SKY),TCODColor(TCOD_DARKER_SKY),TCODColor(TCOD_DARKEST_SKY)}, + {TCODColor(TCOD_DESATURATED_AZURE),TCODColor(TCOD_LIGHTEST_AZURE),TCODColor(TCOD_LIGHTER_AZURE),TCODColor(TCOD_LIGHT_AZURE),TCODColor(TCOD_AZURE),TCODColor(TCOD_DARK_AZURE),TCODColor(TCOD_DARKER_AZURE),TCODColor(TCOD_DARKEST_AZURE)}, + {TCODColor(TCOD_DESATURATED_BLUE),TCODColor(TCOD_LIGHTEST_BLUE),TCODColor(TCOD_LIGHTER_BLUE),TCODColor(TCOD_LIGHT_BLUE),TCODColor(TCOD_BLUE),TCODColor(TCOD_DARK_BLUE),TCODColor(TCOD_DARKER_BLUE),TCODColor(TCOD_DARKEST_BLUE)}, + {TCODColor(TCOD_DESATURATED_HAN),TCODColor(TCOD_LIGHTEST_HAN),TCODColor(TCOD_LIGHTER_HAN),TCODColor(TCOD_LIGHT_HAN),TCODColor(TCOD_HAN),TCODColor(TCOD_DARK_HAN),TCODColor(TCOD_DARKER_HAN),TCODColor(TCOD_DARKEST_HAN)}, + {TCODColor(TCOD_DESATURATED_VIOLET),TCODColor(TCOD_LIGHTEST_VIOLET),TCODColor(TCOD_LIGHTER_VIOLET),TCODColor(TCOD_LIGHT_VIOLET),TCODColor(TCOD_VIOLET),TCODColor(TCOD_DARK_VIOLET),TCODColor(TCOD_DARKER_VIOLET),TCODColor(TCOD_DARKEST_VIOLET)}, + {TCODColor(TCOD_DESATURATED_PURPLE),TCODColor(TCOD_LIGHTEST_PURPLE),TCODColor(TCOD_LIGHTER_PURPLE),TCODColor(TCOD_LIGHT_PURPLE),TCODColor(TCOD_PURPLE),TCODColor(TCOD_DARK_PURPLE),TCODColor(TCOD_DARKER_PURPLE),TCODColor(TCOD_DARKEST_PURPLE)}, + {TCODColor(TCOD_DESATURATED_FUCHSIA),TCODColor(TCOD_LIGHTEST_FUCHSIA),TCODColor(TCOD_LIGHTER_FUCHSIA),TCODColor(TCOD_LIGHT_FUCHSIA),TCODColor(TCOD_FUCHSIA),TCODColor(TCOD_DARK_FUCHSIA),TCODColor(TCOD_DARKER_FUCHSIA),TCODColor(TCOD_DARKEST_FUCHSIA)}, + {TCODColor(TCOD_DESATURATED_MAGENTA),TCODColor(TCOD_LIGHTEST_MAGENTA),TCODColor(TCOD_LIGHTER_MAGENTA),TCODColor(TCOD_LIGHT_MAGENTA),TCODColor(TCOD_MAGENTA),TCODColor(TCOD_DARK_MAGENTA),TCODColor(TCOD_DARKER_MAGENTA),TCODColor(TCOD_DARKEST_MAGENTA)}, + {TCODColor(TCOD_DESATURATED_PINK),TCODColor(TCOD_LIGHTEST_PINK),TCODColor(TCOD_LIGHTER_PINK),TCODColor(TCOD_LIGHT_PINK),TCODColor(TCOD_PINK),TCODColor(TCOD_DARK_PINK),TCODColor(TCOD_DARKER_PINK),TCODColor(TCOD_DARKEST_PINK)}, + {TCODColor(TCOD_DESATURATED_CRIMSON),TCODColor(TCOD_LIGHTEST_CRIMSON),TCODColor(TCOD_LIGHTER_CRIMSON),TCODColor(TCOD_LIGHT_CRIMSON),TCODColor(TCOD_CRIMSON),TCODColor(TCOD_DARK_CRIMSON),TCODColor(TCOD_DARKER_CRIMSON),TCODColor(TCOD_DARKEST_CRIMSON)} +}; +#endif + +TCODColor::TCODColor(float h, float s, float v) { + //setHSV(h,s,v); + TCOD_color_t c = TCOD_color_HSV(h,s,v); + r = c.r; g = c.g; b = c.b; +} + +void TCODColor::setHSV(float h, float s, float v) { + TCOD_color_t c; + TCOD_color_set_HSV(&c,h,s,v); + r = c.r; g = c.g; b = c.b; +} + +void TCODColor::setHue (float h) { + TCOD_color_t c = { r, g, b }; + TCOD_color_set_hue (&c, h); + r = c.r; g = c.g; b = c.b; +} + +void TCODColor::setSaturation (float s) { + TCOD_color_t c = { r, g, b }; + TCOD_color_set_saturation (&c, s); + r = c.r; g = c.g; b = c.b; +} + +void TCODColor::setValue (float v) { + TCOD_color_t c = { r, g, b }; + TCOD_color_set_value (&c, v); + r = c.r; g = c.g; b = c.b; +} + +void TCODColor::getHSV(float *h, float *s, float *v) const { + TCOD_color_t c={r,g,b}; + TCOD_color_get_HSV(c,h,s,v); +} + +float TCODColor::getHue () { + TCOD_color_t c = { r, g, b }; + return TCOD_color_get_hue(c); +} + +float TCODColor::getSaturation () { + TCOD_color_t c = { r, g, b }; + return TCOD_color_get_saturation(c); +} + +float TCODColor::getValue () { + TCOD_color_t c = { r, g, b }; + return TCOD_color_get_value(c); +} + +void TCODColor::shiftHue (float hshift) { + TCOD_color_t c = { r, g, b }; + TCOD_color_shift_hue (&c, hshift); + r = c.r; g = c.g; b = c.b; +} + +void TCODColor::scaleHSV (float sscale, float vscale) { + TCOD_color_t c = {r,g,b}; + TCOD_color_scale_HSV(&c,sscale,vscale); + r = c.r; g = c.g; b = c.b; +} + +// non member operators +TCODColor operator *(float value, const TCODColor &c) { + return c*value; +} + +void TCODColor::genMap(TCODColor *map, int nbKey, TCODColor const *keyColor, int const *keyIndex) { + for (int segment=0; segment < nbKey-1; segment++) { + int idxStart=keyIndex[segment]; + int idxEnd=keyIndex[segment+1]; + int idx; + for ( idx=idxStart;idx <= idxEnd; idx++) { + map[idx]=TCODColor::lerp(keyColor[segment],keyColor[segment+1],(float)(idx-idxStart)/(idxEnd-idxStart)); + } + } +} + diff --git a/tcod/tcod_sys/libtcod/src/color_c.c b/tcod/tcod_sys/libtcod/src/color_c.c new file mode 100644 index 00000000..8e4983b9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/color_c.c @@ -0,0 +1,560 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.h" +#include "libtcod_int.h" + +/* grey levels */ +const TCOD_color_t TCOD_black={TCOD_BLACK}; +const TCOD_color_t TCOD_darkest_grey={TCOD_DARKEST_GREY}; +const TCOD_color_t TCOD_darker_grey={TCOD_DARKER_GREY}; +const TCOD_color_t TCOD_dark_grey={TCOD_DARK_GREY}; +const TCOD_color_t TCOD_grey={TCOD_GREY}; +const TCOD_color_t TCOD_light_grey={TCOD_LIGHT_GREY}; +const TCOD_color_t TCOD_lighter_grey={TCOD_LIGHTER_GREY}; +const TCOD_color_t TCOD_lightest_grey={TCOD_LIGHTEST_GREY}; +const TCOD_color_t TCOD_darkest_gray={TCOD_DARKEST_GREY}; +const TCOD_color_t TCOD_darker_gray={TCOD_DARKER_GREY}; +const TCOD_color_t TCOD_dark_gray={TCOD_DARK_GREY}; +const TCOD_color_t TCOD_gray={TCOD_GREY}; +const TCOD_color_t TCOD_light_gray={TCOD_LIGHT_GREY}; +const TCOD_color_t TCOD_lighter_gray={TCOD_LIGHTER_GREY}; +const TCOD_color_t TCOD_lightest_gray={TCOD_LIGHTEST_GREY}; +const TCOD_color_t TCOD_white={TCOD_WHITE}; + +/* sepia */ +const TCOD_color_t TCOD_darkest_sepia={TCOD_DARKEST_SEPIA}; +const TCOD_color_t TCOD_darker_sepia={TCOD_DARKER_SEPIA}; +const TCOD_color_t TCOD_dark_sepia={TCOD_DARK_SEPIA}; +const TCOD_color_t TCOD_sepia={TCOD_SEPIA}; +const TCOD_color_t TCOD_light_sepia={TCOD_LIGHT_SEPIA}; +const TCOD_color_t TCOD_lighter_sepia={TCOD_LIGHTER_SEPIA}; +const TCOD_color_t TCOD_lightest_sepia={TCOD_LIGHTEST_SEPIA}; + +/* standard colors */ +const TCOD_color_t TCOD_red = {TCOD_RED}; +const TCOD_color_t TCOD_flame = {TCOD_FLAME}; +const TCOD_color_t TCOD_orange = {TCOD_ORANGE}; +const TCOD_color_t TCOD_amber = {TCOD_AMBER}; +const TCOD_color_t TCOD_yellow = {TCOD_YELLOW}; +const TCOD_color_t TCOD_lime = {TCOD_LIME}; +const TCOD_color_t TCOD_chartreuse = {TCOD_CHARTREUSE}; +const TCOD_color_t TCOD_green = {TCOD_GREEN}; +const TCOD_color_t TCOD_sea = {TCOD_SEA}; +const TCOD_color_t TCOD_turquoise = {TCOD_TURQUOISE}; +const TCOD_color_t TCOD_cyan = {TCOD_CYAN}; +const TCOD_color_t TCOD_sky = {TCOD_SKY}; +const TCOD_color_t TCOD_azure = {TCOD_AZURE}; +const TCOD_color_t TCOD_blue = {TCOD_BLUE}; +const TCOD_color_t TCOD_han = {TCOD_HAN}; +const TCOD_color_t TCOD_violet = {TCOD_VIOLET}; +const TCOD_color_t TCOD_purple = {TCOD_PURPLE}; +const TCOD_color_t TCOD_fuchsia = {TCOD_FUCHSIA}; +const TCOD_color_t TCOD_magenta = {TCOD_MAGENTA}; +const TCOD_color_t TCOD_pink = {TCOD_PINK}; +const TCOD_color_t TCOD_crimson = {TCOD_CRIMSON}; + +/* dark colors */ +const TCOD_color_t TCOD_dark_red = {TCOD_DARK_RED}; +const TCOD_color_t TCOD_dark_flame = {TCOD_DARK_FLAME}; +const TCOD_color_t TCOD_dark_orange = {TCOD_DARK_ORANGE}; +const TCOD_color_t TCOD_dark_amber = {TCOD_DARK_AMBER}; +const TCOD_color_t TCOD_dark_yellow = {TCOD_DARK_YELLOW}; +const TCOD_color_t TCOD_dark_lime = {TCOD_DARK_LIME}; +const TCOD_color_t TCOD_dark_chartreuse = {TCOD_DARK_CHARTREUSE}; +const TCOD_color_t TCOD_dark_green = {TCOD_DARK_GREEN}; +const TCOD_color_t TCOD_dark_sea = {TCOD_DARK_SEA}; +const TCOD_color_t TCOD_dark_turquoise = {TCOD_DARK_TURQUOISE}; +const TCOD_color_t TCOD_dark_cyan = {TCOD_DARK_CYAN}; +const TCOD_color_t TCOD_dark_sky = {TCOD_DARK_SKY}; +const TCOD_color_t TCOD_dark_azure = {TCOD_DARK_AZURE}; +const TCOD_color_t TCOD_dark_blue = {TCOD_DARK_BLUE}; +const TCOD_color_t TCOD_dark_han = {TCOD_DARK_HAN}; +const TCOD_color_t TCOD_dark_violet = {TCOD_DARK_VIOLET}; +const TCOD_color_t TCOD_dark_purple = {TCOD_DARK_PURPLE}; +const TCOD_color_t TCOD_dark_fuchsia = {TCOD_DARK_FUCHSIA}; +const TCOD_color_t TCOD_dark_magenta = {TCOD_DARK_MAGENTA}; +const TCOD_color_t TCOD_dark_pink = {TCOD_DARK_PINK}; +const TCOD_color_t TCOD_dark_crimson = {TCOD_DARK_CRIMSON}; + +/* darker colors */ +const TCOD_color_t TCOD_darker_red = {TCOD_DARKER_RED}; +const TCOD_color_t TCOD_darker_flame = {TCOD_DARKER_FLAME}; +const TCOD_color_t TCOD_darker_orange = {TCOD_DARKER_ORANGE}; +const TCOD_color_t TCOD_darker_amber = {TCOD_DARKER_AMBER}; +const TCOD_color_t TCOD_darker_yellow = {TCOD_DARKER_YELLOW}; +const TCOD_color_t TCOD_darker_lime = {TCOD_DARKER_LIME}; +const TCOD_color_t TCOD_darker_chartreuse = {TCOD_DARKER_CHARTREUSE}; +const TCOD_color_t TCOD_darker_green = {TCOD_DARKER_GREEN}; +const TCOD_color_t TCOD_darker_sea = {TCOD_DARKER_SEA}; +const TCOD_color_t TCOD_darker_turquoise = {TCOD_DARKER_TURQUOISE}; +const TCOD_color_t TCOD_darker_cyan = {TCOD_DARKER_CYAN}; +const TCOD_color_t TCOD_darker_sky = {TCOD_DARKER_SKY}; +const TCOD_color_t TCOD_darker_azure = {TCOD_DARKER_AZURE}; +const TCOD_color_t TCOD_darker_blue = {TCOD_DARKER_BLUE}; +const TCOD_color_t TCOD_darker_han = {TCOD_DARKER_HAN}; +const TCOD_color_t TCOD_darker_violet = {TCOD_DARKER_VIOLET}; +const TCOD_color_t TCOD_darker_purple = {TCOD_DARKER_PURPLE}; +const TCOD_color_t TCOD_darker_fuchsia = {TCOD_DARKER_FUCHSIA}; +const TCOD_color_t TCOD_darker_magenta = {TCOD_DARKER_MAGENTA}; +const TCOD_color_t TCOD_darker_pink = {TCOD_DARKER_PINK}; +const TCOD_color_t TCOD_darker_crimson = {TCOD_DARKER_CRIMSON}; + +/* darkest colors */ +const TCOD_color_t TCOD_darkest_red = {TCOD_DARKEST_RED}; +const TCOD_color_t TCOD_darkest_flame = {TCOD_DARKEST_FLAME}; +const TCOD_color_t TCOD_darkest_orange = {TCOD_DARKEST_ORANGE}; +const TCOD_color_t TCOD_darkest_amber = {TCOD_DARKEST_AMBER}; +const TCOD_color_t TCOD_darkest_yellow = {TCOD_DARKEST_YELLOW}; +const TCOD_color_t TCOD_darkest_lime = {TCOD_DARKEST_LIME}; +const TCOD_color_t TCOD_darkest_chartreuse = {TCOD_DARKEST_CHARTREUSE}; +const TCOD_color_t TCOD_darkest_green = {TCOD_DARKEST_GREEN}; +const TCOD_color_t TCOD_darkest_sea = {TCOD_DARKEST_SEA}; +const TCOD_color_t TCOD_darkest_turquoise = {TCOD_DARKEST_TURQUOISE}; +const TCOD_color_t TCOD_darkest_cyan = {TCOD_DARKEST_CYAN}; +const TCOD_color_t TCOD_darkest_sky = {TCOD_DARKEST_SKY}; +const TCOD_color_t TCOD_darkest_azure = {TCOD_DARKEST_AZURE}; +const TCOD_color_t TCOD_darkest_blue = {TCOD_DARKEST_BLUE}; +const TCOD_color_t TCOD_darkest_han = {TCOD_DARKEST_HAN}; +const TCOD_color_t TCOD_darkest_violet = {TCOD_DARKEST_VIOLET}; +const TCOD_color_t TCOD_darkest_purple = {TCOD_DARKEST_PURPLE}; +const TCOD_color_t TCOD_darkest_fuchsia = {TCOD_DARKEST_FUCHSIA}; +const TCOD_color_t TCOD_darkest_magenta = {TCOD_DARKEST_MAGENTA}; +const TCOD_color_t TCOD_darkest_pink = {TCOD_DARKEST_PINK}; +const TCOD_color_t TCOD_darkest_crimson = {TCOD_DARKEST_CRIMSON}; + +/* light colors */ +const TCOD_color_t TCOD_light_red = {TCOD_LIGHT_RED}; +const TCOD_color_t TCOD_light_flame = {TCOD_LIGHT_FLAME}; +const TCOD_color_t TCOD_light_orange = {TCOD_LIGHT_ORANGE}; +const TCOD_color_t TCOD_light_amber = {TCOD_LIGHT_AMBER}; +const TCOD_color_t TCOD_light_yellow = {TCOD_LIGHT_YELLOW}; +const TCOD_color_t TCOD_light_lime = {TCOD_LIGHT_LIME}; +const TCOD_color_t TCOD_light_chartreuse = {TCOD_LIGHT_CHARTREUSE}; +const TCOD_color_t TCOD_light_green = {TCOD_LIGHT_GREEN}; +const TCOD_color_t TCOD_light_sea = {TCOD_LIGHT_SEA}; +const TCOD_color_t TCOD_light_turquoise = {TCOD_LIGHT_TURQUOISE}; +const TCOD_color_t TCOD_light_cyan = {TCOD_LIGHT_CYAN}; +const TCOD_color_t TCOD_light_sky = {TCOD_LIGHT_SKY}; +const TCOD_color_t TCOD_light_azure = {TCOD_LIGHT_AZURE}; +const TCOD_color_t TCOD_light_blue = {TCOD_LIGHT_BLUE}; +const TCOD_color_t TCOD_light_han = {TCOD_LIGHT_HAN}; +const TCOD_color_t TCOD_light_violet = {TCOD_LIGHT_VIOLET}; +const TCOD_color_t TCOD_light_purple = {TCOD_LIGHT_PURPLE}; +const TCOD_color_t TCOD_light_fuchsia = {TCOD_LIGHT_FUCHSIA}; +const TCOD_color_t TCOD_light_magenta = {TCOD_LIGHT_MAGENTA}; +const TCOD_color_t TCOD_light_pink = {TCOD_LIGHT_PINK}; +const TCOD_color_t TCOD_light_crimson = {TCOD_LIGHT_CRIMSON}; + +/*lighter colors */ +const TCOD_color_t TCOD_lighter_red = {TCOD_LIGHTER_RED}; +const TCOD_color_t TCOD_lighter_flame = {TCOD_LIGHTER_FLAME}; +const TCOD_color_t TCOD_lighter_orange = {TCOD_LIGHTER_ORANGE}; +const TCOD_color_t TCOD_lighter_amber = {TCOD_LIGHTER_AMBER}; +const TCOD_color_t TCOD_lighter_yellow = {TCOD_LIGHTER_YELLOW}; +const TCOD_color_t TCOD_lighter_lime = {TCOD_LIGHTER_LIME}; +const TCOD_color_t TCOD_lighter_chartreuse = {TCOD_LIGHTER_CHARTREUSE}; +const TCOD_color_t TCOD_lighter_green = {TCOD_LIGHTER_GREEN}; +const TCOD_color_t TCOD_lighter_sea = {TCOD_LIGHTER_SEA}; +const TCOD_color_t TCOD_lighter_turquoise = {TCOD_LIGHTER_TURQUOISE}; +const TCOD_color_t TCOD_lighter_cyan = {TCOD_LIGHTER_CYAN}; +const TCOD_color_t TCOD_lighter_sky = {TCOD_LIGHTER_SKY}; +const TCOD_color_t TCOD_lighter_azure = {TCOD_LIGHTER_AZURE}; +const TCOD_color_t TCOD_lighter_blue = {TCOD_LIGHTER_BLUE}; +const TCOD_color_t TCOD_lighter_han = {TCOD_LIGHTER_HAN}; +const TCOD_color_t TCOD_lighter_violet = {TCOD_LIGHTER_VIOLET}; +const TCOD_color_t TCOD_lighter_purple = {TCOD_LIGHTER_PURPLE}; +const TCOD_color_t TCOD_lighter_fuchsia = {TCOD_LIGHTER_FUCHSIA}; +const TCOD_color_t TCOD_lighter_magenta = {TCOD_LIGHTER_MAGENTA}; +const TCOD_color_t TCOD_lighter_pink = {TCOD_LIGHTER_PINK}; +const TCOD_color_t TCOD_lighter_crimson = {TCOD_LIGHTER_CRIMSON}; + +/* lightest colors */ +const TCOD_color_t TCOD_lightest_red = {TCOD_LIGHTEST_RED}; +const TCOD_color_t TCOD_lightest_flame = {TCOD_LIGHTEST_FLAME}; +const TCOD_color_t TCOD_lightest_orange = {TCOD_LIGHTEST_ORANGE}; +const TCOD_color_t TCOD_lightest_amber = {TCOD_LIGHTEST_AMBER}; +const TCOD_color_t TCOD_lightest_yellow = {TCOD_LIGHTEST_YELLOW}; +const TCOD_color_t TCOD_lightest_lime = {TCOD_LIGHTEST_LIME}; +const TCOD_color_t TCOD_lightest_chartreuse = {TCOD_LIGHTEST_CHARTREUSE}; +const TCOD_color_t TCOD_lightest_green = {TCOD_LIGHTEST_GREEN}; +const TCOD_color_t TCOD_lightest_sea = {TCOD_LIGHTEST_SEA}; +const TCOD_color_t TCOD_lightest_turquoise = {TCOD_LIGHTEST_TURQUOISE}; +const TCOD_color_t TCOD_lightest_cyan = {TCOD_LIGHTEST_CYAN}; +const TCOD_color_t TCOD_lightest_sky = {TCOD_LIGHTEST_SKY}; +const TCOD_color_t TCOD_lightest_azure = {TCOD_LIGHTEST_AZURE}; +const TCOD_color_t TCOD_lightest_blue = {TCOD_LIGHTEST_BLUE}; +const TCOD_color_t TCOD_lightest_han = {TCOD_LIGHTEST_HAN}; +const TCOD_color_t TCOD_lightest_violet = {TCOD_LIGHTEST_VIOLET}; +const TCOD_color_t TCOD_lightest_purple = {TCOD_LIGHTEST_PURPLE}; +const TCOD_color_t TCOD_lightest_fuchsia = {TCOD_LIGHTEST_FUCHSIA}; +const TCOD_color_t TCOD_lightest_magenta = {TCOD_LIGHTEST_MAGENTA}; +const TCOD_color_t TCOD_lightest_pink = {TCOD_LIGHTEST_PINK}; +const TCOD_color_t TCOD_lightest_crimson = {TCOD_LIGHTEST_CRIMSON}; + +/* desaturated colors */ +const TCOD_color_t TCOD_desaturated_red = {TCOD_DESATURATED_RED}; +const TCOD_color_t TCOD_desaturated_flame = {TCOD_DESATURATED_FLAME}; +const TCOD_color_t TCOD_desaturated_orange = {TCOD_DESATURATED_ORANGE}; +const TCOD_color_t TCOD_desaturated_amber = {TCOD_DESATURATED_AMBER}; +const TCOD_color_t TCOD_desaturated_yellow = {TCOD_DESATURATED_YELLOW}; +const TCOD_color_t TCOD_desaturated_lime = {TCOD_DESATURATED_LIME}; +const TCOD_color_t TCOD_desaturated_chartreuse = {TCOD_DESATURATED_CHARTREUSE}; +const TCOD_color_t TCOD_desaturated_green = {TCOD_DESATURATED_GREEN}; +const TCOD_color_t TCOD_desaturated_sea = {TCOD_DESATURATED_SEA}; +const TCOD_color_t TCOD_desaturated_turquoise = {TCOD_DESATURATED_TURQUOISE}; +const TCOD_color_t TCOD_desaturated_cyan = {TCOD_DESATURATED_CYAN}; +const TCOD_color_t TCOD_desaturated_sky = {TCOD_DESATURATED_SKY}; +const TCOD_color_t TCOD_desaturated_azure = {TCOD_DESATURATED_AZURE}; +const TCOD_color_t TCOD_desaturated_blue = {TCOD_DESATURATED_BLUE}; +const TCOD_color_t TCOD_desaturated_han = {TCOD_DESATURATED_HAN}; +const TCOD_color_t TCOD_desaturated_violet = {TCOD_DESATURATED_VIOLET}; +const TCOD_color_t TCOD_desaturated_purple = {TCOD_DESATURATED_PURPLE}; +const TCOD_color_t TCOD_desaturated_fuchsia = {TCOD_DESATURATED_FUCHSIA}; +const TCOD_color_t TCOD_desaturated_magenta = {TCOD_DESATURATED_MAGENTA}; +const TCOD_color_t TCOD_desaturated_pink = {TCOD_DESATURATED_PINK}; +const TCOD_color_t TCOD_desaturated_crimson = {TCOD_DESATURATED_CRIMSON}; + +/* metallic */ +const TCOD_color_t TCOD_brass = {TCOD_BRASS}; +const TCOD_color_t TCOD_copper = {TCOD_COPPER}; +const TCOD_color_t TCOD_gold = {TCOD_GOLD}; +const TCOD_color_t TCOD_silver = {TCOD_SILVER}; + +/* miscellaneous */ +const TCOD_color_t TCOD_celadon = {TCOD_CELADON}; +const TCOD_color_t TCOD_peach = {TCOD_PEACH}; + +/* color array */ +const TCOD_color_t TCOD_colors[TCOD_COLOR_NB][TCOD_COLOR_LEVELS] = { + {{TCOD_DESATURATED_RED},{TCOD_LIGHTEST_RED},{TCOD_LIGHTER_RED},{TCOD_LIGHT_RED},{TCOD_RED},{TCOD_DARK_RED},{TCOD_DARKER_RED},{TCOD_DARKEST_RED}}, + {{TCOD_DESATURATED_FLAME},{TCOD_LIGHTEST_FLAME},{TCOD_LIGHTER_FLAME},{TCOD_LIGHT_FLAME},{TCOD_FLAME},{TCOD_DARK_FLAME},{TCOD_DARKER_FLAME},{TCOD_DARKEST_FLAME}}, + {{TCOD_DESATURATED_ORANGE},{TCOD_LIGHTEST_ORANGE},{TCOD_LIGHTER_ORANGE},{TCOD_LIGHT_ORANGE},{TCOD_ORANGE},{TCOD_DARK_ORANGE},{TCOD_DARKER_ORANGE},{TCOD_DARKEST_ORANGE}}, + {{TCOD_DESATURATED_AMBER},{TCOD_LIGHTEST_AMBER},{TCOD_LIGHTER_AMBER},{TCOD_LIGHT_AMBER},{TCOD_AMBER},{TCOD_DARK_AMBER},{TCOD_DARKER_AMBER},{TCOD_DARKEST_AMBER}}, + {{TCOD_DESATURATED_YELLOW},{TCOD_LIGHTEST_YELLOW},{TCOD_LIGHTER_YELLOW},{TCOD_LIGHT_YELLOW},{TCOD_YELLOW},{TCOD_DARK_YELLOW},{TCOD_DARKER_YELLOW},{TCOD_DARKEST_YELLOW}}, + {{TCOD_DESATURATED_LIME},{TCOD_LIGHTEST_LIME},{TCOD_LIGHTER_LIME},{TCOD_LIGHT_LIME},{TCOD_LIME},{TCOD_DARK_LIME},{TCOD_DARKER_LIME},{TCOD_DARKEST_LIME}}, + {{TCOD_DESATURATED_CHARTREUSE},{TCOD_LIGHTEST_CHARTREUSE},{TCOD_LIGHTER_CHARTREUSE},{TCOD_LIGHT_CHARTREUSE},{TCOD_CHARTREUSE},{TCOD_DARK_CHARTREUSE},{TCOD_DARKER_CHARTREUSE},{TCOD_DARKEST_CHARTREUSE}}, + {{TCOD_DESATURATED_GREEN},{TCOD_LIGHTEST_GREEN},{TCOD_LIGHTER_GREEN},{TCOD_LIGHT_GREEN},{TCOD_GREEN},{TCOD_DARK_GREEN},{TCOD_DARKER_GREEN},{TCOD_DARKEST_GREEN}}, + {{TCOD_DESATURATED_SEA},{TCOD_LIGHTEST_SEA},{TCOD_LIGHTER_SEA},{TCOD_LIGHT_SEA},{TCOD_SEA},{TCOD_DARK_SEA},{TCOD_DARKER_SEA},{TCOD_DARKEST_SEA}}, + {{TCOD_DESATURATED_TURQUOISE},{TCOD_LIGHTEST_TURQUOISE},{TCOD_LIGHTER_TURQUOISE},{TCOD_LIGHT_TURQUOISE},{TCOD_TURQUOISE},{TCOD_DARK_TURQUOISE},{TCOD_DARKER_TURQUOISE},{TCOD_DARKEST_TURQUOISE}}, + {{TCOD_DESATURATED_CYAN},{TCOD_LIGHTEST_CYAN},{TCOD_LIGHTER_CYAN},{TCOD_LIGHT_CYAN},{TCOD_CYAN},{TCOD_DARK_CYAN},{TCOD_DARKER_CYAN},{TCOD_DARKEST_CYAN}}, + {{TCOD_DESATURATED_SKY},{TCOD_LIGHTEST_SKY},{TCOD_LIGHTER_SKY},{TCOD_LIGHT_SKY},{TCOD_SKY},{TCOD_DARK_SKY},{TCOD_DARKER_SKY},{TCOD_DARKEST_SKY}}, + {{TCOD_DESATURATED_AZURE},{TCOD_LIGHTEST_AZURE},{TCOD_LIGHTER_AZURE},{TCOD_LIGHT_AZURE},{TCOD_AZURE},{TCOD_DARK_AZURE},{TCOD_DARKER_AZURE},{TCOD_DARKEST_AZURE}}, + {{TCOD_DESATURATED_BLUE},{TCOD_LIGHTEST_BLUE},{TCOD_LIGHTER_BLUE},{TCOD_LIGHT_BLUE},{TCOD_BLUE},{TCOD_DARK_BLUE},{TCOD_DARKER_BLUE},{TCOD_DARKEST_BLUE}}, + {{TCOD_DESATURATED_HAN},{TCOD_LIGHTEST_HAN},{TCOD_LIGHTER_HAN},{TCOD_LIGHT_HAN},{TCOD_HAN},{TCOD_DARK_HAN},{TCOD_DARKER_HAN},{TCOD_DARKEST_HAN}}, + {{TCOD_DESATURATED_VIOLET},{TCOD_LIGHTEST_VIOLET},{TCOD_LIGHTER_VIOLET},{TCOD_LIGHT_VIOLET},{TCOD_VIOLET},{TCOD_DARK_VIOLET},{TCOD_DARKER_VIOLET},{TCOD_DARKEST_VIOLET}}, + {{TCOD_DESATURATED_PURPLE},{TCOD_LIGHTEST_PURPLE},{TCOD_LIGHTER_PURPLE},{TCOD_LIGHT_PURPLE},{TCOD_PURPLE},{TCOD_DARK_PURPLE},{TCOD_DARKER_PURPLE},{TCOD_DARKEST_PURPLE}}, + {{TCOD_DESATURATED_FUCHSIA},{TCOD_LIGHTEST_FUCHSIA},{TCOD_LIGHTER_FUCHSIA},{TCOD_LIGHT_FUCHSIA},{TCOD_FUCHSIA},{TCOD_DARK_FUCHSIA},{TCOD_DARKER_FUCHSIA},{TCOD_DARKEST_FUCHSIA}}, + {{TCOD_DESATURATED_MAGENTA},{TCOD_LIGHTEST_MAGENTA},{TCOD_LIGHTER_MAGENTA},{TCOD_LIGHT_MAGENTA},{TCOD_MAGENTA},{TCOD_DARK_MAGENTA},{TCOD_DARKER_MAGENTA},{TCOD_DARKEST_MAGENTA}}, + {{TCOD_DESATURATED_PINK},{TCOD_LIGHTEST_PINK},{TCOD_LIGHTER_PINK},{TCOD_LIGHT_PINK},{TCOD_PINK},{TCOD_DARK_PINK},{TCOD_DARKER_PINK},{TCOD_DARKEST_PINK}}, + {{TCOD_DESATURATED_CRIMSON},{TCOD_LIGHTEST_CRIMSON},{TCOD_LIGHTER_CRIMSON},{TCOD_LIGHT_CRIMSON},{TCOD_CRIMSON},{TCOD_DARK_CRIMSON},{TCOD_DARKER_CRIMSON},{TCOD_DARKEST_CRIMSON}} +}; + +TCOD_color_t TCOD_color_RGB(uint8 r, uint8 g, uint8 b) { + TCOD_color_t ret = { r, g, b }; + return ret; +} + +TCOD_color_t TCOD_color_HSV(float h, float s, float v) { + TCOD_color_t ret; + int i; + float f, p, q, t; + + if( s == 0 ) { + /* achromatic (grey) */ + ret.r = ret.g = ret.b = (uint8)(v*255.0f+0.5f); + } + else { + while (h < 0.0f) h += 360.0f; /*for H < 0 */ + while (h >= 360.0f) h -= 360.0f; /*for H >= 360 */ + h /= 60; + i = (int)(h); /*hue sector 0-5 */ + f = h - i; /* factorial part of h */ + p = v * ( 1 - s ); + q = v * ( 1 - s * f ); + t = v * ( 1 - s * ( 1 - f ) ); + + switch (i) { + case 0: + ret.r = (uint8)(v*255.0f+0.5f); + ret.g = (uint8)(t*255.0f+0.5f); + ret.b = (uint8)(p*255.0f+0.5f); + break; + case 1: + ret.r = (uint8)(q*255.0f+0.5f); + ret.g = (uint8)(v*255.0f+0.5f); + ret.b = (uint8)(p*255.0f+0.5f); + break; + case 2: + ret.r = (uint8)(p*255.0f+0.5f); + ret.g = (uint8)(v*255.0f+0.5f); + ret.b = (uint8)(t*255.0f+0.5f); + break; + case 3: + ret.r = (uint8)(p*255.0f+0.5f); + ret.g = (uint8)(q*255.0f+0.5f); + ret.b = (uint8)(v*255.0f+0.5f); + break; + case 4: + ret.r = (uint8)(t*255.0f+0.5f); + ret.g = (uint8)(p*255.0f+0.5f); + ret.b = (uint8)(v*255.0f+0.5f); + break; + default: + ret.r = (uint8)(v*255.0f+0.5f); + ret.g = (uint8)(p*255.0f+0.5f); + ret.b = (uint8)(q*255.0f+0.5f); + break; + } + } + return ret; +} + +bool TCOD_color_equals (TCOD_color_t c1, TCOD_color_t c2) { + return (c1.r == c2.r && c1.g == c2.g && c1.b == c2.b); +} + +TCOD_color_t TCOD_color_add (TCOD_color_t c1, TCOD_color_t c2) { + TCOD_color_t ret; + int r,g,b; + r = (int)(c1.r) + c2.r; + g = (int)(c1.g) + c2.g; + b = (int)(c1.b) + c2.b; + r=MIN(255,r); + g=MIN(255,g); + b=MIN(255,b); + ret.r=(uint8)r; + ret.g=(uint8)g; + ret.b=(uint8)b; + return ret; +} + +TCOD_color_t TCOD_color_subtract (TCOD_color_t c1, TCOD_color_t c2) { + TCOD_color_t ret; + int r,g,b; + r = (int)(c1.r) - c2.r; + g = (int)(c1.g) - c2.g; + b = (int)(c1.b) - c2.b; + r=MAX(0,r); + g=MAX(0,g); + b=MAX(0,b); + ret.r=(uint8)r; + ret.g=(uint8)g; + ret.b=(uint8)b; + return ret; +} + +TCOD_color_t TCOD_color_multiply (TCOD_color_t c1, TCOD_color_t c2) { + TCOD_color_t ret; + ret.r=(uint8)(((int)c1.r)*c2.r/255); + ret.g=(uint8)(((int)c1.g)*c2.g/255); + ret.b=(uint8)(((int)c1.b)*c2.b/255); + return ret; +} + +TCOD_color_t TCOD_color_multiply_scalar (TCOD_color_t c1, float value) { + TCOD_color_t ret; + int r,g,b; + r = (int)(c1.r * value); + g = (int)(c1.g * value); + b = (int)(c1.b * value); + ret.r=(uint8)CLAMP(0,255,r); + ret.g=(uint8)CLAMP(0,255,g); + ret.b=(uint8)CLAMP(0,255,b); + return ret; +} + +TCOD_color_t TCOD_color_lerp(TCOD_color_t c1, TCOD_color_t c2, float coef) { + TCOD_color_t ret; + ret.r=(uint8)(c1.r+(c2.r-c1.r)*coef); + ret.g=(uint8)(c1.g+(c2.g-c1.g)*coef); + ret.b=(uint8)(c1.b+(c2.b-c1.b)*coef); + return ret; +} + +/* 0<= h < 360, 0 <= s <= 1, 0 <= v <= 1 */ +void TCOD_color_set_HSV(TCOD_color_t *c, float h, float s, float v) +{ + int i; + float f, p, q, t; + + if( s == 0.0f ) { + /* achromatic (grey) */ + c->r = c->g = c->b = (uint8)(v*255.0f+0.5f); + return; + } + + while (h < 0.0f) h += 360.0f; /*for H < 0 */ + while (h >= 360.0f) h -= 360.0f; /*for H >= 360 */ + h /= 60.0f; /* sector 0 to 5 */ + i = (int)floor( h ); + f = h - i; /* factorial part of h */ + p = v * ( 1 - s ); + q = v * ( 1 - s * f ); + t = v * ( 1 - s * ( 1 - f ) ); + + switch( i ) { + case 0: + c->r = (uint8)(v*255.0f+0.5f); + c->g = (uint8)(t*255.0f+0.5f); + c->b = (uint8)(p*255.0f+0.5f); + break; + case 1: + c->r = (uint8)(q*255.0f+0.5f); + c->g = (uint8)(v*255.0f+0.5f); + c->b = (uint8)(p*255.0f+0.5f); + break; + case 2: + c->r = (uint8)(p*255.0f+0.5f); + c->g = (uint8)(v*255.0f+0.5f); + c->b = (uint8)(t*255.0f+0.5f); + break; + case 3: + c->r = (uint8)(p*255.0f+0.5f); + c->g = (uint8)(q*255.0f+0.5f); + c->b = (uint8)(v*255.0f+0.5f); + break; + case 4: + c->r = (uint8)(t*255.0f+0.5f); + c->g = (uint8)(p*255.0f+0.5f); + c->b = (uint8)(v*255.0f+0.5f); + break; + default: + c->r = (uint8)(v*255.0f+0.5f); + c->g = (uint8)(p*255.0f+0.5f); + c->b = (uint8)(q*255.0f+0.5f); + break; + } +} + +void TCOD_color_get_HSV(TCOD_color_t c, float *h, float *s, float *v) +{ + uint8 imax,imin; + float min, max, delta; + + imax = ( c.r > c.g ? + ( c.r > c.b ? c.r : c.b ) + : ( c.g > c.b ? c.g : c.b) ); + imin = ( c.r < c.g ? + ( c.r < c.b ? c.r : c.b ) + : ( c.g < c.b ? c.g : c.b) ); + max = imax/255.0f; + min = imin/255.0f; + *v = max; /* v */ + + delta = max - min; + if( max != 0.0f ) *s = delta / max; /* s */ + else + { + *s = 0.0f; /* s */ + *h = 0.0f; /* h */ + return; + } + + if( c.r == imax ) *h = ( c.g - c.b ) / (255.0f * delta); /* between yellow & magenta */ + else if( c.g == imax ) *h = 2.0f + ( c.b - c.r ) / (255.0f * delta); /* between cyan & yellow */ + else *h = 4.0f + ( c.r - c.g ) / (255.0f * delta); /* between magenta & cyan */ + + *h *= 60.0f; /* degrees */ + if( *h < 0 ) *h += 360.0f; +} + +float TCOD_color_get_hue (TCOD_color_t c) { + uint8 max = MAX(c.r,MAX(c.g,c.b)); + uint8 min = MIN(c.r,MIN(c.g,c.b)); + float delta = (float)max - (float)min; + float ret; + if (delta == 0.0f) ret = 0.0f; /*achromatic, including black */ + else { + if (c.r == max) ret = (float)(c.g - c.b) / delta; + else if (c.g == max) ret = 2.0f + (float)(c.b - c.r) / delta; + else ret = 4.0f + (float)(c.r - c.g) / delta; + ret *= 60.0f; + if (ret < 0.0f) ret += 360.0f; + if (ret >= 360.0f) ret -= 360.0f; + } + return ret; +} + +void TCOD_color_set_hue (TCOD_color_t *c, float h) { + float obsolete, s, v; + TCOD_color_get_HSV(*c,&obsolete,&s,&v); + *c = TCOD_color_HSV(h,s,v); +} + +float TCOD_color_get_saturation (TCOD_color_t c) { + float max = (float)(MAX(c.r,MAX(c.g,c.b)))/255.0f; + float min = (float)(MIN(c.r,MIN(c.g,c.b)))/255.0f; + float delta = max - min; + if (max == 0.0f) return 0.0f; + else return delta/max; +} + +void TCOD_color_set_saturation (TCOD_color_t *c, float s) { + float h, obsolete, v; + TCOD_color_get_HSV(*c,&h,&obsolete,&v); + *c = TCOD_color_HSV(h,s,v); +} + +float TCOD_color_get_value (TCOD_color_t c) { + return (float)(MAX(c.r,MAX(c.g,c.b)))/255.0f; +} + +void TCOD_color_set_value (TCOD_color_t *c, float v) { + float h, s, obsolete; + TCOD_color_get_HSV(*c,&h,&s,&obsolete); + *c = TCOD_color_HSV(h,s,v); +} + +void TCOD_color_shift_hue (TCOD_color_t *c, float hshift) { + float h, s, v; + if (hshift == 0.0f) return; + TCOD_color_get_HSV(*c,&h,&s,&v); + *c = TCOD_color_HSV(h+hshift,s,v); +} + +void TCOD_color_scale_HSV (TCOD_color_t *c, float scoef, float vcoef) { + float h, s, v; + TCOD_color_get_HSV(*c,&h,&s,&v); + s = CLAMP(0.0f,1.0f,s*scoef); + v = CLAMP(0.0f,1.0f,v*vcoef); + *c = TCOD_color_HSV(h,s,v); +} + +void TCOD_color_gen_map(TCOD_color_t *map, int nb_key, TCOD_color_t const *key_color, int const *key_index) { + int segment=0; + for (segment=0; segment < nb_key-1; segment++) { + int idx_start=key_index[segment]; + int idx_end=key_index[segment+1]; + int idx; + for ( idx=idx_start;idx <= idx_end; idx++) { + map[idx]=TCOD_color_lerp(key_color[segment],key_color[segment+1],(float)(idx-idx_start)/(idx_end-idx_start)); + } + } +} + + diff --git a/tcod/tcod_sys/libtcod/src/console.cpp b/tcod/tcod_sys/libtcod/src/console.cpp new file mode 100644 index 00000000..d973430e --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/console.cpp @@ -0,0 +1,432 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "libtcod.hpp" +#include "libtcod_int.h" + +TCODConsole * TCODConsole::root = NULL; + +TCODConsole::TCODConsole() {} +TCODConsole::TCODConsole(int w, int h) { + data = TCOD_console_new(w,h); +} + +TCODConsole::TCODConsole(const char *filename) { + data = TCOD_console_from_file(filename); +} + +bool TCODConsole::loadAsc(const char *filename) { + return TCOD_console_load_asc(data,filename) != 0; +} +bool TCODConsole::saveAsc(const char *filename) const { + return TCOD_console_save_asc(data,filename) != 0; +} +bool TCODConsole::saveApf(const char *filename) const { + return TCOD_console_save_apf(data,filename) != 0; +} +bool TCODConsole::loadApf(const char *filename) { + return TCOD_console_load_apf(data,filename) != 0; +} + +void TCODConsole::setCustomFont(const char *fontFile, int flags,int nbCharHoriz, int nbCharVertic) { + TCOD_console_set_custom_font(fontFile,flags,nbCharHoriz,nbCharVertic); +} + +void TCODConsole::mapAsciiCodeToFont(int asciiCode, int fontCharX, int fontCharY) { + TCOD_console_map_ascii_code_to_font(asciiCode,fontCharX,fontCharY); +} + +void TCODConsole::mapAsciiCodesToFont(int firstAsciiCode, int nbCodes, int fontCharX, int fontCharY) { + TCOD_console_map_ascii_codes_to_font(firstAsciiCode,nbCodes,fontCharX,fontCharY); +} + +void TCODConsole::mapStringToFont(const char *s, int fontCharX, int fontCharY) { + TCOD_console_map_string_to_font(s, fontCharX, fontCharY); +} + +void TCODConsole::setDirty(int x, int y, int w, int h) { + TCOD_console_set_dirty(x,y,w,h); +} + +TCOD_key_t TCODConsole::checkForKeypress(int flags) { + return TCOD_sys_check_for_keypress(flags); +} + +TCOD_key_t TCODConsole::waitForKeypress(bool flush) { + return TCOD_sys_wait_for_keypress(flush); +} + +bool TCODConsole::isWindowClosed() { + return TCOD_console_is_window_closed() != 0; +} + +bool TCODConsole::hasMouseFocus() { + return TCOD_console_has_mouse_focus() != 0; +} + +bool TCODConsole::isActive() { + return TCOD_console_is_active() != 0; +} + +int TCODConsole::getWidth() const { + return TCOD_console_get_width(data); +} + +int TCODConsole::getHeight() const { + return TCOD_console_get_height(data); +} + +void TCODConsole::setColorControl(TCOD_colctrl_t con, const TCODColor &fore, const TCODColor &back) { + TCOD_color_t b={back.r,back.g,back.b},f={fore.r,fore.g,fore.b}; + TCOD_console_set_color_control(con,f,b); +} + +TCODColor TCODConsole::getDefaultBackground() const { + TCOD_color_t c= TCOD_console_get_default_background(data); + TCODColor ret; + ret.r=c.r; + ret.g=c.g; + ret.b=c.b; + return ret; +} +TCODColor TCODConsole::getDefaultForeground() const { + return TCOD_console_get_default_foreground(data); +} +void TCODConsole::setDefaultBackground(TCODColor back) { + TCOD_color_t b={back.r,back.g,back.b}; + TCOD_console_set_default_background(data,b); +} +void TCODConsole::setDefaultForeground(TCODColor fore) { + TCOD_color_t b={fore.r,fore.g,fore.b}; + TCOD_console_set_default_foreground(data,b); +} + +void TCODConsole::setWindowTitle(const char *title) { + TCOD_sys_set_window_title(title); +} + +void TCODConsole::initRoot(int w, int h, const char *title, bool fullscreen, TCOD_renderer_t renderer) { + TCODConsole *con=new TCODConsole(); + TCOD_console_init_root(w,h,title,fullscreen,renderer); + con->data=TCOD_ctx.root; + TCODConsole::root=con; +} + +void TCODConsole::setFullscreen(bool fullscreen) { + TCOD_console_set_fullscreen(fullscreen); +} + +bool TCODConsole::isFullscreen() { + return TCOD_console_is_fullscreen() != 0; +} + +void TCODConsole::setBackgroundFlag(TCOD_bkgnd_flag_t bkgnd_flag) { + TCOD_console_set_background_flag(data,bkgnd_flag); +} + +TCOD_bkgnd_flag_t TCODConsole::getBackgroundFlag() const { + return TCOD_console_get_background_flag(data); +} + +void TCODConsole::setAlignment(TCOD_alignment_t alignment) { + TCOD_console_set_alignment(data,alignment); +} + +TCOD_alignment_t TCODConsole::getAlignment() const { + return TCOD_console_get_alignment(data); +} + +TCODConsole::~TCODConsole() { + TCOD_console_delete(data); +} + +void TCODConsole::blit(const TCODConsole *srcCon,int xSrc, int ySrc, int wSrc, int hSrc, + TCODConsole *dstCon, int xDst, int yDst, float foreground_alpha, float background_alpha) { + TCOD_console_blit(srcCon->data,xSrc,ySrc,wSrc,hSrc,dstCon->data,xDst,yDst,foreground_alpha, background_alpha); +} + + +void TCODConsole::flush() { + TCOD_console_flush(); +} + +void TCODConsole::setFade(uint8 val, const TCODColor &fade) { + TCOD_color_t f= {fade.r,fade.g,fade.b}; + TCOD_console_set_fade(val,f); +} + +uint8 TCODConsole::getFade() { + return TCOD_console_get_fade(); +} + +TCODColor TCODConsole::getFadingColor() { + return TCOD_console_get_fading_color(); +} + +void TCODConsole::putChar(int x, int y, int c, TCOD_bkgnd_flag_t flag) { + TCOD_console_put_char(data,x,y,c,flag); +} + +void TCODConsole::putCharEx(int x, int y, int c, const TCODColor &fore, const TCODColor &back) { + TCOD_color_t f={fore.r,fore.g,fore.b}; + TCOD_color_t b={back.r,back.g,back.b}; + TCOD_console_put_char_ex(data,x,y,c,f,b); +} + +void TCODConsole::clear() { + TCOD_console_clear(data); +} + +TCODColor TCODConsole::getCharBackground(int x, int y) const { + return TCOD_console_get_char_background(data,x,y); +} +void TCODConsole::setCharForeground(int x,int y, const TCODColor &col) { + TCOD_color_t c={col.r,col.g,col.b}; + TCOD_console_set_char_foreground(data,x,y,c); +} +TCODColor TCODConsole::getCharForeground(int x, int y) const { + return TCOD_console_get_char_foreground(data,x,y); +} + +int TCODConsole::getChar(int x, int y) const { + return TCOD_console_get_char(data,x,y); +} + +void TCODConsole::setCharBackground(int x, int y, const TCODColor &col, TCOD_bkgnd_flag_t flag) { + TCOD_color_t c={col.r,col.g,col.b}; + TCOD_console_set_char_background(data,x,y,c,flag); +} + +void TCODConsole::setChar(int x, int y, int c) { + TCOD_console_set_char(data,x,y,c); +} + +void TCODConsole::rect(int x,int y, int rw, int rh, bool clear, TCOD_bkgnd_flag_t flag) { + TCOD_console_rect(data,x,y,rw,rh,clear,flag); +} + +void TCODConsole::hline(int x,int y, int l, TCOD_bkgnd_flag_t flag) { + TCOD_console_hline(data,x,y,l,flag); +} + +void TCODConsole::vline(int x,int y, int l, TCOD_bkgnd_flag_t flag) { + TCOD_console_vline(data,x,y,l,flag); +} + +void TCODConsole::printFrame(int x,int y,int w,int h, bool empty, TCOD_bkgnd_flag_t flag, const char *fmt , ...) { + if ( fmt ) { + va_list ap; + va_start(ap,fmt); + TCOD_console_print_frame(data,x,y,w,h,empty,flag,TCOD_console_vsprint(fmt,ap)); + va_end(ap); + } else { + TCOD_console_print_frame(data,x,y,w,h,empty,flag,NULL); + } +} + +void TCODConsole::print(int x, int y, const char *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=(TCOD_console_data_t *)data; + TCOD_IFNOT ( dat != NULL ) return; + va_start(ap,fmt); + TCOD_console_print_internal(data,x,y,0,0,dat->bkgnd_flag,dat->alignment, + TCOD_console_vsprint(fmt,ap),false,false); + va_end(ap); +} + +void TCODConsole::printEx(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...) { + va_list ap; + va_start(ap,fmt); + TCOD_console_print_internal(data,x,y,0,0,flag,alignment,TCOD_console_vsprint(fmt,ap),false,false); + va_end(ap); +} + + +/* +void TCODConsole::printLine(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_print_location_t location, const char *fmt, ...) { + va_list ap; + va_start(ap,fmt); + switch(location) + { + case TCOD_PRINT_LEFT: + TCOD_console_print(data,x,y,getWidth()-x,getHeight()-y,flag,LEFT,TCOD_console_vsprint(fmt,ap),false,false); + break; + case TCOD_PRINT_RIGHT: + TCOD_console_print(data,x,y,x+1,getHeight()-y,flag,RIGHT,TCOD_console_vsprint(fmt,ap),false,false); + break; + case TCOD_PRINT_CENTER: + TCOD_console_print(data,x,y,getWidth(),getHeight()-y,flag,CENTER,TCOD_console_vsprint(fmt,ap),false,false); + break; + default: + TCOD_ASSERT(0); + break; + } + va_end(ap); +} +*/ + +int TCODConsole::printRect(int x, int y, int w, int h, const char *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=(TCOD_console_data_t *)data; + TCOD_IFNOT ( dat != NULL ) return 0; + va_start(ap,fmt); + int ret = TCOD_console_print_internal(data,x,y,w,h,dat->bkgnd_flag,dat->alignment,TCOD_console_vsprint(fmt,ap),true,false); + va_end(ap); + return ret; +} + +int TCODConsole::printRectEx(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, + TCOD_alignment_t alignment, const char *fmt, ...) { + va_list ap; + va_start(ap,fmt); + int ret = TCOD_console_print_internal(data,x,y,w,h,flag,alignment,TCOD_console_vsprint(fmt,ap),true,false); + va_end(ap); + return ret; +} + +int TCODConsole::getHeightRect(int x, int y, int w, int h, const char *fmt, ...) { + va_list ap; + va_start(ap,fmt); + int ret = TCOD_console_print_internal(data,x,y,w,h,TCOD_BKGND_NONE,TCOD_LEFT,TCOD_console_vsprint(fmt,ap),true,true); + va_end(ap); + return ret; +} + +void TCODConsole::setKeyboardRepeat(int initialDelay,int interval) { + TCOD_console_set_keyboard_repeat(initialDelay,interval); +} + +void TCODConsole::disableKeyboardRepeat() { + TCOD_console_disable_keyboard_repeat(); +} + +bool TCODConsole::isKeyPressed(TCOD_keycode_t key) { + return TCOD_console_is_key_pressed(key) != 0; +} +void TCODConsole::setKeyColor(const TCODColor &col) { + TCOD_color_t c={col.r,col.g,col.b}; + TCOD_console_set_key_color(data,c); +} + +void TCODConsole::credits() { + TCOD_console_credits(); +} + +void TCODConsole::resetCredits() { + TCOD_console_credits_reset(); +} + +bool TCODConsole::renderCredits(int x, int y, bool alpha) { + return TCOD_console_credits_render(x,y,alpha) != 0; +} + +#ifndef NO_UNICODE +void TCODConsole::mapStringToFont(const wchar_t *s, int fontCharX, int fontCharY) { + TCOD_console_map_string_to_font_utf(s, fontCharX, fontCharY); +} + +void TCODConsole::print(int x, int y, const wchar_t *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=(TCOD_console_data_t *)data; + TCOD_IFNOT ( dat != NULL ) return; + va_start(ap,fmt); + TCOD_console_print_internal_utf(data,x,y,0,0,dat->bkgnd_flag,dat->alignment,TCOD_console_vsprint_utf(fmt,ap),false,false); + va_end(ap); +} + +void TCODConsole::printEx(int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) { + va_list ap; + va_start(ap,fmt); + TCOD_console_print_internal_utf(data,x,y,0,0,flag,alignment,TCOD_console_vsprint_utf(fmt,ap),false,false); + va_end(ap); +} + +int TCODConsole::printRect(int x, int y, int w, int h, const wchar_t *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=(TCOD_console_data_t *)data; + TCOD_IFNOT ( dat != NULL ) return 0; + va_start(ap,fmt); + int ret = TCOD_console_print_internal_utf(data,x,y,w,h,dat->bkgnd_flag,dat->alignment, + TCOD_console_vsprint_utf(fmt,ap),true,false); + va_end(ap); + return ret; +} + +int TCODConsole::printRectEx(int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, + TCOD_alignment_t alignment, const wchar_t *fmt, ...) { + va_list ap; + va_start(ap,fmt); + int ret = TCOD_console_print_internal_utf(data,x,y,w,h,flag,alignment, + TCOD_console_vsprint_utf(fmt,ap),true,false); + va_end(ap); + return ret; +} + +int TCODConsole::getHeightRect(int x, int y, int w, int h, const wchar_t *fmt, ...) { + va_list ap; + va_start(ap,fmt); + int ret = TCOD_console_print_internal_utf(data,x,y,w,h,TCOD_BKGND_NONE,TCOD_LEFT,TCOD_console_vsprint_utf(fmt,ap),true,true); + va_end(ap); + return ret; +} + +// color control string formating utilities for swigged language + +// ctrl = TCOD_COLCTRL_1...TCOD_COLCTRL_5 or TCOD_COLCTRL_STOP +#define NB_BUFFERS 10 +const char *TCODConsole::getColorControlString( TCOD_colctrl_t ctrl ) { + static char buf[NB_BUFFERS][2]; + static int buf_nb=0; + const char *ret; + buf[buf_nb][0]=ctrl; + buf[buf_nb][1]=0; + ret = (const char *)(&buf[buf_nb][0]); + buf_nb = (buf_nb+1) % NB_BUFFERS; + return ret; +} + +// ctrl = TCOD_COLCTRL_FORE_RGB or TCOD_COLCTRL_BACK_RGB +const char *TCODConsole::getRGBColorControlString( TCOD_colctrl_t ctrl, const TCODColor & col ) { + static char buf[NB_BUFFERS][5]; + static int buf_nb=0; + const char *ret; + buf[buf_nb][0]=ctrl; + buf[buf_nb][1]=col.r; + buf[buf_nb][2]=col.g; + buf[buf_nb][3]=col.b; + buf[buf_nb][4]=0; + ret = (const char *)(&buf[buf_nb][0]); + buf_nb = (buf_nb+1) % NB_BUFFERS; + return ret; +} + +#endif + + diff --git a/tcod/tcod_sys/libtcod/src/console_c.c b/tcod/tcod_sys/libtcod/src/console_c.c new file mode 100644 index 00000000..de92fa66 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/console_c.c @@ -0,0 +1,2288 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" +#ifndef NO_UNICODE +#include +#include +#endif + +#if defined( TCOD_VISUAL_STUDIO ) +static const char *version_string ="libtcod "TCOD_STRVERSION; +#else +static const char *version_string __attribute__((unused)) ="libtcod "TCOD_STRVERSION; +#endif + +TCOD_internal_context_t TCOD_ctx={ + /* number of characters in the bitmap font */ + 16,16, + /* font type and layout */ + false,false,false, + /* character size in font */ + 8,8, + "terminal.png","", + NULL,NULL,NULL,0,false,0,0,0,0,0,0, + /* default renderer to use */ + TCOD_RENDERER_GLSL, + NULL, + /* fading data */ + {0,0,0},255, + /* window closed ? */ + false, + /* mouse focus ? */ + false, + /* application active ? */ + true, +}; + +static TCOD_color_t color_control_fore[TCOD_COLCTRL_NUMBER]; +static TCOD_color_t color_control_back[TCOD_COLCTRL_NUMBER]; + +void TCOD_console_set_color_control(TCOD_colctrl_t con, TCOD_color_t fore, TCOD_color_t back) { + TCOD_IFNOT(con >= TCOD_COLCTRL_1 && con <= TCOD_COLCTRL_NUMBER ) return; + color_control_fore[con-1]=fore; + color_control_back[con-1]=back; +} + +void TCOD_fatal(const char *fmt, ...) { + va_list ap; + TCOD_sys_term(); + printf("%s\n",version_string); + va_start(ap,fmt); + vprintf(fmt,ap); + va_end(ap); + printf ("\n"); + exit (1); +} + +void TCOD_fatal_nopar(const char *msg) { + TCOD_sys_term(); + printf("%s\n%s\n",version_string,msg); + exit (1); +} + +TCOD_console_t TCOD_console_new(int w, int h) { + TCOD_IFNOT(w > 0 && h > 0 ) { + return NULL; + } else { + TCOD_console_data_t *con=(TCOD_console_data_t *)calloc(sizeof(TCOD_console_data_t),1); + con->w=w; + con->h=h; + TCOD_console_init(con,NULL,false); + if(TCOD_ctx.root) { + con->alignment=TCOD_ctx.root->alignment; + con->bkgnd_flag=TCOD_ctx.root->bkgnd_flag; + } + return (TCOD_console_t)con; + } +} + +TCOD_key_t TCOD_console_check_for_keypress(int flags) { + return TCOD_sys_check_for_keypress(flags); +} + +TCOD_key_t TCOD_console_wait_for_keypress(bool flush) { + return TCOD_sys_wait_for_keypress(flush); +} + +bool TCOD_console_is_window_closed() { + return TCOD_ctx.is_window_closed; +} + +bool TCOD_console_has_mouse_focus() { + return TCOD_ctx.app_has_mouse_focus; +} + +bool TCOD_console_is_active() { + return TCOD_ctx.app_is_active; +} + +void TCOD_console_set_window_title(const char *title) { + TCOD_sys_set_window_title(title); +} + +void TCOD_console_set_fullscreen(bool fullscreen) { + TCOD_IFNOT(TCOD_ctx.root != NULL) return; + TCOD_sys_set_fullscreen(fullscreen); + TCOD_ctx.fullscreen=fullscreen; +} + +bool TCOD_console_is_fullscreen() { + return TCOD_ctx.fullscreen; +} + +void TCOD_console_set_background_flag(TCOD_console_t con,TCOD_bkgnd_flag_t flag) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + dat->bkgnd_flag=flag; +} + +TCOD_bkgnd_flag_t TCOD_console_get_background_flag(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return TCOD_BKGND_NONE; + return dat->bkgnd_flag; +} + +void TCOD_console_set_alignment(TCOD_console_t con,TCOD_alignment_t alignment) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + dat->alignment=alignment; +} + +TCOD_alignment_t TCOD_console_get_alignment(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return TCOD_LEFT; + return dat->alignment; +} + + +void TCOD_console_delete(TCOD_console_t con) { + TCOD_console_data_t *dat=(TCOD_console_data_t *)(con); + if (! dat ) { + dat=TCOD_ctx.root; + TCOD_sys_term(); + TCOD_ctx.root=NULL; + } + free(dat->buf); + free(dat->oldbuf); + free(dat); +} + +void TCOD_console_blit(TCOD_console_t srcCon,int xSrc, int ySrc, int wSrc, int hSrc, + TCOD_console_t dstCon, int xDst, int yDst, float foreground_alpha, float background_alpha) { + TCOD_console_data_t *src=srcCon ? (TCOD_console_data_t *)srcCon : TCOD_ctx.root; + TCOD_console_data_t *dst=dstCon ? (TCOD_console_data_t *)dstCon : TCOD_ctx.root; + int cx,cy; + if ( wSrc == 0 ) wSrc=src->w; + if ( hSrc == 0 ) hSrc=src->h; + TCOD_IFNOT(wSrc > 0 && hSrc > 0 ) return; + TCOD_IFNOT(xDst+wSrc >= 0 && yDst+hSrc >= 0 && xDst < dst->w && yDst < dst->h) return; + for (cx = xSrc; cx < xSrc+wSrc; cx++) { + for (cy = ySrc; cy < ySrc+hSrc; cy++) { + /* check if we're outside the dest console */ + int dx=cx-xSrc+xDst; + int dy=cy-ySrc+yDst; + uint8 dirt; + char_t srcChar,dstChar; + if ( (unsigned) cx >= (unsigned) src->w || (unsigned)cy >= (unsigned) src->h ) continue; + if ( (unsigned) dx >= (unsigned) dst->w || (unsigned)dy >= (unsigned) dst->h ) continue; + /* check if source pixel is transparent */ + srcChar=src->buf[cy * src->w+cx]; + if ( src->haskey && srcChar.back.r == src->key.r + && srcChar.back.g == src->key.g && srcChar.back.b == src->key.b ) continue; + if ( foreground_alpha == 1.0f && background_alpha == 1.0f ) { + dstChar=srcChar; + } else { + dstChar=dst->buf[dy * dst->w + dx]; + + dstChar.back = TCOD_color_lerp(dstChar.back,srcChar.back,background_alpha); + if ( srcChar.c == ' ' ) { + dstChar.fore = TCOD_color_lerp(dstChar.fore,srcChar.back,background_alpha); + } else if (dstChar.c == ' ') { + dstChar.c=srcChar.c; + dstChar.cf=srcChar.cf; + dstChar.fore = TCOD_color_lerp(dstChar.back,srcChar.fore,foreground_alpha); + } else if (dstChar.c == srcChar.c) { + dstChar.fore = TCOD_color_lerp(dstChar.fore,srcChar.fore,foreground_alpha); + } else { + if ( foreground_alpha < 0.5f ) { + dstChar.fore=TCOD_color_lerp(dstChar.fore,dstChar.back, + foreground_alpha*2); + } else { + dstChar.c=srcChar.c; + dstChar.cf=srcChar.cf; + dstChar.fore=TCOD_color_lerp(dstChar.back,srcChar.fore, + (foreground_alpha-0.5f)*2); + } + } + } + dirt=dst->buf[dy * dst->w + dx].dirt; + dst->buf[dy * dst->w + dx] = dstChar; + dst->buf[dy * dst->w + dx].dirt=dirt; + } + } +} + + +void TCOD_console_flush() { + TCOD_console_data_t *dat=TCOD_ctx.root; + TCOD_IFNOT(TCOD_ctx.root != NULL) return; + TCOD_sys_flush(true); + memcpy(dat->oldbuf,dat->buf,sizeof(char_t)* + dat->w*dat->h); +} + +void TCOD_console_set_fade(uint8 val, TCOD_color_t fadecol) { + TCOD_ctx.fade=val; + TCOD_ctx.fading_color=fadecol; +} + +uint8 TCOD_console_get_fade() { + return TCOD_ctx.fade; +} + +TCOD_color_t TCOD_console_get_fading_color() { + return TCOD_ctx.fading_color; +} + + +void TCOD_console_put_char(TCOD_console_t con,int x, int y, int c, TCOD_bkgnd_flag_t flag) { + int offset; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) return; + TCOD_IFNOT (c >= 0 && c < TCOD_ctx.max_font_chars ) return; + offset = y * dat->w + x; + dat->buf[ offset ].c = c; + dat->buf[ offset ].cf = TCOD_ctx.ascii_to_tcod[c]; + dat->buf[ offset ].fore = dat->fore; + TCOD_console_set_char_background(con,x,y,dat->back,(TCOD_bkgnd_flag_t)flag); +} + +void TCOD_console_put_char_ex(TCOD_console_t con,int x, int y, int c, TCOD_color_t fore, TCOD_color_t back) { + int offset; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) return; + TCOD_IFNOT (c >= 0 && c < TCOD_ctx.max_font_chars ) return; + offset = y * dat->w + x; + dat->buf[ offset ].c = c; + dat->buf[ offset ].cf = TCOD_ctx.ascii_to_tcod[c]; + dat->buf[ offset ].fore = fore; + dat->buf[ offset ].back = back; +} + +void TCOD_console_set_dirty(int dx, int dy, int dw, int dh) { + int x,y; + TCOD_console_data_t *dat=TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return; + TCOD_IFNOT(dx < dat->w && dy < dat->h && dx+dw >= 0 && dy+dh >= 0 ) return; + TCOD_IFNOT( dx >= 0 ) { + dw += dx; + dx = 0; + } + TCOD_IFNOT( dy >= 0 ) { + dh += dy; + dy = 0; + } + TCOD_IFNOT( dx+dw <= dat->w ) dw = dat->w-dx; + TCOD_IFNOT( dy+dh <= dat->h ) dh = dat->h-dy; + + for (x=dx; x < dx+dw;x++) { + for (y=dy; y < dy+dh; y++) { + int off=x+dat->w*y; + dat->buf[off].dirt=1; + } + } +} + +void TCOD_console_clear(TCOD_console_t con) { + int x,y; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return; + for (x=0; x < dat->w;x++) { + for (y=0; y < dat->h; y++) { + int off=x+dat->w*y; + dat->buf[off].dirt=0; + dat->buf[off].c=' '; + dat->buf[off].cf=TCOD_ctx.ascii_to_tcod?TCOD_ctx.ascii_to_tcod[' ']:0; + dat->buf[off].fore=dat->fore; + dat->buf[off].back=dat->back; + } + } +} + +TCOD_color_t TCOD_console_get_char_background(TCOD_console_t con,int x, int y) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return TCOD_black; + return dat->buf[ y * dat->w + x ].back; +} + +void TCOD_console_set_char_foreground(TCOD_console_t con,int x,int y, TCOD_color_t col) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + if ( (unsigned)(x) >= (unsigned)dat->w || (unsigned)(y) >= (unsigned)dat->h ) return; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return; + dat->buf[ y * dat->w + x ].fore=col; +} + +TCOD_color_t TCOD_console_get_char_foreground(TCOD_console_t con,int x, int y) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return TCOD_white; + return dat->buf[ y * dat->w + x ].fore; +} + +int TCOD_console_get_char(TCOD_console_t con,int x, int y) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return 0; + return dat->buf[ y * dat->w + x ].c; +} + +void TCOD_console_set_char_background(TCOD_console_t con,int x, int y, TCOD_color_t col, TCOD_bkgnd_flag_t flag) { + TCOD_color_t *back; + int newr,newg,newb; + int alpha; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return; + back=&dat->buf[y*dat->w+x].back; + if ( flag == TCOD_BKGND_DEFAULT ) flag = dat->bkgnd_flag; + switch ( flag & 0xff ) { + case TCOD_BKGND_SET : *back = col; break; + case TCOD_BKGND_MULTIPLY : *back= TCOD_color_multiply(*back, col); break; + case TCOD_BKGND_LIGHTEN : + back->r = MAX(back->r,col.r); + back->g = MAX(back->g,col.g); + back->b = MAX(back->b,col.b); + break; + case TCOD_BKGND_DARKEN : + back->r = MIN(back->r,col.r); + back->g = MIN(back->g,col.g); + back->b = MIN(back->b,col.b); + break; + case TCOD_BKGND_SCREEN : + /* newbk = white - (white - oldbk) * (white - curbk) */ + back->r = (uint8)(255 - (int)(255 - back->r)*(255 - col.r)/255); + back->g = (uint8)(255 - (int)(255 - back->g)*(255 - col.g)/255); + back->b = (uint8)(255 - (int)(255 - back->b)*(255 - col.b)/255); + break; + case TCOD_BKGND_COLOR_DODGE : + /* newbk = curbk / (white - oldbk) */ + if ( back->r != 255 ) newr = (int)(255 * col.r) / (255 - back->r); + else newr=255; + if ( back->g != 255 ) newg = (int)(255 * col.g) / (255 - back->g); + else newg=255; + if ( back->b != 255 ) newb = (int)(255 * col.b) / (255 - back->b); + else newb=255; + back->r=(uint8)CLAMP(0,255,newr); + back->g=(uint8)CLAMP(0,255,newg); + back->b=(uint8)CLAMP(0,255,newb); + break; + case TCOD_BKGND_COLOR_BURN : + /* newbk = white - (white - oldbk) / curbk */ + if ( col.r > 0 ) newr = 255 - (int)(255 * (255 - back->r) )/col.r; + else newr = 0; + if ( col.g > 0 ) newg = 255 - (int)(255 * (255 - back->g)) /col.g; + else newg = 0; + if ( col.b > 0 ) newb = 255 - (int)(255 * (255 - back->b)) /col.b; + else newb = 0; + back->r=(uint8)CLAMP(0,255,newr); + back->g=(uint8)CLAMP(0,255,newg); + back->b=(uint8)CLAMP(0,255,newb); + break; + case TCOD_BKGND_ADD : + /* newbk = oldbk + curbk */ + newr=(int)(back->r)+col.r; + newg=(int)(back->g)+col.g; + newb=(int)(back->b)+col.b; + back->r=(uint8)CLAMP(0,255,newr); + back->g=(uint8)CLAMP(0,255,newg); + back->b=(uint8)CLAMP(0,255,newb); + break; + case TCOD_BKGND_ADDA : + alpha=(flag >> 8); + /* newbk = oldbk + alpha * curbk */ + newr=(int)(back->r)+alpha * col.r / 255; + newg=(int)(back->g)+alpha * col.g / 255; + newb=(int)(back->b)+alpha * col.b / 255; + back->r=(uint8)CLAMP(0,255,newr); + back->g=(uint8)CLAMP(0,255,newg); + back->b=(uint8)CLAMP(0,255,newb); + break; + case TCOD_BKGND_BURN : + /* newbk = oldbk + curbk - white */ + newr=(int)(back->r)+col.r-255; + newg=(int)(back->g)+col.g-255; + newb=(int)(back->b)+col.b-255; + back->r=(uint8)CLAMP(0,255,newr); + back->g=(uint8)CLAMP(0,255,newg); + back->b=(uint8)CLAMP(0,255,newb); + break; + case TCOD_BKGND_OVERLAY : + /* newbk = curbk.x <= 0.5 ? 2*curbk*oldbk : white - 2*(white-curbk)*(white-oldbk) */ + newr = col.r <= 128 ? 2 * (int)(col.r) * back->r / 255 : 255 - 2*(int)(255 - col.r)*(255-back->r)/255; + newg = col.g <= 128 ? 2 * (int)(col.g) * back->g / 255 : 255 - 2*(int)(255 - col.g)*(255-back->g)/255; + newb = col.b <= 128 ? 2 * (int)(col.b) * back->b / 255 : 255 - 2*(int)(255 - col.b)*(255-back->b)/255; + back->r=(uint8)CLAMP(0,255,newr); + back->g=(uint8)CLAMP(0,255,newg); + back->b=(uint8)CLAMP(0,255,newb); + break; + case TCOD_BKGND_ALPH : + /* newbk = (1.0f-alpha)*oldbk + alpha*(curbk-oldbk) */ + alpha=(flag >> 8); + *back = TCOD_color_lerp(*back,col,(float)(alpha/255.0f)); + break; + default : break; + } +} + +void TCOD_console_set_char(TCOD_console_t con,int x, int y, int c) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + if ( (unsigned)(x) >= (unsigned)dat->w || (unsigned)(y) >= (unsigned)dat->h ) return; + dat->buf[ y * dat->w + x ].c=c; + dat->buf[ y * dat->w + x ].cf = TCOD_ctx.ascii_to_tcod[c]; +} + +static void TCOD_console_clamp(int cx, int cy, int cw, int ch, int *x, int *y, int *w, int *h) { + if ( *x + *w > cw ) *w = cw - *x; + if ( *y + *h > ch ) *h = ch - *y; + if (*x < cx ) { + *w -= cx - *x; + *x = cx; + } + if (*y < cy ) { + *h -= cy - *y; + *y = cy; + } +} + +void TCOD_console_rect(TCOD_console_t con,int x,int y, int rw, int rh, bool clear, TCOD_bkgnd_flag_t flag) { + int cx,cy; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + TCOD_ASSERT((unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ); + TCOD_ASSERT(x+rw <= dat->w && y+rh <= dat->h ); + + TCOD_console_clamp(0,0,dat->w,dat->h,&x,&y,&rw,&rh); + TCOD_IFNOT(rw > 0 && rh > 0) return; + for (cx=x;cx < x+rw; cx++) { + for (cy=y;cyback,flag); + if ( clear ) { + dat->buf[cx + cy*dat->w].c=' '; + dat->buf[cx + cy*dat->w].cf=TCOD_ctx.ascii_to_tcod[' ']; + } + } + } +} + +void TCOD_console_hline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) { + int i; + for (i=x; i< x+l; i++) TCOD_console_put_char(con,i,y,TCOD_CHAR_HLINE,flag); +} + +void TCOD_console_vline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) { + int i; + for (i=y; i< y+l; i++) TCOD_console_put_char(con,x,i,TCOD_CHAR_VLINE,flag); +} + +char *TCOD_console_vsprint(const char *fmt, va_list ap) { + #define NB_BUFFERS 10 + #define INITIAL_SIZE 512 + /* several static buffers in case the function is used more than once in a single function call */ + static char *msg[NB_BUFFERS]={NULL}; + static int buflen[NB_BUFFERS]={0}; + static int curbuf=0; + char *ret; + bool ok=false; + if (!msg[0]) { + int i; + for (i=0; i < NB_BUFFERS; i++) { + buflen[i]=INITIAL_SIZE; + msg[i]=(char *)calloc(sizeof(char),INITIAL_SIZE); + } + } + do { + /* warning ! depending on the compiler, vsnprintf return -1 or + the expected string length if the buffer is not big enough */ + int len = vsnprintf(msg[curbuf],buflen[curbuf],fmt,ap); + ok=true; + if (len < 0 || len >= buflen[curbuf]) { + /* buffer too small. */ + if ( len > 0 ) { + while ( buflen[curbuf] < len+1 ) buflen[curbuf]*=2; + } else { + buflen[curbuf]*=2; + } + free( msg[curbuf] ); + msg[curbuf]=(char *)calloc(sizeof(char),buflen[curbuf]); + ok=false; + } + } while (! ok); + ret=msg[curbuf]; + curbuf = (curbuf+1)%NB_BUFFERS; + return ret; +} + +void TCOD_console_print_frame(TCOD_console_t con,int x,int y,int w,int h, bool empty, TCOD_bkgnd_flag_t flag, const char *fmt, ...) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_console_put_char(con,x,y,TCOD_CHAR_NW,flag); + TCOD_console_put_char(con,x+w-1,y,TCOD_CHAR_NE,flag); + TCOD_console_put_char(con,x,y+h-1,TCOD_CHAR_SW,flag); + TCOD_console_put_char(con,x+w-1,y+h-1,TCOD_CHAR_SE,flag); + TCOD_console_hline(con,x+1,y,w-2,flag); + TCOD_console_hline(con,x+1,y+h-1,w-2,flag); + if ( h > 2 ) { + TCOD_console_vline(con,x,y+1,h-2,flag); + TCOD_console_vline(con,x+w-1,y+1,h-2,flag); + if ( empty ) { + TCOD_console_rect(con,x+1,y+1,w-2,h-2,true,flag); + } + } + if (fmt) { + va_list ap; + int xs; + TCOD_color_t tmp; + char *title; + va_start(ap,fmt); + title = TCOD_console_vsprint(fmt,ap); + va_end(ap); + title[w-3]=0; /* truncate if needed */ + xs = x + (w-strlen(title)-2)/2; + tmp=dat->back; /* swap colors */ + dat->back=dat->fore; + dat->fore=tmp; + TCOD_console_print_ex(con,xs,y,TCOD_BKGND_SET,TCOD_LEFT," %s ",title); + tmp=dat->back; /* swap colors */ + dat->back=dat->fore; + dat->fore=tmp; + } +} + +void TCOD_console_print(TCOD_console_t con,int x, int y, const char *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + va_start(ap,fmt); + TCOD_console_print_internal(con,x,y,0,0,dat->bkgnd_flag, + dat->alignment,TCOD_console_vsprint(fmt,ap), false, false); + va_end(ap); +} + +void TCOD_console_print_ex(TCOD_console_t con,int x, int y, + TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + va_start(ap,fmt); + TCOD_console_print_internal(con,x,y,0,0,flag,alignment, + TCOD_console_vsprint(fmt,ap), false, false); + va_end(ap); +} + +int TCOD_console_print_rect(TCOD_console_t con,int x, int y, int w, int h, const char *fmt, ...) { + int ret; + va_list ap; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return 0; + va_start(ap,fmt); + ret = TCOD_console_print_internal(con,x,y,w,h,dat->bkgnd_flag,dat->alignment, + TCOD_console_vsprint(fmt,ap), true, false); + va_end(ap); + return ret; +} + +int TCOD_console_print_rect_ex(TCOD_console_t con,int x, int y, int w, int h, + TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment,const char *fmt, ...) { + int ret; + va_list ap; + va_start(ap,fmt); + ret = TCOD_console_print_internal(con,x,y,w,h,flag,alignment,TCOD_console_vsprint(fmt,ap), true, false); + va_end(ap); + return ret; +} + +int TCOD_console_get_height_rect(TCOD_console_t con,int x, int y, int w, int h, const char *fmt, ...) { + int ret; + va_list ap; + va_start(ap,fmt); + ret = TCOD_console_print_internal(con,x,y,w,h,TCOD_BKGND_NONE,TCOD_LEFT,TCOD_console_vsprint(fmt,ap), true, true); + va_end(ap); + return ret; +} + +/* non public methods */ +int TCOD_console_stringLength(const unsigned char *s) { + int l=0; + while (*s) { + if ( *s == (int)TCOD_COLCTRL_FORE_RGB || *s == (int)TCOD_COLCTRL_BACK_RGB ) s+=3; + else if ( (unsigned)(*s) > (unsigned)TCOD_COLCTRL_STOP ) l++; + s++; + } + return l; +} + +unsigned char * TCOD_console_forward(unsigned char *s,int l) { + while ( *s && l > 0 ) { + if ( *s == (int)TCOD_COLCTRL_FORE_RGB || *s == (int)TCOD_COLCTRL_BACK_RGB ) s+=3; + else if ( *s > (int)TCOD_COLCTRL_STOP ) l--; + s++; + } + return s; +} + +unsigned char *TCOD_console_strchr(unsigned char *s, unsigned char c) { + while ( *s && *s != c ) { + if ( *s == (int)TCOD_COLCTRL_FORE_RGB || *s == (int)TCOD_COLCTRL_BACK_RGB ) s+=3; + s++; + } + return (*s ? s : NULL); +} + +int TCOD_console_print_internal(TCOD_console_t con,int x,int y, int rw, int rh, TCOD_bkgnd_flag_t flag, + TCOD_alignment_t align, char *msg, bool can_split, bool count_only) { + unsigned char *c=(unsigned char *)msg; + int cx=0,cy=y; + int minx,maxx,miny,maxy; + TCOD_color_t oldFore; + TCOD_color_t oldBack; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return 0; + TCOD_IFNOT(msg != NULL) return 0; + if ( rh == 0 ) rh = dat->h-y; + if ( rw == 0 ) switch(align) { + case TCOD_LEFT : rw = dat->w-x; break; + case TCOD_RIGHT : rw=x+1; break; + case TCOD_CENTER : default : rw=dat->w; break; + } + oldFore=dat->fore; + oldBack=dat->back; + miny=y; + maxy=dat->h-1; + if (rh > 0) maxy=MIN(maxy,y+rh-1); + switch (align) { + case TCOD_LEFT : minx=MAX(0,x); maxx=MIN(dat->w-1,x+rw-1); break; + case TCOD_RIGHT : minx=MAX(0,x-rw+1); maxx=MIN(dat->w-1,x); break; + case TCOD_CENTER : default : minx=MAX(0,x-rw/2); maxx=MIN(dat->w-1,x+rw/2); break; + } + + do { + /* get \n delimited sub-message */ + unsigned char *end=TCOD_console_strchr(c,'\n'); + char bak=0; + int cl; + unsigned char *split=NULL; + if ( end ) *end=0; + cl= TCOD_console_stringLength(c); + /* find starting x */ + switch (align) { + case TCOD_LEFT : cx=x; break; + case TCOD_RIGHT : cx=x-cl+1; break; + case TCOD_CENTER : cx= x-cl/2;break; + } + /* check if the string is completely out of the minx,miny,maxx,maxy frame */ + if ( cy >= miny && cy <= maxy && cx <= maxx && cx+cl -1 >= minx ) { + if ( can_split && cy <= maxy ) { + /* if partially out of screen, try to split the sub-message */ + if ( cx < minx ) split = TCOD_console_forward(c, align == TCOD_CENTER ? cl-2*(minx-cx) : cl-(minx-cx)); + else if ( align == TCOD_CENTER ) { + if ( cx + cl/2 > maxx+1 ) split = TCOD_console_forward(c, maxx+1 - cx); + } else { + if ( cx + cl > maxx+1 ) split = TCOD_console_forward(c, maxx+1 - cx); + } + } + if ( split ) { + unsigned char *oldsplit=split; + while ( ! isspace(*split) && split > c ) split --; + if (end) *end='\n'; + if (!isspace(*split) ) { + split=oldsplit; + } + end=split; + bak=*split; + *split=0; + cl=TCOD_console_stringLength(c); + switch (align) { + case TCOD_LEFT : cx=x; break; + case TCOD_RIGHT : cx=x-cl+1; break; + case TCOD_CENTER : cx= x-cl/2;break; + } + } + if ( cx < minx ) { + /* truncate left part */ + c += minx-cx; + cl -= minx-cx; + cx=minx; + } + if ( cx + cl > maxx+1 ) { + /* truncate right part */ + split = TCOD_console_forward(c, maxx+1 - cx); + *split=0; + } + /* render the sub-message */ + if ( cy >= 0 && cy < dat->h ) + while (*c) { + if ( *c >= TCOD_COLCTRL_1 && *c <= TCOD_COLCTRL_NUMBER ) { + dat->fore=color_control_fore[(int)(*c)-1]; + dat->back=color_control_back[(int)(*c)-1]; + } else if ( *c == TCOD_COLCTRL_FORE_RGB ) { + c++; + dat->fore.r=*c++; + dat->fore.g=*c++; + dat->fore.b=*c; + } else if ( *c == TCOD_COLCTRL_BACK_RGB ) { + c++; + dat->back.r=*c++; + dat->back.g=*c++; + dat->back.b=*c; + } else if ( *c == TCOD_COLCTRL_STOP ) { + dat->fore=oldFore; + dat->back=oldBack; + } else { + if (! count_only) TCOD_console_put_char(con,cx,cy,(int)(*c),flag); + cx++; + } + c++; + } + } + if ( end ) { + /* next line */ + if ( split && ! isspace(bak) ) { + *end=bak; + c=end; + } else { + c=end+1; + } + cy++; + } else c=NULL; + } while ( c && cy < dat->h && (rh == 0 || cy < y+rh) ); + return cy-y+1; +} + +#ifndef NO_UNICODE + +wchar_t *TCOD_console_strchr_utf(wchar_t *s, char c) { + while ( *s && *s != c ) { + if ( *s == (int)TCOD_COLCTRL_FORE_RGB || *s == (int)TCOD_COLCTRL_BACK_RGB ) s+=3; + s++; + } + return (*s ? s : NULL); +} + +void TCOD_console_map_string_to_font_utf(const wchar_t *s, int fontCharX, int fontCharY) { + TCOD_IFNOT(s != NULL) return; + while (*s) { + TCOD_sys_map_ascii_to_font(*s, fontCharX, fontCharY); + fontCharX++; + if ( fontCharX == TCOD_ctx.fontNbCharHoriz ) { + fontCharX=0; + fontCharY++; + } + s++; + } +} + +wchar_t *TCOD_console_vsprint_utf(const wchar_t *fmt, va_list ap) { + #define NB_BUFFERS 10 + #define INITIAL_SIZE 512 + /* several static buffers in case the function is used more than once in a single function call */ + static wchar_t *msg[NB_BUFFERS]={NULL}; + static int buflen[NB_BUFFERS]={0}; + static int curbuf=0; + wchar_t *ret; + bool ok=false; + if (!msg[0]) { + int i; + for (i=0; i < NB_BUFFERS; i++) { + buflen[i]=INITIAL_SIZE; + msg[i]=(wchar_t *)calloc(sizeof(wchar_t),INITIAL_SIZE); + } + } + do { + /* warning ! depending on the compiler, vsnprintf return -1 or + the expected string length if the buffer is not big enough */ + int len = vsnwprintf(msg[curbuf],buflen[curbuf],fmt,ap); + ok=true; + if (len < 0 || len >= buflen[curbuf]) { + /* buffer too small. */ + if ( len > 0 ) { + while ( buflen[curbuf] < len+1 ) buflen[curbuf]*=2; + } else { + buflen[curbuf]*=2; + } + free( msg[curbuf] ); + msg[curbuf]=(wchar_t *)calloc(sizeof(wchar_t),buflen[curbuf]); + ok=false; + } + } while (! ok); + ret=msg[curbuf]; + curbuf = (curbuf+1)%NB_BUFFERS; + return ret; +} + + +int TCOD_console_stringLength_utf(const wchar_t *s) { + int l=0; + while (*s) { + if ( *s == (int)TCOD_COLCTRL_FORE_RGB || *s == (int)TCOD_COLCTRL_BACK_RGB ) s+=3; + else if ( *s > (int)TCOD_COLCTRL_STOP ) l++; + s++; + } + return l; +} + +wchar_t * TCOD_console_forward_utf(wchar_t *s,int l) { + while ( *s && l > 0 ) { + if ( *s == (int)TCOD_COLCTRL_FORE_RGB || *s == (int)TCOD_COLCTRL_BACK_RGB ) s+=3; + else if ( *s > (int)TCOD_COLCTRL_STOP ) l--; + s++; + } + return s; +} + +int TCOD_console_print_internal_utf(TCOD_console_t con,int x,int y, int rw, int rh, TCOD_bkgnd_flag_t flag, + TCOD_alignment_t align, wchar_t *msg, bool can_split, bool count_only) { + wchar_t *c=msg; + int cx=0,cy=y; + int minx,maxx,miny,maxy; + TCOD_color_t oldFore; + TCOD_color_t oldBack; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL + && (unsigned)(x) < (unsigned)dat->w && (unsigned)(y) < (unsigned)dat->h ) + return 0; + TCOD_IFNOT(msg != NULL) return 0; + if ( rh == 0 ) rh = dat->h-y; + if ( rw == 0 ) switch(align) { + case TCOD_LEFT : rw = dat->w-x; break; + case TCOD_RIGHT : rw=x+1; break; + case TCOD_CENTER : default : rw=dat->w; break; + } + oldFore=dat->fore; + oldBack=dat->back; + miny=y; + maxy=dat->h-1; + if (rh > 0) maxy=MIN(maxy,y+rh-1); + switch (align) { + case TCOD_LEFT : minx=MAX(0,x); maxx=MIN(dat->w-1,x+rw-1); break; + case TCOD_RIGHT : minx=MAX(0,x-rw+1); maxx=MIN(dat->w-1,x); break; + case TCOD_CENTER : default : minx=MAX(0,x-rw/2); maxx=MIN(dat->w-1,x+rw/2); break; + } + + do { + /* get \n delimited sub-message */ + wchar_t *end=TCOD_console_strchr_utf(c,'\n'); + wchar_t bak=0; + int cl; + wchar_t *split=NULL; + if ( end ) *end=0; + cl= TCOD_console_stringLength_utf(c); + /* find starting x */ + switch (align) { + case TCOD_LEFT : cx=x; break; + case TCOD_RIGHT : cx=x-cl+1; break; + case TCOD_CENTER : cx= x-cl/2;break; + } + /* check if the string is completely out of the minx,miny,maxx,maxy frame */ + if ( cy >= miny && cy <= maxy && cx <= maxx && cx+cl -1 >= minx ) { + if ( can_split && cy < maxy ) { + /* if partially out of screen, try to split the sub-message */ + if ( cx < minx ) split = TCOD_console_forward_utf(c, align == TCOD_CENTER ? cl-2*(minx-cx) : cl-(minx-cx)); + else if ( align==TCOD_CENTER ) { + if ( cx + cl/2 > maxx+1 ) split = TCOD_console_forward_utf(c, maxx+1 - cx); + } else { + if ( cx + cl > maxx+1 ) split = TCOD_console_forward_utf(c, maxx+1 - cx); + } + } + if ( split ) { + wchar_t *oldsplit=split; + while ( ! iswspace(*split) && split > c ) split --; + if (end) *end='\n'; + if (!iswspace(*split) ) { + split=oldsplit; + } + end=split; + bak=*split; + *split=0; + cl=TCOD_console_stringLength_utf(c); + switch (align) { + case TCOD_LEFT : cx=x; break; + case TCOD_RIGHT : cx=x-cl+1; break; + case TCOD_CENTER : cx= x-cl/2;break; + } + } + if ( cx < minx ) { + /* truncate left part */ + c += minx-cx; + cl -= minx-cx; + cx=minx; + } + if ( cx + cl > maxx+1 ) { + /* truncate right part */ + split = TCOD_console_forward_utf(c, maxx+1 - cx); + *split=0; + } + /* render the sub-message */ + if ( cy >= 0 && cy < dat->h ) + while (*c) { + if ( *c >= TCOD_COLCTRL_1 && *c <= TCOD_COLCTRL_NUMBER ) { + dat->fore=color_control_fore[(int)(*c)-1]; + dat->back=color_control_back[(int)(*c)-1]; + } else if ( *c == TCOD_COLCTRL_FORE_RGB ) { + c++; + dat->fore.r=(uint8)(*c++); + dat->fore.g=(uint8)(*c++); + dat->fore.b=(uint8)(*c); + } else if ( *c == TCOD_COLCTRL_BACK_RGB ) { + c++; + dat->back.r=(uint8)(*c++); + dat->back.g=(uint8)(*c++); + dat->back.b=(uint8)(*c); + } else if ( *c == TCOD_COLCTRL_STOP ) { + dat->fore=oldFore; + dat->back=oldBack; + } else { + if (! count_only) TCOD_console_put_char(con,cx,cy,(int)(*c),flag); + cx++; + } + c++; + } + } + if ( end ) { + /* next line */ + if ( split && ! iswspace(bak) ) { + *end=bak; + c=end; + } else { + c=end+1; + } + cy++; + } else c=NULL; + } while ( c && cy < dat->h && (rh == 0 || cy < y+rh) ); + return cy-y+1; +} + +void TCOD_console_print_utf(TCOD_console_t con,int x, int y, const wchar_t *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + va_start(ap,fmt); + TCOD_console_print_internal_utf(con,x,y,0,0,dat->bkgnd_flag,dat->alignment, + TCOD_console_vsprint_utf(fmt,ap), false, false); + va_end(ap); +} + +void TCOD_console_print_ex_utf(TCOD_console_t con,int x, int y, + TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) { + va_list ap; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return; + va_start(ap,fmt); + TCOD_console_print_internal_utf(con,x,y,0,0,flag,alignment,TCOD_console_vsprint_utf(fmt,ap), false, false); + va_end(ap); +} + +int TCOD_console_print_rect_utf(TCOD_console_t con,int x, int y, int w, int h, + const wchar_t *fmt, ...) { + int ret; + va_list ap; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT ( dat != NULL ) return 0; + va_start(ap,fmt); + ret = TCOD_console_print_internal_utf(con,x,y,w,h,dat->bkgnd_flag,dat->alignment, + TCOD_console_vsprint_utf(fmt,ap), true, false); + va_end(ap); + return ret; +} + +int TCOD_console_print_rect_ex_utf(TCOD_console_t con,int x, int y, int w, int h, + TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...) { + int ret; + va_list ap; + va_start(ap,fmt); + ret=TCOD_console_print_internal_utf(con,x,y,w,h,flag,alignment,TCOD_console_vsprint_utf(fmt,ap), true, false); + va_end(ap); + return ret; +} + +int TCOD_console_get_height_rect_utf(TCOD_console_t con,int x, int y, int w, int h, const wchar_t *fmt, ...) { + int ret; + va_list ap; + va_start(ap,fmt); + ret = TCOD_console_print_internal_utf(con,x,y,w,h,TCOD_BKGND_NONE,TCOD_LEFT,TCOD_console_vsprint_utf(fmt,ap), true, true); + va_end(ap); + return ret; +} + +#endif + +void TCOD_console_init_root(int w, int h, const char*title, bool fullscreen, TCOD_renderer_t renderer) { + TCOD_IF(w > 0 && h > 0) { + TCOD_console_data_t *con=(TCOD_console_data_t *)calloc(sizeof(TCOD_console_data_t),1); + int i; + con->w=w; + con->h=h; + TCOD_ctx.root=con; + TCOD_ctx.renderer=renderer; + for (i=0; i < TCOD_COLCTRL_NUMBER; i++) { + color_control_fore[i]=TCOD_white; + color_control_back[i]=TCOD_black; + } + TCOD_console_init((TCOD_console_t)con,title,fullscreen); + } +} + +bool TCOD_console_init(TCOD_console_t con,const char *title, bool fullscreen) { + int i; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return false; + dat->fore=TCOD_white; + dat->back=TCOD_black; + dat->fade=255; + dat->buf = (char_t *)calloc(sizeof(char_t),dat->w*dat->h); + dat->oldbuf = (char_t *)calloc(sizeof(char_t),dat->w*dat->h); + dat->bkgnd_flag=TCOD_BKGND_NONE; + dat->alignment=TCOD_LEFT; + for (i=0; i< dat->w*dat->h; i++) { + dat->buf[i].c=' '; + dat->buf[i].cf=-1; + } + if ( title ) { + if (! TCOD_sys_init(dat->w,dat->h,dat->buf,dat->oldbuf,fullscreen) ) return false; + TCOD_sys_set_window_title(title); + } + return true; +} + +void TCOD_console_set_default_foreground(TCOD_console_t con,TCOD_color_t col) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return; + dat->fore=col; +} + +void TCOD_console_set_default_background(TCOD_console_t con,TCOD_color_t col) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return; + dat->back=col; +} + +TCOD_color_t TCOD_console_get_default_foreground(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return TCOD_white; + return dat->fore; +} + +TCOD_color_t TCOD_console_get_default_background(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return TCOD_black; + return dat->back; +} + +int TCOD_console_get_width(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return 0; + return dat->w; +} + +int TCOD_console_get_height(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return 0; + return dat->h; +} + +char_t *TCOD_console_get_buf(TCOD_console_t con) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return NULL; + return dat->buf; +} + +void TCOD_console_set_custom_font(const char *fontFile, int flags,int nb_char_horiz, int nb_char_vertic) { + TCOD_sys_set_custom_font(fontFile, nb_char_horiz, nb_char_vertic, flags); +} + +void TCOD_console_map_ascii_code_to_font(int asciiCode, int fontCharX, int fontCharY) { + /* cannot change mapping before initRoot is called */ + TCOD_IFNOT(TCOD_ctx.root != NULL) return; + TCOD_sys_map_ascii_to_font(asciiCode, fontCharX, fontCharY); +} + +void TCOD_console_map_ascii_codes_to_font(int asciiCode, int nbCodes, int fontCharX, int fontCharY) { + int c; + /* cannot change mapping before initRoot is called */ + TCOD_IFNOT(TCOD_ctx.root != NULL) return; + TCOD_IFNOT(asciiCode >= 0 && asciiCode+nbCodes <= TCOD_ctx.max_font_chars) return; + for (c=asciiCode; c < asciiCode+nbCodes; c++ ) { + TCOD_sys_map_ascii_to_font(c, fontCharX, fontCharY); + fontCharX++; + if ( fontCharX == TCOD_ctx.fontNbCharHoriz ) { + fontCharX=0; + fontCharY++; + } + } +} + +void TCOD_console_map_string_to_font(const char *s, int fontCharX, int fontCharY) { + TCOD_IFNOT(s != NULL) return; + /* cannot change mapping before initRoot is called */ + TCOD_IFNOT(TCOD_ctx.root != NULL) return; + while (*s) { + TCOD_console_map_ascii_code_to_font(*s, fontCharX, fontCharY); + fontCharX++; + if ( fontCharX == TCOD_ctx.fontNbCharHoriz ) { + fontCharX=0; + fontCharY++; + } + s++; + } +} + +void TCOD_console_set_keyboard_repeat(int initial_delay, int interval) { + TCOD_sys_set_keyboard_repeat(initial_delay,interval); +} + +void TCOD_console_disable_keyboard_repeat() { + TCOD_sys_set_keyboard_repeat(0,0); +} + +bool TCOD_console_is_key_pressed(TCOD_keycode_t key) { + return TCOD_sys_is_key_pressed(key); +} +void TCOD_console_set_key_color(TCOD_console_t con,TCOD_color_t col) { + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return; + dat->key = col; + dat->haskey=true; +} + +void TCOD_console_credits() { + bool end=false; + int x=TCOD_console_get_width(NULL)/2-6; + int y=TCOD_console_get_height(NULL)/2; + int fade=260; + TCOD_sys_save_fps(); + TCOD_sys_set_fps(25); + while (!end ) { + TCOD_key_t k; + end=TCOD_console_credits_render(x,y,false); + TCOD_sys_check_for_event(TCOD_EVENT_KEY_PRESS,&k,NULL); + if ( fade == 260 && k.vk != TCODK_NONE ) { + fade -= 10; + } + TCOD_console_flush(); + if ( fade < 260 ) { + fade -= 10; + TCOD_console_set_fade(fade,TCOD_black); + if ( fade == 0 ) end=true; + } + } + TCOD_console_set_fade(255,TCOD_black); + TCOD_sys_restore_fps(); +} + +static bool init2=false; + +void TCOD_console_credits_reset() { + init2=false; +} + +bool TCOD_console_credits_render(int x, int y, bool alpha) { + static char poweredby[128]; + static float char_heat[128]; + static int char_x[128]; + static int char_y[128]; + static bool init1=false; + static int len,len1,cw=-1,ch=-1; + static float xstr; + static TCOD_color_t colmap[64]; + static TCOD_color_t colmap_light[64]; + static TCOD_noise_t noise; + static TCOD_color_t colkeys[4] = { + {255,255,204}, + {255,204,0}, + {255,102,0}, + {102,153,255}, + }; + static TCOD_color_t colkeys_light[4] = { + {255,255,204}, + {128,128,77}, + {51,51,31}, + {0,0,0}, + }; + static int colpos[4]={ + 0,21,42,63 + }; + static TCOD_image_t img=NULL; + int i,xc,yc,xi,yi,j; + static int left,right,top,bottom; + float sparklex,sparkley,sparklerad,sparklerad2,noisex; + /* mini particule system */ +#define MAX_PARTICULES 50 + static float pheat[MAX_PARTICULES]; + static float px[MAX_PARTICULES],py[MAX_PARTICULES], pvx[MAX_PARTICULES],pvy[MAX_PARTICULES]; + static int nbpart=0, firstpart=0; + static float partDelay=0.1f; + float elapsed=TCOD_sys_get_last_frame_length(); + TCOD_color_t fbackup; /* backup fg color */ + + if (!init1) { + /* initialize all static data, colormaps, ... */ + TCOD_color_t col; + TCOD_color_gen_map(colmap,4,colkeys,colpos); + TCOD_color_gen_map(colmap_light,4,colkeys_light,colpos); + sprintf(poweredby,"Powered by\n%s",version_string); + noise=TCOD_noise_new(1,TCOD_NOISE_DEFAULT_HURST,TCOD_NOISE_DEFAULT_LACUNARITY,NULL); + len=strlen(poweredby); + len1=11; /* sizeof "Powered by\n" */ + left=MAX(x-4,0); + top=MAX(y-4,0); + col= TCOD_console_get_default_background(NULL); + TCOD_console_set_default_background(NULL,TCOD_black); + TCOD_console_set_default_background(NULL,col); + init1=true; + } + if (!init2) { + /* reset the credits vars ... */ + int curx,cury; + xstr=-4.0f; + curx=x; + cury=y; + for (i=0; i < len ;i++) { + char_heat[i]=-1; + char_x[i]=curx; + char_y[i]=cury; + curx++; + if ( poweredby[i] == '\n' ) { + curx=x; + cury++; + } + } + nbpart=firstpart=0; + init2=true; + } + if (TCOD_console_get_width(NULL) != cw || TCOD_console_get_height(NULL)!=ch) { + /* console size has changed */ + int width,height; + cw=TCOD_console_get_width(NULL); + ch=TCOD_console_get_height(NULL); + right=MIN(x+len,cw-1); + bottom=MIN(y+6,ch-1); + width=right - left + 1; + height=bottom - top + 1; + if ( img ) TCOD_image_delete(img); + img = TCOD_image_new(width*2,height*2); + } + fbackup=TCOD_console_get_default_foreground(NULL); + if ( xstr < (float)len1 ) { + sparklex=x+xstr; + sparkley=(float)y; + } else { + sparklex=x-len1+xstr; + sparkley=(float)y+1; + } + noisex=xstr*6; + sparklerad=3.0f+2*TCOD_noise_get(noise,&noisex); + if ( xstr >= len-1 ) sparklerad -= (xstr-len+1)*4.0f; + else if ( xstr < 0.0f ) sparklerad += xstr*4.0f; + else if ( poweredby[ (int)(xstr+0.5f) ] == ' ' || poweredby[ (int)(xstr+0.5f) ] == '\n' ) sparklerad/=2; + sparklerad2=sparklerad*sparklerad*4; + + /* draw the light */ + for (xc=left*2,xi=0; xc < (right+1)*2; xc++,xi++) { + for (yc=top*2,yi=0; yc < (bottom+1)*2; yc++,yi++) { + float dist=((xc-2*sparklex)*(xc-2*sparklex)+(yc-2*sparkley)*(yc-2*sparkley)); + TCOD_color_t pixcol; + if ( sparklerad >= 0.0f && dist < sparklerad2 ) { + int colidx=63-(int)(63*(sparklerad2-dist)/sparklerad2) + TCOD_random_get_int(NULL,-10,10); + colidx=CLAMP(0,63,colidx); + pixcol=colmap_light[colidx]; + } else { + pixcol=TCOD_black; + } + if ( alpha ) { + /* console cells have following flag values : + 1 2 + 4 8 + flag indicates which subcell uses foreground color */ + static int asciiToFlag[] = { + 1, /* TCOD_CHAR_SUBP_NW */ + 2, /* TCOD_CHAR_SUBP_NE */ + 3, /* TCOD_CHAR_SUBP_N */ + 8, /* TCOD_CHAR_SUBP_SE */ + 9, /* TCOD_CHAR_SUBP_DIAG */ + 10, /* TCOD_CHAR_SUBP_E */ + 4, /* TCOD_CHAR_SUBP_SW */ + }; + int conc= TCOD_console_get_char(NULL,xc/2,yc/2); + TCOD_color_t bk=TCOD_console_get_char_background(NULL,xc/2,yc/2); + if ( conc >= TCOD_CHAR_SUBP_NW && conc <= TCOD_CHAR_SUBP_SW ) { + /* merge two subcell chars... + get the flag for the existing cell on root console */ + int bkflag=asciiToFlag[conc - TCOD_CHAR_SUBP_NW ]; + int xflag = (xc & 1); + int yflag = (yc & 1); + /* get the flag for the current subcell */ + int credflag = (1+3*yflag) * (xflag+1); + if ( (credflag & bkflag) != 0 ) { + /* the color for this subcell on root console + is foreground, not background */ + bk = TCOD_console_get_char_foreground(NULL,xc/2,yc/2); + } + } + pixcol.r = MIN(255,(int)(bk.r)+pixcol.r); + pixcol.g = MIN(255,(int)(bk.g)+pixcol.g); + pixcol.b = MIN(255,(int)(bk.b)+pixcol.b); + } + TCOD_image_put_pixel(img,xi,yi,pixcol); + } + } + + /* draw and update the particules */ + j=nbpart;i=firstpart; + while (j > 0) { + int colidx=(int)(64*(1.0f-pheat[i])); + TCOD_color_t col; + colidx=MIN(63,colidx); + col=colmap[colidx]; + if ( (int)py[i]< (bottom-top+1)*2 ) { + int ipx = (int)px[i]; + int ipy = (int)py[i]; + float fpx = px[i]-ipx; + float fpy = py[i]-ipy; + TCOD_color_t col2=TCOD_image_get_pixel(img,ipx,ipy); + col2=TCOD_color_lerp(col,col2,0.5f*(fpx+fpy)); + TCOD_image_put_pixel(img,ipx,ipy,col2); + col2=TCOD_image_get_pixel(img,ipx+1,ipy); + col2=TCOD_color_lerp(col2,col,fpx); + TCOD_image_put_pixel(img,ipx+1,ipy,col2); + col2=TCOD_image_get_pixel(img,ipx,ipy+1); + col2=TCOD_color_lerp(col2,col,fpy); + TCOD_image_put_pixel(img,ipx,ipy+1,col2); + } else pvy[i]=-pvy[i] * 0.5f; + pvx[i] *= (1.0f-elapsed); + pvy[i] += (1.0f-pheat[i])*elapsed*300.0f; + px[i] += pvx[i]*elapsed; + py[i] += pvy[i]*elapsed; + pheat[i] -= elapsed*0.3f; + if ( pheat[i] < 0.0f ) { + firstpart = (firstpart+1)%MAX_PARTICULES; + nbpart--; + } + i = (i+1)%MAX_PARTICULES; + j--; + } + partDelay -= elapsed; + if ( partDelay < 0.0f && nbpart < MAX_PARTICULES && sparklerad > 2.0f ) { + /* fire a new particule */ + int lastpart = firstpart; + int nb=nbpart; + while (nb > 0 ) { + lastpart = ( lastpart + 1 )%MAX_PARTICULES; + nb--; + } + nbpart++; + px[lastpart] = 2*(sparklex-left); + py[lastpart] = 2*(sparkley-top)+2; + pvx[lastpart] = TCOD_random_get_float(NULL,-5.0f,5.0f); + pvy[lastpart] = TCOD_random_get_float(NULL,-0.5f, -15.0f); + pheat[lastpart] = 1.0f; + partDelay += 0.1f; + } + TCOD_image_blit_2x(img,NULL,left,top,0,0,-1,-1); + /* draw the text */ + for (i=0; i < len ;i++) { + if ( char_heat[i] >= 0.0f && poweredby[i]!='\n') { + int colidx=(int)(64*char_heat[i]); + TCOD_color_t col; + colidx=MIN(63,colidx); + col=colmap[colidx]; + if ( xstr >= len ) { + float coef=(xstr-len)/len; + if ( alpha ) { + TCOD_color_t fore=TCOD_console_get_char_background(NULL,char_x[i],char_y[i]); + int r=(int)(coef*fore.r + (1.0f-coef)*col.r); + int g=(int)(coef*fore.g + (1.0f-coef)*col.g); + int b=(int)(coef*fore.b + (1.0f-coef)*col.b); + col.r = CLAMP(0,255,r); + col.g = CLAMP(0,255,g); + col.b = CLAMP(0,255,b); + TCOD_console_set_char_foreground(NULL,char_x[i],char_y[i],col); + } else { + col=TCOD_color_lerp(col,TCOD_black,coef); + } + } + TCOD_console_set_char(NULL,char_x[i],char_y[i],poweredby[i]); + TCOD_console_set_char_foreground(NULL,char_x[i],char_y[i],col); + } + } + /* update letters heat */ + xstr += elapsed * 4; + for (i=0; i < (int)(xstr+0.5f); i++) { + char_heat[i]=(xstr-i)/(len/2); + } + /* restore fg color */ + TCOD_console_set_default_foreground(NULL,fbackup); + if ( xstr <= 2*len ) return false; + init2=false; + return true; +} + +static void TCOD_console_read_asc(TCOD_console_t con,FILE *f,int width, int height, float version) { + int x,y; + TCOD_console_data_t *dat=con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_IFNOT(dat != NULL) return; + while(fgetc(f) != '#'); + for(x = 0; x < width; x++) { + for(y = 0; y < height; y++) { + TCOD_color_t fore,back; + int c = fgetc(f); + fore.r = fgetc(f); + fore.g = fgetc(f); + fore.b = fgetc(f); + back.r = fgetc(f); + back.g = fgetc(f); + back.b = fgetc(f); + /* skip solid/walkable info */ + if ( version >= 0.3f ) { + fgetc(f); + fgetc(f); + } + TCOD_console_put_char_ex(con,x,y,c,fore,back); + } + } + fclose(f); +} + +static void TCOD_console_read_apf(TCOD_console_t con,FILE *f,int width, int height, float version) { +} + +TCOD_console_t TCOD_console_from_file(const char *filename) { + float version; + int width,height; + TCOD_console_t con; + FILE *f; + TCOD_IFNOT( filename != NULL ) { + return NULL; + } + f=fopen(filename,"rb"); + TCOD_IFNOT( f!=NULL ) { + return NULL; + } + if (fscanf(f, "ASCII-Paint v%g", &version) != 1 ) { + fclose(f); + return NULL; + } + if (fscanf(f, "%i %i", &width, &height) != 2 ) { + fclose(f); + return NULL; + } + TCOD_IFNOT ( width > 0 && height > 0) { + fclose(f); + return NULL; + } + con=TCOD_console_new(width,height); + if ( strstr(filename,".asc") ) + TCOD_console_read_asc(con,f,width,height,version); + else TCOD_console_read_apf(con,f,width,height,version); + return con; +} + +bool TCOD_console_load_asc(TCOD_console_t pcon, const char *filename) { + float version; + int width,height; + FILE *f; + TCOD_console_data_t *con=pcon ? (TCOD_console_data_t *)pcon : TCOD_ctx.root; + TCOD_IFNOT(con != NULL) return false; + TCOD_IFNOT( filename != NULL ) { + return false; + } + f=fopen(filename,"rb"); + TCOD_IFNOT( f!=NULL ) { + return false; + } + if (fscanf(f, "ASCII-Paint v%g", &version) != 1 ) { + fclose(f); + return false; + } + if (fscanf(f, "%i %i", &width, &height) != 2 ) { + fclose(f); + return false; + } + TCOD_IFNOT ( width > 0 && height > 0) { + fclose(f); + return false; + } + if ( con->w != width || con->h != height ) { + /* resize console */ + if (con->buf) free(con->buf); + if (con->oldbuf) free(con->oldbuf); + con->buf = (char_t *)calloc(sizeof(char_t),width*height); + con->oldbuf = (char_t *)calloc(sizeof(char_t),width*height); + con->w=width; + con->h=height; + } + TCOD_console_read_asc(con,f,width,height,version); + return true; +} + +bool TCOD_console_save_asc(TCOD_console_t pcon, const char *filename) { + static float version = 0.3f; + FILE *f; + int x,y; + TCOD_console_data_t *con=pcon ? (TCOD_console_data_t *)pcon : TCOD_ctx.root; + TCOD_IFNOT(con != NULL) return false; + TCOD_IFNOT( filename != NULL ) { + return false; + } + TCOD_IFNOT(con->w > 0 && con->h > 0) return false; + f=fopen(filename,"wb"); + TCOD_IFNOT( f != NULL ) return false; + fprintf(f, "ASCII-Paint v%g\n", version); + fprintf(f, "%i %i\n", con->w, con->h); + fputc('#', f); + for(x = 0; x < con->w; x++) { + for(y = 0; y < con->h; y++) { + TCOD_color_t fore,back; + int c=TCOD_console_get_char(con,x,y); + fore=TCOD_console_get_char_foreground(con,x,y); + back=TCOD_console_get_char_background(con,x,y); + fputc(c, f); + fputc(fore.r,f); + fputc(fore.g,f); + fputc(fore.b,f); + fputc(back.r,f); + fputc(back.g,f); + fputc(back.b,f); + fputc(0,f); /* solid */ + fputc(1,f); /* walkable */ + } + } + fclose(f); + return true; +} + +static bool hasDetectedBigEndianness = false; +static bool isBigEndian; +void detectBigEndianness(){ + if (!hasDetectedBigEndianness){ + uint32 Value32; + uint8 *VPtr = (uint8 *)&Value32; + VPtr[0] = VPtr[1] = VPtr[2] = 0; VPtr[3] = 1; + if(Value32 == 1) isBigEndian = true; + else isBigEndian = false; + hasDetectedBigEndianness = true; + } +} + +uint16 bswap16(uint16 s){ + uint8* ps = (uint8*)&s; + uint16 res; + uint8* pres = (uint8*)&res; + pres[0] = ps[1]; + pres[1] = ps[0]; + return res; +} + +uint32 bswap32(uint32 s){ + uint8 *ps=(uint8 *)(&s); + uint32 res; + uint8 *pres=(uint8 *)&res; + pres[0]=ps[3]; + pres[1]=ps[2]; + pres[2]=ps[1]; + pres[3]=ps[0]; + return res; +} + +uint16 l16(uint16 s){ + if (isBigEndian) return bswap16(s); else return s; +} + +uint32 l32(uint32 s){ + if (isBigEndian) return bswap32(s); else return s; +} + +/* fix the endianness */ +void fix16(uint16* u){ + *u = l16(*u); +} + +void fix32(uint32* u){ + *u = l32(*u); +} + +/************ RIFF helpers */ + +uint32 fourCC(const char* c){ + return (*(uint32*)c); +} + +/* checks if u equals str */ +bool fourCCequals(uint32 u, const char* str){ + return fourCC(str)==u; +} + +void fromFourCC(uint32 u, char*s){ + const char* c = (const char*)(&u); + s[0]=c[0]; + s[1]=c[1]; + s[2]=c[2]; + s[3]=c[3]; + s[4]=0; +} + +void put8(uint8 d, FILE* fp){ + fwrite(&d,1,1,fp); +} + +void put16(uint16 d, FILE* fp){ + fwrite(&d,2,1,fp); +} + +void put32(uint32 d, FILE* fp){ + fwrite(&d,4,1,fp); +} + +void putFourCC(const char* c, FILE* fp){ + put32(fourCC(c),fp); +} + +void putData(void* what, int length, FILE* fp){ + fwrite(what,length,1,fp); +} + +bool get8(uint8* u, FILE* fp){ + return 1==fread((void*)u, sizeof(uint8),1,fp); +} + +bool get16(uint16* u, FILE* fp){ + return 1==fread((void*)u, sizeof(uint16),1,fp); +} + +bool get32(uint32* u, FILE* fp){ + return 1==fread((void*)u, sizeof(uint32),1,fp); +} + +bool getData(void* u, size_t sz, FILE* fp){ + return 1==fread(u, sz,1,fp); +} + + +/********* APF RIFF structures */ + +typedef struct { + uint32 show_grid; + uint32 grid_width; + uint32 grid_height; +} SettingsDataV1; + +#define FILTER_TYPE_UNCOMPRESSED 0 +#define FORMAT_TYPE_CRGBRGB 0 + +typedef struct { + uint32 width; + uint32 height; + uint32 filter; + uint32 format; +} ImageDetailsV1; + +/* Layers */ + +typedef struct { + uint32 name; + uint32 mode; + uint32 index; + uint32 dataSize; +} LayerV1 ; + +typedef struct { + uint32 name; + uint32 mode; + uint32 fgalpha; + uint32 bgalpha; + uint32 visible; + uint32 index; + uint32 dataSize; +} LayerV2; + +/* fix the endianness */ +void fixSettings(SettingsDataV1* s){ + fix32(&s->show_grid); + fix32(&s->grid_width); + fix32(&s->grid_height); +} + +void fixImage(ImageDetailsV1* v){ + fix32(&v->width); + fix32(&v->height); + fix32(&v->filter); + fix32(&v->format); +} + +void fixLayerv1(LayerV1* l){ + fix32(&l->mode); + fix32(&l->index); + fix32(&l->dataSize); +} + +void fixLayerv2(LayerV2* l){ + fix32(&l->mode); + fix32(&l->fgalpha); + fix32(&l->bgalpha); + fix32(&l->visible); + fix32(&l->index); + fix32(&l->dataSize); +} + + +/*********** ApfFile */ + +bool TCOD_console_save_apf(TCOD_console_t pcon, const char *filename) { + TCOD_console_data_t *con=pcon ? (TCOD_console_data_t *)pcon : TCOD_ctx.root; + FILE* fp ; + TCOD_IFNOT(con != NULL) return false; + detectBigEndianness(); + + fp = fopen(filename, "wb"); + if(fp == NULL) { + return false; + } + else { + int x,y; + uint32 riffSize = 0; + uint32 imgDetailsSize ; + SettingsDataV1 settingsData; + ImageDetailsV1 imgData; + fpos_t posRiffSize; + uint32 settingsSz ; + uint32 layerImageSize ; + uint32 layerChunkSize ; + /* riff header*/ + putFourCC("RIFF",fp); + fgetpos(fp,&posRiffSize); + put32(0,fp); + + /* APF_ header */ + putFourCC("apf ",fp); + riffSize += 4; + + /* settings */ + settingsData.show_grid = 0; + settingsData.grid_width = 8; + settingsData.grid_height = 8; + settingsSz = sizeof(uint32) + sizeof settingsData; + putFourCC("sett",fp); + put32(l32(settingsSz),fp); + put32(l32(1),fp); + putData((void*)&settingsData,sizeof settingsData,fp); + if (settingsSz&1){ + put8(0,fp); + riffSize++; + } + riffSize += 4+4+settingsSz; + + /* image details */ + imgData.width = con->w; + imgData.height = con->h; + imgData.filter = 0; + imgData.format = 0; + imgDetailsSize = sizeof(uint32) + sizeof imgData; + putFourCC("imgd",fp); + put32(l32(imgDetailsSize),fp); + put32(l32(1),fp); + putData((void*)&imgData,sizeof imgData,fp); + if (imgDetailsSize&1){ + put8(0,fp); + riffSize++; + } + riffSize += 4+4+imgDetailsSize; + + /* now write the layers as a RIFF list + the first layer is the lowest layer + Assume imgData filter = uncompressed, and imgData format = CRGB */ + layerImageSize = imgData.width*imgData.height*7; + layerChunkSize = sizeof(uint32) /* version */ + + sizeof(LayerV2) /* header */ + + layerImageSize; /* data */ + + putFourCC("layr",fp); /* layer */ + put32(l32(layerChunkSize),fp); + /* VERSION -> */ + put32(l32(2),fp); + /* Data */ + putFourCC("LAY0",fp); + put32(l32(0),fp); + put32(l32(255),fp); + put32(l32(255),fp); + put32(l32(1),fp); + put32(l32(0),fp); + put32(l32(layerImageSize),fp); + + /* now write out the data */ + + for(x = 0; x < con->w; x++) { + for(y = 0; y < con->h; y++) { + TCOD_color_t fore,back; + int c=TCOD_console_get_char(con,x,y); + fore=TCOD_console_get_char_foreground(con,x,y); + back=TCOD_console_get_char_background(con,x,y); + put8(c, fp); + put8(fore.r,fp); + put8(fore.g,fp); + put8(fore.b,fp); + put8(back.r,fp); + put8(back.g,fp); + put8(back.b,fp); + } + } + + if (layerChunkSize&1){ + put8(0,fp); /* padding bit */ + riffSize++; + } + + riffSize += 2*sizeof(uint32)+layerChunkSize; + + fsetpos(fp,&posRiffSize); + put32(l32(riffSize),fp); + } + + fclose(fp); + return true; +} + +typedef struct { + LayerV1 headerv1; + LayerV2 headerv2; + uint8* data; /* dynamically allocated */ +} LayerData; + +typedef struct { + ImageDetailsV1 details; + SettingsDataV1 settings; + LayerData layer; +} Data; + +bool TCOD_console_load_apf(TCOD_console_t pcon, const char *filename) { + uint32 sett = fourCC("sett"); + uint32 imgd = fourCC("imgd"); + /* + uint32 LIST = fourCC("LIST"); + uint32 LAYR = fourCC("LAYR"); + */ + uint32 layr = fourCC("layr"); + FILE* fp ; + Data data; + TCOD_console_data_t *con=pcon ? (TCOD_console_data_t *)pcon : TCOD_ctx.root; + TCOD_IFNOT(con != NULL) return false; + + detectBigEndianness(); + data.details.width = 1; + data.details.height = 1; + data.details.filter = 0; + data.details.format = 0; + + data.settings.show_grid = true; + data.settings.grid_width = 10; + data.settings.grid_height = 10; + + #define ERR(x) {printf("Error: %s\n. Aborting operation.",x); return false;} + #define ERR_NEWER(x) {printf("Error: It looks like this file was made with a newer version of Ascii-Paint\n. In particular the %s field. Aborting operation.",x); return false;} + + fp = fopen(filename, "rb"); + if(fp == NULL) { + printf("The file %s could not be loaded.\n", filename); + return false; + } + else { + /* read the header */ + uint32 riff; + uint32 riffSize; + int index = 0; + int x,y; + uint8 *imgData; + bool keepGoing = true; + if (! get32(&riff,fp) || ! fourCCequals(riff,"RIFF")){ + ERR("File doesn't have a RIFF header"); + } + if (!get32(&riffSize,fp)) ERR("No RIFF size field!"); + fix32(&riffSize); + + while(keepGoing && fp){ /* for each subfield, try to find the APF_ field */ + uint32 apf; + if (! get32(&apf,fp)) break; + if (fourCCequals(apf,"apf ") || fourCCequals(apf,"APF ")){ + /* Process APF segment */ + while(keepGoing && fp){ + uint32 seg; + if (! get32(&seg,fp)){ + keepGoing = false; + break; + } + else { + if (seg==sett){ + /* size */ + uint32 sz; + uint32 ver; + SettingsDataV1 settingsData; + + get32(&sz,fp); + fix32(&sz); + /* version */ + get32(&ver,fp); + fix32(&ver); + if (ver!=1) ERR_NEWER("settings"); + /* ver must be 1 */ + if (! getData((void*)&settingsData,sizeof settingsData,fp)) ERR("Can't read settings."); + data.settings = settingsData; + fixSettings(&data.settings); + + } + else if (seg==imgd){ + /* sz */ + uint32 sz; + uint32 ver; + ImageDetailsV1 dets; + + get32(&sz,fp); + fix32(&sz); + /* version */ + get32(&ver,fp); + fix32(&ver); + if (ver!=1) ERR_NEWER("image details"); + /* ver must be 1 */ + if (! getData((void*)&dets, sizeof dets, fp)) ERR("Can't read image details."); + data.details = dets; + fixImage(&data.details); + + /* get canvas ready */ + TCOD_IFNOT ( data.details.width > 0 && data.details.height > 0) { + fclose(fp); + return false; + } + if ( con->w != data.details.width || con->h != data.details.height ) { + /* resize console */ + if (con->buf) free(con->buf); + if (con->oldbuf) free(con->oldbuf); + con->buf = (char_t *)calloc(sizeof(char_t),data.details.width*data.details.height); + + con->oldbuf = (char_t *)calloc(sizeof(char_t),data.details.width*data.details.height); + con->w=data.details.width; + con->h=data.details.height; + } + + } + else if (seg==layr){ + uint32 sz; + uint32 ver; + + get32(&sz,fp); + fix32(&sz); + /* version */ + get32(&ver,fp); + fix32(&ver); + if (ver>2) ERR_NEWER("layer spec"); + + if (ver==1){ + if (! getData((void*)&data.layer.headerv1, sizeof( LayerV1 ), fp)) ERR("Can't read layer header."); + fixLayerv1(&data.layer.headerv1); + + /* Read in the data chunk*/ + data.layer.data = (uint8*)malloc(sizeof(uint8)*data.layer.headerv1.dataSize); + getData((void*) data.layer.data, data.layer.headerv1.dataSize, fp); + } + else if (ver==2){ + if (! getData((void*)&data.layer.headerv2, sizeof( LayerV2 ), fp)) ERR("Can't read layer header."); + fixLayerv2(&data.layer.headerv2); + + /* Read in the data chunk */ + data.layer.data = (uint8*)malloc(sizeof(uint8)*data.layer.headerv2.dataSize); + getData((void*) data.layer.data, data.layer.headerv2.dataSize, fp); + + } + } + else { + /* skip unknown segment */ + uint32 sz; + get32(&sz,fp); + fix32(&sz); + fseek(fp,sz,SEEK_CUR); + } + } + } + + /* we're done! */ + keepGoing = false; + } + else { + /* skip this segment */ + uint32 sz; + get32(&sz,fp); + fseek(fp,sz,SEEK_CUR); + } + } + + imgData = data.layer.data; + for(x = 0; x < con->w; x++) { + for(y = 0; y < con->h; y++) { + TCOD_color_t fore,back; + int c = (unsigned char)(imgData[index++]); + fore.r = (uint8)(imgData[index++]); + fore.g = (uint8)(imgData[index++]); + fore.b = (uint8)(imgData[index++]); + back.r = (uint8)(imgData[index++]); + back.g = (uint8)(imgData[index++]); + back.b = (uint8)(imgData[index++]); + TCOD_console_put_char_ex(con,x,y,c,fore,back); + } + } + + free (data.layer.data); + } + fclose(fp); + + return true; +} +/* + +bool ApfFile::Load(std::string filename){ + detectBigEndianness(); + + uint32 sett = fourCC("sett"); + uint32 imgd = fourCC("imgd"); + uint32 LIST = fourCC("LIST"); + uint32 LAYR = fourCC("LAYR"); + uint32 layr = fourCC("layr"); + + Data data; // File data + + data.details.width = 1; + data.details.height = 1; + data.details.filter = FILTER_TYPE_UNCOMPRESSED; + data.details.format = FORMAT_TYPE_CRGBRGB; + + data.settings.show_grid = true; + data.settings.grid_width = 10; + data.settings.grid_height = 10; + + data.currentLayer = NULL; + + #define ERR(x) {printf("Error: %s\n. Aborting operation.",x); return false;} + #define ERR_NEWER(x) {printf("Error: It looks like this file was made with a newer version of Ascii-Paint\n. In particular the %s field. Aborting operation.",x); return false;} + + FILE* fp = fopen(filename.c_str(), "rb"); + if(fp == NULL) { + printf("The file %s could not be loaded.\n", filename.c_str()); + return false; + } + else { + // read the header + uint32 riff; + if (not get32(&riff,fp) + or + not fourCCequals(riff,"RIFF")){ + ERR("File doesn't have a RIFF header"); + } + // else + uint32 riffSize; + if (!get32(&riffSize,fp)) ERR("No RIFF size field!"); + fix(&riffSize); + + bool keepGoing = true; + while(keepGoing and fp){ // for each subfield, try to find the APF_ field + uint32 apf; + if (not get32(&apf,fp)) break; + if (fourCCequals(apf,"apf ") or fourCCequals(apf,"APF ")){ + // Process APF segment + while(keepGoing and fp){ + uint32 seg; + if (not get32(&seg,fp)){ + keepGoing = false; + break; + } + else { + if (seg==sett){ + // size + uint32 sz; + get32(&sz,fp); + fix(&sz); + // version + uint32 ver; + get32(&ver,fp); + fix(&ver); + if (ver!=1) ERR_NEWER("settings"); + // ver must be 1 + SettingsDataV1 settingsData; + if (not getData((void*)&settingsData,sizeof settingsData,fp)) ERR("Can't read settings."); + data.settings = settingsData; + fix(&data.settings); + + // Change app settings + app->setGridDimensions(data.settings.grid_width,data.settings.grid_height); + app->setShowGrid(data.settings.show_grid==1); + } + else if (seg==imgd){ + // sz + uint32 sz; + get32(&sz,fp); + fix(&sz); + // version + uint32 ver; + get32(&ver,fp); + fix(&ver); + if (ver!=1) ERR_NEWER("image details"); + // ver must be 1 + ImageDetailsV1 dets; + if (not getData((void*)&dets, sizeof dets, fp)) ERR("Can't read image details."); + data.details = dets; + fix(&data.details); + + // get canvas ready + app->canvasWidth = data.details.width; + app->canvasHeight = data.details.height; + app->initCanvas(); + + // delete new layer + app->deleteLayer(app->getCurrentLayer()->name); + + } + else if (seg==layr){ + // printf("Found a layer\n"); + + // sz + uint32 sz; + get32(&sz,fp); + fix(&sz); + // version + uint32 ver; + get32(&ver,fp); + fix(&ver); + if (ver>2) ERR_NEWER("layer spec"); + + if (ver==1){ + LayerV1 layerHeader; + if (not getData((void*)&layerHeader, sizeof layerHeader, fp)) ERR("Can't read layer header."); + fix(&layerHeader); + + // creat new layer data + LayerData* ld = new LayerData; + ld->header = layerHeader; // already fix'd + ld->data = new uint8[ld->header.dataSize]; + + // Read in the data chunk + getData((void*) ld->data, ld->header.dataSize, fp); + + // push layer onto the list + data.currentLayer = ld; + data.layers.push(ld); + } + else if (ver==2){ + LayerV2 layerHeader; + if (not getData((void*)&layerHeader, sizeof layerHeader, fp)) ERR("Can't read layer header."); + fix(&layerHeader); + + // creat new layer data + LayerData* ld = new LayerData; + ld->header = layerHeader; // already fix'd + ld->data = new uint8[ld->header.dataSize]; + + // Read in the data chunk + getData((void*) ld->data, ld->header.dataSize, fp); + + // push layer onto the list + data.currentLayer = ld; + data.layers.push(ld); + } + } + else { + // skip unknown segment + uint32 sz; + get32(&sz,fp); + fix(&sz); + fseek(fp,sz,SEEK_CUR); + } + } + } + + // we're done! + keepGoing = false; + } + else { + // skip this segment + uint32 sz; + get32(&sz,fp); + fseek(fp,sz,SEEK_CUR); + } + } + + // finally, copy the layers into the current document + for(int i=0;iaddNewLayer(); + + // Parse layer header + l->name = fromFourCC(ld->header.name); + l->fgalpha = ld->header.fgalpha; + l->bgalpha = ld->header.bgalpha; + l->visible = (ld->header.visible==1); + // l->compositingMode = + + // Copy data into currently selected canvas + uint8* imgData = ld->data; + CanvasImage *img = new CanvasImage; + // Write the brush data for every brush in the image + int index = 0; + for(int x = 0; x < app->canvasWidth; x++) { + for(int y = 0; y < app->canvasHeight; y++) { + Brush b; + b.symbol = (unsigned char)(imgData[index++]); + b.fore.r = (uint8)(imgData[index++]); + b.fore.g = (uint8)(imgData[index++]); + b.fore.b = (uint8)(imgData[index++]); + b.back.r = (uint8)(imgData[index++]); + b.back.g = (uint8)(imgData[index++]); + b.back.b = (uint8)(imgData[index++]); + b.solid = true; // deprecated + b.walkable = true; // deprecated + img->push_back(b); + } + } + + app->setCanvasImage(*img); + delete img; + } + + // then free all the temporary layer data + for(int i=0;idata; + delete data.layers.get(i); + } + + // and update the layer widget + app->gui->layerWidget->regenerateLayerList(); + } + fclose(fp); + + return true; +} +*/ diff --git a/tcod/tcod_sys/libtcod/src/fov.cpp b/tcod/tcod_sys/libtcod/src/fov.cpp new file mode 100644 index 00000000..87824bc4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov.cpp @@ -0,0 +1,78 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +TCODMap::TCODMap(int width,int height) { + data = TCOD_map_new(width,height); +} + +void TCODMap::clear(bool transparent, bool walkable) { + TCOD_map_clear(data,transparent,walkable); +} + +void TCODMap::setProperties(int x, int y, bool isTransparent, bool isWalkable) { + TCOD_map_set_properties(data,x,y,isTransparent,isWalkable); +} + +void TCODMap::copy(const TCODMap *source) { + TCOD_map_copy(source->data,data); +} + +void TCODMap::computeFov(int x, int y, int maxRadius, bool light_walls, TCOD_fov_algorithm_t algo) { + TCOD_map_compute_fov(data,x,y,maxRadius,light_walls, algo); +} + +bool TCODMap::isInFov(int x, int y) const { + return TCOD_map_is_in_fov(data,x,y) != 0; +} + +void TCODMap::setInFov(int x,int y, bool fov) { + TCOD_map_set_in_fov(data, x, y, fov); +} + +bool TCODMap::isTransparent(int x, int y) const { + return TCOD_map_is_transparent(data,x,y) != 0; +} + +bool TCODMap::isWalkable(int x, int y) const { + return TCOD_map_is_walkable(data,x,y) != 0; +} + +int TCODMap::getWidth() const { + return TCOD_map_get_width(data); +} + +int TCODMap::getHeight() const { + return TCOD_map_get_height(data); +} + +int TCODMap::getNbCells() const { + return TCOD_map_get_nb_cells(data); +} + +TCODMap::~TCODMap() { + TCOD_map_delete(data); +} diff --git a/tcod/tcod_sys/libtcod/src/fov_c.c b/tcod/tcod_sys/libtcod/src/fov_c.c new file mode 100644 index 00000000..fcbb3a33 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov_c.c @@ -0,0 +1,149 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include "libtcod.h" +#include "libtcod_int.h" +#include + +TCOD_map_t TCOD_map_new(int width, int height) { + map_t *map=NULL; + TCOD_IFNOT(width > 0 && height > 0) return NULL; + map=(map_t *)calloc(sizeof(map_t),1); + map->width=width; + map->height=height; + map->nbcells=width*height; + map->cells=(cell_t *)calloc(sizeof(cell_t),map->nbcells); + return map; +} + +void TCOD_map_copy(TCOD_map_t source, TCOD_map_t dest) { + map_t *source_int = (map_t *)source; + map_t *dest_int = (map_t *)dest; + TCOD_IFNOT(source != NULL && dest != NULL) return; + if ( dest_int->nbcells != source_int->nbcells ) { + free(dest_int->cells); + dest_int->cells=(cell_t *)malloc(sizeof(cell_t)*dest_int->nbcells); + } + dest_int->width=source_int->width; + dest_int->height=source_int->height; + dest_int->nbcells=source_int->nbcells; + memcpy(dest_int->cells, source_int->cells, sizeof(cell_t) * source_int->nbcells); +} + +void TCOD_map_clear(TCOD_map_t map, bool transparent, bool walkable) { + int i; + map_t *m = (map_t *)map; + cell_t *cell; + TCOD_IFNOT(map != NULL) return; + cell=m->cells; + for (i = 0; i < m->nbcells; i++) { + cell->transparent = transparent; + cell->walkable = walkable; + cell->fov = 0; + cell++; + } +} + +void TCOD_map_set_properties(TCOD_map_t map, int x, int y, bool is_transparent, bool is_walkable) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL) return; + TCOD_IFNOT((unsigned)x < (unsigned)m->width && (unsigned)y < (unsigned)m->height) return; + m->cells[x+y*m->width].transparent=is_transparent; + m->cells[x+y*m->width].walkable=is_walkable; +} + +void TCOD_map_delete(TCOD_map_t map) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL) return; + free(m->cells); + free(m); +} + +void TCOD_map_compute_fov(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls, TCOD_fov_algorithm_t algo) { + TCOD_IFNOT(map != NULL) return; + switch(algo) { + case FOV_BASIC : TCOD_map_compute_fov_circular_raycasting(map,player_x,player_y,max_radius,light_walls); break; + case FOV_DIAMOND : TCOD_map_compute_fov_diamond_raycasting(map,player_x,player_y,max_radius,light_walls); break; + case FOV_SHADOW : TCOD_map_compute_fov_recursive_shadowcasting(map,player_x,player_y,max_radius,light_walls); break; + case FOV_PERMISSIVE_0 : + case FOV_PERMISSIVE_1 : + case FOV_PERMISSIVE_2 : + case FOV_PERMISSIVE_3 : + case FOV_PERMISSIVE_4 : + case FOV_PERMISSIVE_5 : + case FOV_PERMISSIVE_6 : + case FOV_PERMISSIVE_7 : + case FOV_PERMISSIVE_8 : + TCOD_map_compute_fov_permissive2(map,player_x,player_y,max_radius,light_walls, algo-FOV_PERMISSIVE_0); + break; + case FOV_RESTRICTIVE : TCOD_map_compute_fov_restrictive_shadowcasting(map,player_x,player_y,max_radius,light_walls); break; + default:break; + } +} + +bool TCOD_map_is_in_fov(TCOD_map_t map, int x, int y) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL && (unsigned)x < (unsigned)m->width && (unsigned)y < (unsigned)m->height) return false; + return m->cells[x+y*m->width].fov == 1; +} + +void TCOD_map_set_in_fov(TCOD_map_t map, int x, int y, bool fov) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL && (unsigned)x < (unsigned)m->width && (unsigned)y < (unsigned)m->height) return; + m->cells[x+y*m->width].fov = fov ? 1:0; +} + +bool TCOD_map_is_transparent(TCOD_map_t map, int x, int y) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL && (unsigned)x < (unsigned)m->width && (unsigned)y < (unsigned)m->height) return false; + return m->cells[x+y*m->width].transparent; +} + +bool TCOD_map_is_walkable(TCOD_map_t map, int x, int y) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL && (unsigned)x < (unsigned)m->width && (unsigned)y < (unsigned)m->height) return false; + return m->cells[x+y*m->width].walkable; +} +int TCOD_map_get_width(TCOD_map_t map) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL) return 0; + return m->width; +} + +int TCOD_map_get_height(TCOD_map_t map) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL) return 0; + return m->height; +} + +int TCOD_map_get_nb_cells(TCOD_map_t map) { + map_t *m = (map_t *)map; + TCOD_IFNOT(map != NULL) return 0; + return m->nbcells; +} + diff --git a/tcod/tcod_sys/libtcod/src/fov_circular_raycasting.c b/tcod/tcod_sys/libtcod/src/fov_circular_raycasting.c new file mode 100644 index 00000000..59643bc0 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov_circular_raycasting.c @@ -0,0 +1,236 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "libtcod.h" +#include "libtcod_int.h" +#include +#include +#include + +static void cast_ray(map_t *map, int xo, int yo, int xd, int yd, int r2,bool light_walls) { + int curx=xo,cury=yo; + bool in=false; + bool blocked=false; + bool end=false; + int offset; + TCOD_line_init(xo,yo,xd,yd); + offset=curx+cury*map->width; + if ( 0 <= offset && offset < map->nbcells ) { + in=true; + map->cells[offset].fov=1; + } + while (!end) { + end = TCOD_line_step(&curx,&cury); /* reached xd,yd */ + offset=curx+cury*map->width; + if ( r2 > 0 ) { + /* check radius */ + int cur_radius=(curx-xo)*(curx-xo)+(cury-yo)*(cury-yo); + if ( cur_radius > r2 ) return; + } + if ( 0 <= offset && offset < map->nbcells ) { + in=true; + if ( !blocked && ! map->cells[offset].transparent ) { + blocked=true; + } else if ( blocked ) { + return; /* wall */ + } + if ( light_walls || ! blocked ) map->cells[offset].fov=1; + } else if (in) return; /* ray out of map */ + } +} + +void TCOD_map_postproc(map_t *map,int x0,int y0, int x1, int y1, int dx, int dy) { + int cx,cy; + for (cx=x0; cx <= x1; cx++) { + for (cy=y0;cy <= y1; cy ++ ) { + int x2 = cx+dx; + int y2 = cy+dy; + unsigned int offset=cx+cy*map->width; + if ( offset < (unsigned)map->nbcells && map->cells[offset].fov == 1 + && map->cells[offset].transparent ) { + if ( x2 >= x0 && x2 <= x1 ) { + unsigned int offset2=x2+cy*map->width; + if ( offset2 < (unsigned)map->nbcells && ! map->cells[offset2].transparent ) + map->cells[offset2].fov=1; + } + if ( y2 >= y0 && y2 <= y1 ) { + unsigned int offset2=cx+y2*map->width; + if ( offset2 < (unsigned)map->nbcells && ! map->cells[offset2].transparent ) + map->cells[offset2].fov=1; + } + if ( x2 >= x0 && x2 <= x1 && y2 >= y0 && y2 <= y1 ) { + unsigned int offset2=x2+y2*map->width; + if ( offset2 < (unsigned)map->nbcells && ! map->cells[offset2].transparent ) + map->cells[offset2].fov=1; + } + } + } + } +} + + +void TCOD_map_compute_fov_circular_raycastingi(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls) { + int xo,yo; + map_t *m = (map_t *)map; + /* circular ray casting */ + int xmin=0, ymin=0, xmax=m->width, ymax=m->height; + int c; + int r2=max_radius*max_radius; + if ( max_radius > 0 ) { + xmin=MAX(0,player_x-max_radius); + ymin=MAX(0,player_y-max_radius); + xmax=MIN(m->width,player_x+max_radius+1); + ymax=MIN(m->height,player_y+max_radius+1); + } + for (c=m->nbcells-1; c >= 0; c--) { + m->cells[c].fov=0; + } + xo=xmin; yo=ymin; + while ( xo < xmax ) { + cast_ray(m,player_x,player_y,xo++,yo,r2,light_walls); + } + xo=xmax-1;yo=ymin+1; + while ( yo < ymax ) { + cast_ray(m,player_x,player_y,xo,yo++,r2,light_walls); + } + xo=xmax-2;yo=ymax-1; + while ( xo >= 0 ) { + cast_ray(m,player_x,player_y,xo--,yo,r2,light_walls); + } + xo=xmin;yo=ymax-2; + while ( yo > 0 ) { + cast_ray(m,player_x,player_y,xo,yo--,r2,light_walls); + } + if ( light_walls ) { + /* post-processing artefact fix */ + TCOD_map_postproc(m,xmin,ymin,player_x,player_y,-1,-1); + TCOD_map_postproc(m,player_x,ymin,xmax-1,player_y,1,-1); + TCOD_map_postproc(m,xmin,player_y,player_x,ymax-1,-1,1); + TCOD_map_postproc(m,player_x,player_y,xmax-1,ymax-1,1,1); + } +} + +#if 0 +#define CELL_RADIUS 0.4f +#define RAY_RADIUS 0.2f +static bool ray_blocked(map_t *map,float x, float y, int cx, int cy) { + int offset=cx+cy*map->width; + float d; + if ( (unsigned)offset >= (unsigned)map->nbcells ) return false; /* out of the map */ + if ( map->cells[offset].transparent ) return false; /* empty cell */ + d=(cx-x+0.5f)*(cx-x+0.5f)+(cy-y+0.5f)*(cy-y+0.5f); + return d < (CELL_RADIUS+RAY_RADIUS)*(CELL_RADIUS+RAY_RADIUS); +} +static void cast_rayf(map_t *map, int xo, int yo, int xd, int yd, int r2,bool light_walls) { + float fxo=xo+0.5f, fyo=yo+0.5f; + float curx=fxo, cury=fyo; + float fxd=xd+0.5f; + float fyd=yd+0.5f; + bool in=false; + bool end=false; + int offset; + float dx=(float)(fxd-curx), dy=(float)(fyd-cury),idx,idy; + if ( dx == 0 && dy == 0 ) return; + if ( fabs(dx) > fabs(dy) ) { + idy = (float)(dy/fabs(dx)); + idx = (float)(dx/fabs(dx)); + } else { + idx = (float)(dx/fabs(dy)); + idy = (float)(dy/fabs(dy)); + } + offset=(int)(curx)+(int)(cury)*map->width; + if ( (unsigned)offset < (unsigned)map->nbcells ) { + in=true; + map->cells[offset].fov=1; + } + while (!end) { + int cx,cy; + curx+=idx; + cury+=idy; + cx=(int)curx; + cy=(int)cury; + end = (cx==xd && cy==yd); + offset=cx+cy*map->width; + if ( r2 > 0 ) { + /* check radius */ + int cur_radius=(int)((curx-fxo)*(curx-fxo)+(cury-fyo)*(cury-fyo)); + if ( cur_radius > r2 ) return; + } + if ( (unsigned)offset < (unsigned)map->nbcells ) { + in=true; + if ( ray_blocked(map,curx,cury,cx,cy) ) return; + if ( curx+RAY_RADIUS > cx+0.5f-CELL_RADIUS && ray_blocked(map,curx,cury,cx+1,cy) ) return; + if ( curx-RAY_RADIUS < cx-0.5f+CELL_RADIUS && ray_blocked(map,curx,cury,cx-1,cy) ) return; + if ( cury+RAY_RADIUS > cy+0.5f-CELL_RADIUS && ray_blocked(map,curx,cury,cx,cy+1) ) return; + if ( cury-RAY_RADIUS < cy-0.5f+CELL_RADIUS && ray_blocked(map,curx,cury,cx,cy-1) ) return; + map->cells[offset].fov=1; + } else if (in) return; /* ray out of map */ + } +} +#endif + +void TCOD_map_compute_fov_circular_raycasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls) { + int xo,yo; + map_t *m = (map_t *)map; + /* circular ray casting */ + int xmin=0, ymin=0, xmax=m->width, ymax=m->height; + int c; + int r2=max_radius*max_radius; + if ( max_radius > 0 ) { + xmin=MAX(0,player_x-max_radius); + ymin=MAX(0,player_y-max_radius); + xmax=MIN(m->width,player_x+max_radius+1); + ymax=MIN(m->height,player_y+max_radius+1); + } + for (c=m->nbcells-1; c >= 0; c--) { + m->cells[c].fov=0; + } + xo=xmin; yo=ymin; + while ( xo < xmax ) { + cast_ray(m,player_x,player_y,xo++,yo,r2,light_walls); + } + xo=xmax-1;yo=ymin+1; + while ( yo < ymax ) { + cast_ray(m,player_x,player_y,xo,yo++,r2,light_walls); + } + xo=xmax-2;yo=ymax-1; + while ( xo >= 0 ) { + cast_ray(m,player_x,player_y,xo--,yo,r2,light_walls); + } + xo=xmin;yo=ymax-2; + while ( yo > 0 ) { + cast_ray(m,player_x,player_y,xo,yo--,r2,light_walls); + } + if ( light_walls ) { + /* post-processing artefact fix */ + TCOD_map_postproc(m,xmin,ymin,player_x,player_y,-1,-1); + TCOD_map_postproc(m,player_x,ymin,xmax-1,player_y,1,-1); + TCOD_map_postproc(m,xmin,player_y,player_x,ymax-1,-1,1); + TCOD_map_postproc(m,player_x,player_y,xmax-1,ymax-1,1,1); + } +} + diff --git a/tcod/tcod_sys/libtcod/src/fov_diamond_raycasting.c b/tcod/tcod_sys/libtcod/src/fov_diamond_raycasting.c new file mode 100644 index 00000000..21732cd3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov_diamond_raycasting.c @@ -0,0 +1,204 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include "libtcod.h" +#include "libtcod_int.h" +#include + +typedef struct _ray_data_t { + int xloc,yloc; /* position */ + int xob,yob; /* obscurity vector */ + int xerr,yerr; /* bresenham error */ + struct _ray_data_t * xinput, * yinput; /* offset of input rays */ + bool added; /* already in the fov */ + bool ignore; /* non visible. don't bother processing it */ +} ray_data_t; + +static int origx,origy; /* fov origin */ +static ray_data_t **raymap; /* result rays */ +static ray_data_t *raymap2; /* temporary rays */ +static int perimidx; + +static ray_data_t *new_ray(map_t *m,int x, int y) { + ray_data_t *r; + if ( (unsigned) (x+origx) >= (unsigned)m->width ) return NULL; + if ( (unsigned) (y+origy) >= (unsigned)m->height ) return NULL; + r=&raymap2[ x+origx + (y+origy)*m->width ]; + r->xloc=x; + r->yloc=y; + return r; +} + +static void processRay(map_t *m, TCOD_list_t perim, ray_data_t *new_ray, ray_data_t *input_ray) { + if ( new_ray ) { + int mapx=origx+new_ray->xloc; + int mapy=origy+new_ray->yloc; + int newrayidx; + newrayidx=mapx+mapy*m->width; + if ( new_ray->yloc == input_ray->yloc ) new_ray->xinput=input_ray; + else new_ray->yinput=input_ray; + if (! new_ray->added) { + TCOD_list_push(perim,new_ray); + new_ray->added=true; + raymap[newrayidx] = new_ray; + } + } +} + +#define IS_OBSCURE(r) ((r->xerr > 0 && r->xerr <= r->xob) || (r->yerr > 0 && r->yerr <= r->yob) ) + +static void process_x_input(ray_data_t *new_ray, ray_data_t *xinput) { + if ( xinput->xob == 0 && xinput->yob == 0 ) return; + if ( xinput->xerr > 0 && new_ray->xob == 0) { + new_ray->xerr = xinput->xerr - xinput->yob; + new_ray->yerr = xinput->yerr + xinput->yob; + new_ray->xob=xinput->xob; + new_ray->yob=xinput->yob; + } + if ( xinput->yerr <= 0 && xinput->yob > 0 && xinput->xerr > 0) { + new_ray->yerr = xinput->yerr + xinput->yob; + new_ray->xerr = xinput->xerr - xinput->yob; + new_ray->xob=xinput->xob; + new_ray->yob=xinput->yob; + } +} + +static void process_y_input(ray_data_t *new_ray, ray_data_t *yinput) { + if ( yinput->xob == 0 && yinput->yob == 0 ) return; + if ( yinput->yerr > 0 && new_ray->yob == 0) { + new_ray->yerr = yinput->yerr - yinput->xob; + new_ray->xerr = yinput->xerr + yinput->xob; + new_ray->xob=yinput->xob; + new_ray->yob=yinput->yob; + } + if ( yinput->xerr <= 0 && yinput->xob > 0 && yinput->yerr > 0) { + new_ray->yerr = yinput->yerr - yinput->xob; + new_ray->xerr = yinput->xerr + yinput->xob; + new_ray->xob=yinput->xob; + new_ray->yob=yinput->yob; + } +} + +static void merge_input(map_t *m, ray_data_t *r) { + int rayidx=r->xloc+origx+(r->yloc+origy)*m->width; + ray_data_t *xi=r->xinput; + ray_data_t *yi=r->yinput; + if ( xi ) process_x_input(r,xi); + if ( yi ) process_y_input(r,yi); + if ( ! xi ) { + if ( IS_OBSCURE(yi) ) r->ignore=true; + } else if ( ! yi ) { + if ( IS_OBSCURE(xi) ) r->ignore=true; + } else if ( IS_OBSCURE(xi) && IS_OBSCURE(yi) ) { + r->ignore=true; + } + if (! r->ignore && !m->cells[rayidx].transparent) { + r->xerr = r->xob = ABS(r->xloc); + r->yerr = r->yob = ABS(r->yloc); + } +} + +static void expandPerimeterFrom(map_t *m,TCOD_list_t perim,ray_data_t *r) { + if ( r->xloc >= 0 ) { + processRay(m,perim,new_ray(m,r->xloc+1,r->yloc),r); + } + if ( r->xloc <= 0 ) { + processRay(m,perim,new_ray(m,r->xloc-1,r->yloc),r); + } + if ( r->yloc >= 0 ) { + processRay(m,perim,new_ray(m,r->xloc,r->yloc+1),r); + } + if ( r->yloc <= 0 ) { + processRay(m,perim,new_ray(m,r->xloc,r->yloc-1),r); + } +} + + +void TCOD_map_compute_fov_diamond_raycasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls) { + map_t *m = (map_t *)map; + TCOD_list_t perim=TCOD_list_allocate(m->nbcells); + cell_t *c; + ray_data_t **r; + int nbcells; + int r2=max_radius*max_radius; + + perimidx=0; + raymap=(ray_data_t **)calloc(sizeof(ray_data_t*),m->nbcells); + raymap2=(ray_data_t *)calloc(sizeof(ray_data_t),m->nbcells); + origx=player_x; + origy=player_y; + expandPerimeterFrom(m,perim,new_ray(m,0,0)); + while ( perimidx < TCOD_list_size(perim) ) { + ray_data_t *ray=(ray_data_t *)TCOD_list_get(perim,perimidx); + int distance = 0; + if ( r2 > 0 ) distance = ((ray->xloc * ray->xloc) + (ray->yloc * ray->yloc)); + perimidx++; + if ( distance <= r2) { + merge_input(m, ray); + if ( !ray->ignore ) expandPerimeterFrom(m,perim,ray); + } else ray->ignore=true; + } + + /* set fov data */ + c=m->cells; + r=raymap; + nbcells=m->nbcells; + while ( nbcells!= 0 ) { + if ( *r == NULL || (*r)->ignore + || ((*r)->xerr > 0 && (*r)->xerr <= (*r)->xob ) + || ((*r)->yerr > 0 && (*r)->yerr <= (*r)->yob ) + ) { + c->fov=0; + } else { + c->fov=1; + } + c++; + r++; + nbcells--; + } + m->cells[origx+origy*m->width].fov=1; + + /* light walls */ + if ( light_walls ) { + int xmin=0, ymin=0, xmax=m->width, ymax=m->height; + if ( max_radius > 0 ) { + xmin=MAX(0,player_x-max_radius); + ymin=MAX(0,player_y-max_radius); + xmax=MIN(m->width,player_x+max_radius+1); + ymax=MIN(m->height,player_y+max_radius+1); + } + TCOD_map_postproc(m,xmin,ymin,player_x,player_y,-1,-1); + TCOD_map_postproc(m,player_x,ymin,xmax-1,player_y,1,-1); + TCOD_map_postproc(m,xmin,player_y,player_x,ymax-1,-1,1); + TCOD_map_postproc(m,player_x,player_y,xmax-1,ymax-1,1,1); + } + + free(raymap); + free(raymap2); + TCOD_list_delete(perim); +} diff --git a/tcod/tcod_sys/libtcod/src/fov_permissive2.c b/tcod/tcod_sys/libtcod/src/fov_permissive2.c new file mode 100644 index 00000000..8611b05a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov_permissive2.c @@ -0,0 +1,254 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +/* The size of each square in units */ +#define STEP_SIZE 16 + +/* Jonathon Duerig enhanced permissive FOV */ +typedef struct { + int xi,yi,xf,yf; +} line_t; + +/* Defines the parameters of the permissiveness */ +/* Derived values defining the actual part of the square used as a range. */ +static int offset; +static int limit; + +typedef struct _viewbump_t { + int x,y; + int refcount; + struct _viewbump_t *parent; +} viewbump_t; + +typedef struct { + line_t shallow_line; + line_t steep_line; + viewbump_t *shallow_bump; + viewbump_t *steep_bump; +} view_t; + +static view_t **current_view=NULL; +static view_t *views=NULL; +static viewbump_t *bumps=NULL; +static int bumpidx=0; + +#define RELATIVE_SLOPE(l,x,y) (((l)->yf-(l)->yi)*((l)->xf-(x)) - ((l)->xf-(l)->xi)*((l)->yf-(y))) +#define BELOW(l,x,y) (RELATIVE_SLOPE(l,x,y) > 0) +#define BELOW_OR_COLINEAR(l,x,y) (RELATIVE_SLOPE(l,x,y) >= 0) +#define ABOVE(l,x,y) (RELATIVE_SLOPE(l,x,y) < 0) +#define ABOVE_OR_COLINEAR(l,x,y) (RELATIVE_SLOPE(l,x,y) <= 0) +#define COLINEAR(l,x,y) (RELATIVE_SLOPE(l,x,y) == 0) +#define LINE_COLINEAR(l,l2) (COLINEAR(l,(l2)->xi,(l2)->yi) && COLINEAR(l,(l2)->xf,(l2)->yf)) + +static bool is_blocked(map_t *map, view_t *view, int startX, int startY, int x, int y, int dx, int dy, bool light_walls) { + int posx=x*dx/STEP_SIZE+startX; + int posy=y*dy/STEP_SIZE+startY; + int offset=posx + (posy)*map->width; + bool blocked=!map->cells[offset].transparent; + if (! blocked || light_walls) map->cells[offset].fov=1; + return blocked; +} + +static void add_shallow_bump(int x, int y, view_t *view) { + viewbump_t *shallow, *curbump; + view->shallow_line.xf=x; + view->shallow_line.yf=y; + shallow= &bumps[bumpidx++]; + shallow->x=x; + shallow->y=y; + shallow->parent=view->shallow_bump; + view->shallow_bump=shallow; + curbump=view->steep_bump; + while ( curbump ) { + if ( ABOVE(&view->shallow_line,curbump->x,curbump->y)) { + view->shallow_line.xi=curbump->x; + view->shallow_line.yi=curbump->y; + } + curbump=curbump->parent; + } +} + +static void add_steep_bump(int x, int y, view_t *view) { + viewbump_t *steep, *curbump; + view->steep_line.xf=x; + view->steep_line.yf=y; + steep=&bumps[bumpidx++]; + steep->x=x; + steep->y=y; + steep->parent=view->steep_bump; + view->steep_bump=steep; + curbump=view->shallow_bump; + while ( curbump ) { + if ( BELOW(&view->steep_line,curbump->x,curbump->y)) { + view->steep_line.xi=curbump->x; + view->steep_line.yi=curbump->y; + } + curbump=curbump->parent; + } +} + +static bool check_view(TCOD_list_t active_views, view_t **it) { + view_t *view=*it; + line_t *shallow_line=&view->shallow_line; + line_t *steep_line=&view->steep_line; + if (LINE_COLINEAR(shallow_line,steep_line) + && (COLINEAR(shallow_line,offset,limit) + || COLINEAR(shallow_line,limit,offset)) ){ +/*printf ("deleting view %x\n",it); */ + /* slow ! */ + TCOD_list_remove_iterator(active_views,(void **)it); + return false; + } + return true; +} + +static void visit_coords(map_t *m,int startX, int startY, int x, int y, int dx, int dy, + TCOD_list_t active_views, bool light_walls) { + /* top left */ + int tlx=x, tly=y+STEP_SIZE; + /* bottom right */ + int brx=x+STEP_SIZE, bry=y; + view_t *view=NULL; + while (current_view != (view_t **)TCOD_list_end(active_views)) { + view=*current_view; + if ( ! BELOW_OR_COLINEAR(&view->steep_line,brx,bry) ) { + break; + } + current_view++; + } + if ( current_view == (view_t **)TCOD_list_end(active_views) || ABOVE_OR_COLINEAR(&view->shallow_line,tlx,tly)) { + /* no more active view */ + return; + } + if ( !is_blocked(m,view,startX,startY,x,y,dx,dy,light_walls) ) return; + if ( ABOVE(&view->shallow_line,brx,bry) + && BELOW(&view->steep_line,tlx,tly)) { + /* view blocked */ + /* slow ! */ + TCOD_list_remove_iterator(active_views,(void **)current_view); + } else if ( ABOVE(&view->shallow_line,brx,bry)) { + /* shallow bump */ + add_shallow_bump(tlx,tly,view); + check_view(active_views,current_view); + } else if (BELOW(&view->steep_line,tlx,tly)) { + /* steep bump */ + add_steep_bump(brx,bry,view); + check_view(active_views,current_view); + } else { + /* view splitted */ + int offset=startX+x*dx/STEP_SIZE + (startY+y*dy/STEP_SIZE)*m->width; + view_t *shallower_view= & views[offset]; + int view_index=current_view - (view_t **)TCOD_list_begin(active_views); + view_t **shallower_view_it; + view_t **steeper_view_it; + *shallower_view=**current_view; + /* slow ! */ + shallower_view_it = (view_t **)TCOD_list_insert_before(active_views,shallower_view,view_index); + steeper_view_it=shallower_view_it+1; + current_view=shallower_view_it; + add_steep_bump(brx,bry,shallower_view); + if (!check_view(active_views,shallower_view_it)) steeper_view_it--; + add_shallow_bump(tlx,tly,*steeper_view_it); + check_view(active_views,steeper_view_it); + if ( view_index > TCOD_list_size(active_views)) current_view=(view_t **)TCOD_list_end(active_views); + } +} + +static void check_quadrant(map_t *m,int startX,int startY,int dx, int dy, int extentX,int extentY, bool light_walls) { + TCOD_list_t active_views=TCOD_list_new(); + line_t shallow_line={offset,limit,extentX*STEP_SIZE,0}; + line_t steep_line={limit,offset,0,extentY*STEP_SIZE}; + int maxI=extentX+extentY,i=1; + view_t *view= &views[startX+startY*m->width]; + + view->shallow_line=shallow_line; + view->steep_line=steep_line; + view->shallow_bump=NULL; + view->steep_bump=NULL; + TCOD_list_push(active_views,view); + current_view=(view_t **)TCOD_list_begin(active_views); + while ( i != maxI+1 && ! TCOD_list_is_empty(active_views) ) { + int startJ=MAX(i-extentX,0); + int maxJ=MIN(i,extentY); + int j=startJ; + while ( j != maxJ+1 && ! TCOD_list_is_empty(active_views) && current_view != (view_t **)TCOD_list_end(active_views) ) { + int x=(i - j)*STEP_SIZE; + int y=j*STEP_SIZE; + visit_coords(m,startX,startY,x,y,dx,dy,active_views, light_walls); + j++; + } + i++; + current_view=(view_t **)TCOD_list_begin(active_views); + } + TCOD_list_delete(active_views); +} + +void TCOD_map_compute_fov_permissive2(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls, int fovType) { + int c,minx,maxx,miny,maxy; + map_t *m = (map_t *)map; + if ( (unsigned)fovType>8 ) TCOD_fatal("Bad permissiveness %d for FOV_PERMISSIVE. Accepted range is [0,8].\n",fovType); + offset=8-fovType; + limit=8+fovType; + /* clean the map */ + for (c=m->nbcells-1; c >= 0; c--) { + m->cells[c].fov=0; + } + m->cells[player_x+player_y*m->width].fov=1; + /* preallocate views and bumps */ + views=(view_t *)calloc(sizeof(view_t),m->width*m->height); + bumps=(viewbump_t *)calloc(sizeof(viewbump_t),m->width*m->height); + /* set the fov range */ + if ( max_radius > 0 ) { + minx=MIN(player_x,max_radius); + maxx=MIN(m->width-player_x-1,max_radius); + miny=MIN(player_y,max_radius); + maxy=MIN(m->height-player_y-1,max_radius); + } else { + minx=player_x; + maxx=m->width-player_x-1; + miny=player_y; + maxy=m->height-player_y-1; + } + /* calculate fov. precise permissive field of view */ + bumpidx=0; + check_quadrant(m,player_x,player_y,1,1,maxx,maxy, light_walls); + bumpidx=0; + check_quadrant(m,player_x,player_y,1,-1,maxx,miny, light_walls); + bumpidx=0; + check_quadrant(m,player_x,player_y,-1,-1,minx,miny, light_walls); + bumpidx=0; + check_quadrant(m,player_x,player_y,-1,1,minx,maxy, light_walls); + free(bumps); + free(views); +} + diff --git a/tcod/tcod_sys/libtcod/src/fov_recursive_shadowcasting.c b/tcod/tcod_sys/libtcod/src/fov_recursive_shadowcasting.c new file mode 100644 index 00000000..9bef472e --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov_recursive_shadowcasting.c @@ -0,0 +1,106 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +static int mult[4][8]= { + {1,0,0,-1,-1,0,0,1}, + {0,1,-1,0,0,-1,1,0}, + {0,1,1,0,0,-1,-1,0}, + {1,0,0,1,-1,0,0,-1}, +}; + +static void cast_light(map_t *map,int cx, int cy,int row,float start, float end, int radius, int r2, + int xx, int xy, int yx, int yy, int id, bool light_walls) { + int j; + float new_start=0.0f; + if ( start < end ) return; + for (j=row; j< radius+1; j++) { + int dx=-j-1; + int dy=-j; + bool blocked=false; + while ( dx <= 0 ) { + int X,Y; + dx++; + X=cx+dx*xx+dy*xy; + Y=cy+dx*yx+dy*yy; + if ((unsigned)X < (unsigned)map->width && (unsigned)Y < (unsigned)map->height) { + float l_slope,r_slope; + int offset; + offset=X+Y*map->width; + l_slope=(dx-0.5f)/(dy+0.5f); + r_slope=(dx+0.5f)/(dy-0.5f); + if( start < r_slope ) continue; + else if( end > l_slope ) break; + if ( dx*dx+dy*dy <= r2 + && (light_walls || map->cells[offset].transparent)) map->cells[offset].fov=1; + if ( blocked ) { + if (!map->cells[offset].transparent) { + new_start=r_slope; + continue; + } else { + blocked=false; + start=new_start; + } + } else { + if (!map->cells[offset].transparent && j < radius ) { + blocked=true; + cast_light(map,cx,cy,j+1,start,l_slope,radius,r2,xx,xy,yx,yy,id+1,light_walls); + new_start=r_slope; + } + } + } + } + if ( blocked ) break; + } +} + +void TCOD_map_compute_fov_recursive_shadowcasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls) { + int oct,c,r2; + map_t *m = (map_t *)map; + /* clean the map */ + for (c=m->nbcells-1; c >= 0; c--) { + m->cells[c].fov=0; + } + if ( max_radius == 0 ) { + int max_radius_x=m->width-player_x; + int max_radius_y=m->height-player_y; + max_radius_x=MAX(max_radius_x,player_x); + max_radius_y=MAX(max_radius_y,player_y); + max_radius = (int)(sqrt(max_radius_x*max_radius_x+max_radius_y*max_radius_y))+1; + } + r2=max_radius*max_radius; + /* recursive shadow casting */ + for (oct=0; oct < 8; oct++) cast_light(m,player_x,player_y,1,1.0,0.0,max_radius,r2, + mult[0][oct],mult[1][oct],mult[2][oct],mult[3][oct],0,light_walls); + m->cells[player_x+player_y*m->width].fov=1; +} + diff --git a/tcod/tcod_sys/libtcod/src/fov_restrictive.c b/tcod/tcod_sys/libtcod/src/fov_restrictive.c new file mode 100644 index 00000000..bad9d935 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/fov_restrictive.c @@ -0,0 +1,234 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +* Mingos' Restrictive Precise Angle Shadowcasting (MRPAS), v1.1 +* This file was written by Dominik "Mingos" Marczuk. +* Original implementation: http://umbrarumregnum.110mb.com/downloads/MRPAS.zip +*/ + +#include /* for NULL in VS */ +#include "libtcod.h" +#include "libtcod_int.h" + +/* angle ranges */ +double * start_angle = NULL; +double * end_angle = NULL; +/* number of allocated angle pairs */ +int allocated = 0; + +void TCOD_map_compute_fov_restrictive_shadowcasting_quadrant (map_t *m, int player_x, int player_y, int max_radius, bool light_walls, int dx, int dy) { + /*octant: vertical edge */ + { + int iteration = 1; /*iteration of the algo for this octant */ + bool done = false; + int total_obstacles = 0; + int obstacles_in_last_line = 0; + double min_angle = 0.0; + int x,y; + + /*do while there are unblocked slopes left and the algo is within the map's boundaries + scan progressive lines/columns from the PC outwards */ + y = player_y+dy; /*the outer slope's coordinates (first processed line) */ + if (y < 0 || y >= m->height) done = true; + while(!done) { + /*process cells in the line */ + double slopes_per_cell = 1.0 / (double)(iteration); + double half_slopes = slopes_per_cell * 0.5; + int processed_cell = (int)((min_angle + half_slopes) / slopes_per_cell); + int minx = MAX(0,player_x-iteration), maxx = MIN(m->width-1,player_x+iteration); + done = true; + for (x = player_x + (processed_cell * dx); x >= minx && x <= maxx; x+=dx) { + int c = x + (y * m->width); + /*calculate slopes per cell */ + bool visible = true; + bool extended = false; + double centre_slope = (double)processed_cell * slopes_per_cell; + double start_slope = centre_slope - half_slopes; + double end_slope = centre_slope + half_slopes; + if (obstacles_in_last_line > 0 && m->cells[c].fov == false) { + int idx = 0; + if (visible && (m->cells[c-(m->width*dy)].fov == false || !m->cells[c-(m->width*dy)].transparent) && (x-dx >= 0 && x-dx < m->width && (m->cells[c-(m->width*dy)-dx].fov == false || !m->cells[c-(m->width*dy)-dx].transparent))) visible = false; + else while(visible && idx < obstacles_in_last_line) { + if (start_angle[idx] > end_slope || end_angle[idx] < start_slope) { + ++idx; + } + else { + if (m->cells[c].transparent) { + if (centre_slope > start_angle[idx] && centre_slope < end_angle[idx]) + visible = false; + } + else { + if (start_slope >= start_angle[idx] && end_slope <= end_angle[idx]) + visible = false; + else { + start_angle[idx] = MIN(start_angle[idx],start_slope); + end_angle[idx] = MAX(end_angle[idx],end_slope); + extended = true; + } + } + ++idx; + } + } + } + if (visible) { + m->cells[c].fov = true; + done = false; + /*if the cell is opaque, block the adjacent slopes */ + if (!m->cells[c].transparent) { + if (min_angle >= start_slope) { + min_angle = end_slope; + /* if min_angle is applied to the last cell in line, nothing more + needs to be checked. */ + if (processed_cell == iteration) done = true; + } + else if (!extended) { + start_angle[total_obstacles] = start_slope; + end_angle[total_obstacles++] = end_slope; + } + if (!light_walls) m->cells[c].fov = false; + } + } + processed_cell++; + } + if (iteration == max_radius) done = true; + iteration++; + obstacles_in_last_line = total_obstacles; + y += dy; + if (y < 0 || y >= m->height) done = true; + } + } + /*octant: horizontal edge */ + { + int iteration = 1; /*iteration of the algo for this octant */ + bool done = false; + int total_obstacles = 0; + int obstacles_in_last_line = 0; + double min_angle = 0.0; + int x,y; + + /*do while there are unblocked slopes left and the algo is within the map's boundaries + scan progressive lines/columns from the PC outwards */ + x = player_x+dx; /*the outer slope's coordinates (first processed line) */ + if (x < 0 || x >= m->width) done = true; + while(!done) { + /*process cells in the line */ + double slopes_per_cell = 1.0 / (double)(iteration); + double half_slopes = slopes_per_cell * 0.5; + int processed_cell = (int)((min_angle + half_slopes) / slopes_per_cell); + int miny = MAX(0,player_y-iteration), maxy = MIN(m->height-1,player_y+iteration); + done = true; + for (y = player_y + (processed_cell * dy); y >= miny && y <= maxy; y+=dy) { + int c = x + (y * m->width); + /*calculate slopes per cell */ + bool visible = true; + bool extended = false; + double centre_slope = (double)processed_cell * slopes_per_cell; + double start_slope = centre_slope - half_slopes; + double end_slope = centre_slope + half_slopes; + if (obstacles_in_last_line > 0 && m->cells[c].fov == false) { + int idx = 0; + if (visible && (m->cells[c-dx].fov == false || !m->cells[c-dx].transparent) && (y-dy >= 0 && y-dy < m->height && (m->cells[c-(m->width*dy)-dx].fov == false || !m->cells[c-(m->width*dy)-dx].transparent))) visible = false; + else while(visible && idx < obstacles_in_last_line) { + if (start_angle[idx] > end_slope || end_angle[idx] < start_slope) { + ++idx; + } + else { + if (m->cells[c].transparent) { + if (centre_slope > start_angle[idx] && centre_slope < end_angle[idx]) + visible = false; + } + else { + if (start_slope >= start_angle[idx] && end_slope <= end_angle[idx]) + visible = false; + else { + start_angle[idx] = MIN(start_angle[idx],start_slope); + end_angle[idx] = MAX(end_angle[idx],end_slope); + extended = true; + } + } + ++idx; + } + } + } + if (visible) { + m->cells[c].fov = true; + done = false; + /*if the cell is opaque, block the adjacent slopes */ + if (!m->cells[c].transparent) { + if (min_angle >= start_slope) { + min_angle = end_slope; + /* if min_angle is applied to the last cell in line, nothing more + needs to be checked. */ + if (processed_cell == iteration) done = true; + } + else if (!extended) { + start_angle[total_obstacles] = start_slope; + end_angle[total_obstacles++] = end_slope; + } + if (!light_walls) m->cells[c].fov = false; + } + } + processed_cell++; + } + if (iteration == max_radius) done = true; + iteration++; + obstacles_in_last_line = total_obstacles; + x += dx; + if (x < 0 || x >= m->width) done = true; + } + } +} + +void TCOD_map_compute_fov_restrictive_shadowcasting(TCOD_map_t map, int player_x, int player_y, int max_radius, bool light_walls) { + map_t *m = (map_t *)map; + int c; + int max_obstacles; + /*first, zero the FOV map */ + for(c = m->nbcells - 1; c >= 0; c--) m->cells[c].fov = false; + + /*calculate an approximated (excessive, just in case) maximum number of obstacles per octant */ + max_obstacles = m->nbcells / 7; + + /* check memory for angles */ + if (max_obstacles > allocated) { + allocated = max_obstacles; + if (start_angle != NULL) free(start_angle); + if (end_angle != NULL) free(end_angle); + start_angle = (double*)calloc(max_obstacles, sizeof(double)); + end_angle = (double*)calloc(max_obstacles, sizeof(double)); + } + + /*set PC's position as visible */ + m->cells[player_x+(player_y*m->width)].fov = true; + + /*compute the 4 quadrants of the map */ + TCOD_map_compute_fov_restrictive_shadowcasting_quadrant (m, player_x, player_y, max_radius, light_walls, 1, 1); + TCOD_map_compute_fov_restrictive_shadowcasting_quadrant (m, player_x, player_y, max_radius, light_walls, 1, -1); + TCOD_map_compute_fov_restrictive_shadowcasting_quadrant (m, player_x, player_y, max_radius, light_walls, -1, 1); + TCOD_map_compute_fov_restrictive_shadowcasting_quadrant (m, player_x, player_y, max_radius, light_walls, -1, -1); +} diff --git a/tcod/tcod_sys/libtcod/src/gui/README.txt b/tcod/tcod_sys/libtcod/src/gui/README.txt new file mode 100644 index 00000000..57e98fea --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/README.txt @@ -0,0 +1 @@ +Those classes are a C++ widget toolkit built on top of libtcod. diff --git a/tcod/tcod_sys/libtcod/src/gui/button.cpp b/tcod/tcod_sys/libtcod/src/gui/button.cpp new file mode 100644 index 00000000..18659ee9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/button.cpp @@ -0,0 +1,103 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" +#include "gui.hpp" + +Button::Button(const char *label,const char *tip,widget_callback_t cbk, void *userData) + : pressed(false),label(NULL) { + if ( label != NULL ) { + setLabel(label); + } + if ( tip != NULL ) setTip(tip); + this->x=0; + this->y=0; + this->userData=userData; + this->cbk=cbk; +} + +Button::Button(int x,int y,int width, int height,const char *label,const char *tip,widget_callback_t cbk, void *userData) + : pressed(false), label(NULL) { + if ( label != NULL ) setLabel(label); + if ( tip != NULL ) setTip(tip); + w=width; + h=height; + this->x=x; + this->y=y; + this->userData=userData; + this->cbk=cbk; +} + +Button::~Button() { + if ( label ) free(label); +} + +void Button::setLabel(const char *newLabel) { + if ( label ) free(label); + label=TCOD_strdup(newLabel); +} + +void Button::render() { + con->setDefaultBackground(mouseIn ? backFocus : back); + con->setDefaultForeground(mouseIn ? foreFocus : fore); + if ( w > 0 && h > 0 ) con->rect(x,y,w,h,true,TCOD_BKGND_SET); + if ( label ) { + if ( pressed && mouseIn ) { + con->printEx(x+w/2,y,TCOD_BKGND_NONE,TCOD_CENTER,"-%s-",label); + } else { + con->printEx(x+w/2,y,TCOD_BKGND_NONE,TCOD_CENTER,label); + } + } +} + +void Button::computeSize() { + if ( label != NULL ) { + w=strlen(label)+2; + } else { + w=4; + } + h=1; +} + +void Button::expand(int width, int height) { + if ( w < width ) w = width; +} + +void Button::onButtonPress() { + pressed=true; +} + +void Button::onButtonRelease() { + pressed=false; +} + +void Button::onButtonClick() { + if ( cbk ) cbk(this,userData); +} + + + diff --git a/tcod/tcod_sys/libtcod/src/gui/container.cpp b/tcod/tcod_sys/libtcod/src/gui/container.cpp new file mode 100644 index 00000000..55f02ff5 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/container.cpp @@ -0,0 +1,63 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +Container::~Container() { + content.clearAndDelete(); +} + +void Container::addWidget(Widget *wid) { + content.push(wid); + widgets.remove(wid); +} + +void Container::removeWidget(Widget *wid) { + content.remove(wid); +} + +void Container::setVisible(bool val) { + Widget::setVisible(val); +} + +void Container::clear() { + content.clearAndDelete(); +} + +void Container::render() { + for ( Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) (*wid)->render(); + } +} + +void Container::update(const TCOD_key_t k) { + Widget::update(k); + for ( Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) (*wid)->update(k); + } +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/flatlist.cpp b/tcod/tcod_sys/libtcod/src/gui/flatlist.cpp new file mode 100644 index 00000000..3e85f208 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/flatlist.cpp @@ -0,0 +1,115 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "libtcod.hpp" +#include "gui.hpp" + +FlatList::FlatList(int x,int y,int w, const char **list, const char *label, const char *tip) + : TextBox(x,y,w,10,label,NULL,tip),value(list),list(list), + onLeftArrow(false),onRightArrow(false),cbk(NULL),data(NULL) { + valueToText(); + this->w+=2; +} + +FlatList::~FlatList() { +} + +void FlatList::render() { + w--; + boxx++; + TextBox::render(); + boxx--; + w++; + con->setDefaultBackground((onLeftArrow) ? backFocus : back); + con->setDefaultForeground((onLeftArrow) ? foreFocus : fore); + con->putChar(x+boxx,y,TCOD_CHAR_ARROW_W); + con->setDefaultBackground((onRightArrow) ? backFocus : back); + con->setDefaultForeground((onRightArrow) ? foreFocus : fore); + con->putChar(x+w-1,y,TCOD_CHAR_ARROW_E); +} + +void FlatList::update(TCOD_key_t k) { + onLeftArrow=onRightArrow=false; + if ( mouse.cx == x+boxx && mouse.cy == y ) onLeftArrow=true; + else if ( mouse.cx == x+w-1 && mouse.cy == y ) onRightArrow=true; + Widget::update(k); +} + +void FlatList::valueToText() { + setText(*value); +} + +void FlatList::textToValue() { + const char **ptr=list; + while (*ptr) { + if ( strcmp(txt,*ptr) == 0 ) { + value = ptr; + break; + } + ptr++; + } +} + +void FlatList::onButtonClick() { + const char **oldValue=value; + if ( onLeftArrow ) { + if ( value == list ) { + while (*value) { + value++; + } + } + value--; + } else if ( onRightArrow ) { + value++; + if ( *value == NULL ) value=list; + } + if ( value != oldValue && cbk ) { + valueToText(); + cbk(this,*value,data); + } + +} + +void FlatList::setValue(const char * v) { + const char **ptr=list; + while (*ptr) { + if ( strcmp(v,*ptr) == 0 ) { + value = ptr; + valueToText(); + break; + } + ptr++; + } +} + +void FlatList::setList(const char **l) { + value=list=l; + valueToText(); +} + + diff --git a/tcod/tcod_sys/libtcod/src/gui/hbox.cpp b/tcod/tcod_sys/libtcod/src/gui/hbox.cpp new file mode 100644 index 00000000..9285fde4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/hbox.cpp @@ -0,0 +1,52 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +HBox::HBox(int x, int y, int padding) : VBox(x,y,padding) { +} + +void HBox::computeSize() { + int curx=x; + h=0; + for (Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) { + (*wid)->y=y; + (*wid)->x=curx; + (*wid)->computeSize(); + if ((*wid)->h > h) h=(*wid)->h; + curx+=(*wid)->w+padding; + } + } + w=curx-x; + for (Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) { + (*wid)->expand((*wid)->w,h); + } + } +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/image.cpp b/tcod/tcod_sys/libtcod/src/gui/image.cpp new file mode 100644 index 00000000..c69efe55 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/image.cpp @@ -0,0 +1,50 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +Image::Image(int x,int y,int w, int h, const char *tip) : Widget(x,y,w,h), back(TCODColor::black) { + if ( tip ) setTip(tip); +} + +Image::~Image() { +} + +void Image::render() { + con->setDefaultBackground(back); + con->rect(x,y,w,h,TCOD_BKGND_SET); +} + +void Image::setBackgroundColor(const TCODColor col) { + back=col; +} + +void Image::expand(int width, int height) { + if ( width > w ) w=width; + if ( height > h ) h=height; +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/label.cpp b/tcod/tcod_sys/libtcod/src/gui/label.cpp new file mode 100644 index 00000000..3b87028b --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/label.cpp @@ -0,0 +1,49 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +Label::Label(int x, int y, const char *label, const char *tip) : Widget(x,y,0,1) { + this->label=label; + if ( tip ) setTip(tip); +} + +void Label::render() { + con->setDefaultBackground(back); + con->setDefaultForeground(fore); + con->printEx(x,y,TCOD_BKGND_NONE,TCOD_LEFT,label); +} + +void Label::computeSize() { + if ( label ) w=strlen(label); + else w=0; +} + +void Label::expand(int width, int height) { + if ( w < width ) w=width; +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/radiobutton.cpp b/tcod/tcod_sys/libtcod/src/gui/radiobutton.cpp new file mode 100644 index 00000000..85fcc896 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/radiobutton.cpp @@ -0,0 +1,65 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +RadioButton *RadioButton::groupSelect[512]; +int RadioButton::defaultGroup=0; +static bool init=false; + +void RadioButton::select() { + if (!init) { + memset(groupSelect,0,sizeof(RadioButton *)*512); + init=true; + } + groupSelect[group]=this; +} + +void RadioButton::unSelect() { + if (!init) { + memset(groupSelect,0,sizeof(RadioButton *)*512); + init=true; + } + groupSelect[group]=NULL; +} + +void RadioButton::unSelectGroup(int group) { + groupSelect[group]=NULL; +} + +void RadioButton::render() { + Button::render(); + if ( groupSelect[group] == this ) { + con->setChar(x,y,'>'); + } +} + +void RadioButton::onButtonClick() { + select(); + Button::onButtonClick(); +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/slider.cpp b/tcod/tcod_sys/libtcod/src/gui/slider.cpp new file mode 100644 index 00000000..9ad5ebbe --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/slider.cpp @@ -0,0 +1,127 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include "libtcod.hpp" +#include "gui.hpp" + +Slider::Slider(int x,int y,int w, float min, float max, const char *label, const char *tip) + : TextBox(x,y,w,10,label,NULL,tip),min(min),max(max),value((min+max)*0.5f),sensitivity(1.0f), + onArrows(false),drag(false),fmt(NULL),cbk(NULL),data(NULL) { + valueToText(); + this->w+=2; +} + +Slider::~Slider() { + if ( fmt ) free(fmt); +} + +void Slider::setFormat(const char *fmt) { + if ( this->fmt ) free(this->fmt); + if ( fmt ) this->fmt = TCOD_strdup(fmt); + else fmt=NULL; + valueToText(); +} + +void Slider::render() { + w-=2; + TextBox::render(); + w+=2; + con->setDefaultBackground((onArrows || drag) ? backFocus : back); + con->setDefaultForeground((onArrows || drag) ? foreFocus : fore); + con->rect(x+w-2,y,2,1,TCOD_BKGND_SET); + con->setChar(x+w-2,y,TCOD_CHAR_ARROW_W); + con->setChar(x+w-1,y,TCOD_CHAR_ARROW_E); +} + +void Slider::update(TCOD_key_t k) { + float oldValue=value; + TextBox::update(k); + textToValue(); + if ( mouse.cx >= x+w-2 && mouse.cx < x+w && mouse.cy == y ) onArrows=true; + else onArrows=false; + if ( drag ) { + if ( dragy == -1 ) { + dragx = mouse.x; + dragy = mouse.y; + } else { + float mdx = (float)((mouse.x-dragx)*sensitivity) / (con->getWidth()*8); + float mdy = (float)((mouse.y-dragy)*sensitivity) / (con->getHeight()*8); + float oldValue=value; + if ( fabs(mdy) > fabs(mdx) ) mdx=-mdy; + value = dragValue+(max-min)*mdx; + value=CLAMP(min,max,value); + if ( value != oldValue ) { + valueToText(); + textToValue(); + } + } + } + if ( value != oldValue && cbk ) { + cbk(this,value,data); + } +} + +void Slider::valueToText() { + char tmp[128]; + sprintf(tmp, fmt ? fmt : "%.2f",value); + setText(tmp); +} + +void Slider::textToValue() { +#ifdef TCOD_VISUAL_STUDIO + value=(float)atof(txt); +#else + char *endptr; + float f=strtof(txt,&endptr); + if ( f != 0.0f || endptr != txt ) value=f; +#endif +} + +void Slider::setValue(float value) { + this->value=CLAMP(min,max,value); + valueToText(); +} + +void Slider::onButtonPress() { + if ( onArrows ) { + drag=true; + dragy=-1; + dragValue=value; + TCODMouse::showCursor(false); + } +} + +void Slider::onButtonRelease() { + if ( drag ) { + drag=false; + TCODMouse::move((x+w-2)*8,y*8); + TCODMouse::showCursor(true); + } +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/statusbar.cpp b/tcod/tcod_sys/libtcod/src/gui/statusbar.cpp new file mode 100644 index 00000000..848dc48a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/statusbar.cpp @@ -0,0 +1,39 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +void StatusBar::render() { + con->setDefaultBackground(back); + con->rect(x,y,w,h,true,TCOD_BKGND_SET); + if ( focus && focus->tip ) { + con->setDefaultForeground(fore); + con->printRectEx(x+1,y,w,h,TCOD_BKGND_NONE,TCOD_LEFT,focus->tip); + } +} + + diff --git a/tcod/tcod_sys/libtcod/src/gui/textbox.cpp b/tcod/tcod_sys/libtcod/src/gui/textbox.cpp new file mode 100644 index 00000000..2123ca6b --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/textbox.cpp @@ -0,0 +1,159 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "libtcod.hpp" +#include "gui.hpp" + +float TextBox::blinkingDelay=0.5f; +TextBox::TextBox(int x,int y,int w, int maxw, const char *label, const char *value, const char *tip) + : Widget(x,y,w,1),txt(NULL),blink(0.0f),pos(0),offset(0),maxw(maxw),insert(true),txtcbk(NULL), + data(NULL) { + if ( maxw > 0 ) { + txt = new char[maxw+1]; + memset(txt,0,sizeof(char)*(maxw+1)); + if ( value ) { + strncpy(txt,value,maxw); + } + } + if ( tip ) setTip(tip); + if ( label ) this->label=TCOD_strdup(label); + boxw=w; + if (label ) { + boxx=strlen(label)+1; + this->w+= boxx; + } +} + +TextBox::~TextBox() { + if ( txt ) delete [] txt; + if ( label ) free(label); +} + +void TextBox::setText(const char *txt) { + strncpy(this->txt,txt,maxw); +} + +void TextBox::render() { + con->setDefaultBackground(back); + con->setDefaultForeground(fore); + con->rect(x,y,w,h,true,TCOD_BKGND_SET); + if ( label ) con->printEx(x,y,TCOD_BKGND_NONE,TCOD_LEFT,label); + + con->setDefaultBackground(keyboardFocus == this ? foreFocus : fore); + con->setDefaultForeground(keyboardFocus == this ? backFocus : back); + con->rect(x+boxx,y,boxw,h,false,TCOD_BKGND_SET); + int len=strlen(txt)-offset; + if (len > boxw) len = boxw; + if ( txt ) con->printEx(x+boxx,y,TCOD_BKGND_NONE,TCOD_LEFT,"%.*s",len,&txt[offset]); + if (keyboardFocus == this && blink > 0.0f) { + if (insert) { + con->setCharBackground(x+boxx+pos-offset,y,fore); + con->setCharForeground(x+boxx+pos-offset,y,back); + } else { + con->setCharBackground(x+boxx+pos-offset,y,back); + con->setCharForeground(x+boxx+pos-offset,y,fore); + } + } +} + +void TextBox::update(TCOD_key_t k) { + if ( keyboardFocus == this ) { + blink -= elapsed; + if ( blink < -blinkingDelay ) blink += 2*blinkingDelay; + if ( k.vk == TCODK_CHAR || + (k.vk >= TCODK_0 && k.vk <= TCODK_9) || + (k.vk >= TCODK_KP0 && k.vk <= TCODK_KP9) ) { + if ( ! insert || (int)strlen(txt) < maxw ) { + if ( insert && pos < (int)strlen(txt) ) { + for (int i=(int)strlen(txt); i >= pos; i-- ) { + txt[i+1]=txt[i]; + } + } + txt[pos]=k.c; + if ( pos < maxw ) pos++; + if ( pos >= w ) offset = pos-w+1; + if (txtcbk) txtcbk(this,txt,data); + } + blink=blinkingDelay; + } + switch ( k.vk ) { + case TCODK_LEFT : + if (pos > 0) pos--; + if ( pos < offset ) offset=pos; + blink=blinkingDelay; + break; + case TCODK_RIGHT : + if (pos < (int)strlen(txt)) pos++; + if ( pos >= w ) offset = pos-w+1; + blink=blinkingDelay; + break; + case TCODK_HOME : + pos = offset = 0; + blink=blinkingDelay; + break; + case TCODK_BACKSPACE : + if (pos > 0) { + pos--; + for (uint32 i=pos; i <= strlen(txt); i++ ) { + txt[i]=txt[i+1]; + } + if (txtcbk) txtcbk(this,txt,data); + if ( pos < offset ) offset=pos; + } + blink=blinkingDelay; + break; + case TCODK_DELETE : + if (pos < (int)strlen(txt)) { + for (uint32 i=pos; i <= strlen(txt); i++ ) { + txt[i]=txt[i+1]; + } + if (txtcbk) txtcbk(this,txt,data); + } + blink=blinkingDelay; + break; +/* + case TCODK_INSERT : + insert=!insert; + blink=blinkingDelay; + break; +*/ + case TCODK_END : + pos = strlen(txt); + if ( pos >= w ) offset = pos-w+1; + blink=blinkingDelay; + break; + default:break; + } + } + Widget::update(k); +} + +void TextBox::onButtonClick() { + if ( mouse.cx >= x+boxx && mouse.cx < x+boxx+boxw ) keyboardFocus=this; +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/togglebutton.cpp b/tcod/tcod_sys/libtcod/src/gui/togglebutton.cpp new file mode 100644 index 00000000..d76ea958 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/togglebutton.cpp @@ -0,0 +1,54 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" +#include "gui.hpp" + +void ToggleButton::render() { + con->setDefaultBackground(mouseIn ? backFocus : back); + con->setDefaultForeground(mouseIn ? foreFocus : fore); + con->rect(x,y,w,h,true,TCOD_BKGND_SET); + if ( label ) { + con->printEx(x,y,TCOD_BKGND_NONE,TCOD_LEFT,"%c %s",pressed ? TCOD_CHAR_CHECKBOX_SET : TCOD_CHAR_CHECKBOX_UNSET, label); + } else { + con->printEx(x,y,TCOD_BKGND_NONE,TCOD_LEFT,"%c",pressed ? TCOD_CHAR_CHECKBOX_SET : TCOD_CHAR_CHECKBOX_UNSET); + } +} + +void ToggleButton::onButtonPress() { +} + +void ToggleButton::onButtonRelease() { +} + +void ToggleButton::onButtonClick() { + pressed=!pressed; + if ( cbk ) cbk(this,userData); +} + + + diff --git a/tcod/tcod_sys/libtcod/src/gui/toolbar.cpp b/tcod/tcod_sys/libtcod/src/gui/toolbar.cpp new file mode 100644 index 00000000..fbe2621a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/toolbar.cpp @@ -0,0 +1,125 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" +#include "gui.hpp" + +class Separator : public Widget { +public : + Separator(const char *txt, const char *tip=NULL) : Widget(0,0,0,1),txt(NULL) { + if ( txt ) { + this->txt=TCOD_strdup(txt); + } + if ( tip ) setTip(tip); + } + virtual ~Separator() { + if ( txt ) { + free(txt); + } + } + void computeSize() { + w = (txt ? (int)strlen(txt)+2 : 0 ); + } + void expand(int width, int height) { + if ( w < width ) w=width; + } + void render() { + con->setDefaultBackground(back); + con->setDefaultForeground(fore); + con->hline(x,y,w, TCOD_BKGND_SET); + con->setChar(x-1,y,TCOD_CHAR_TEEE); + con->setChar(x+w,y,TCOD_CHAR_TEEW); + con->setDefaultBackground(fore); + con->setDefaultForeground(back); + con->printEx(x+w/2,y,TCOD_BKGND_SET,TCOD_CENTER," %s ",txt); + } + char *txt; +}; + +ToolBar::ToolBar(int x, int y, const char *name, const char *tip) + : Container(x,y,0,2),name(NULL),fixedWidth(0) { + if ( name ) { + this->name = TCOD_strdup(name); + w = strlen(name)+4; + } + if ( tip ) setTip(tip); +} + +ToolBar::ToolBar(int x, int y, int w, const char *name, const char *tip) + : Container(x,y,w,2),name(NULL),fixedWidth(w) { + if ( name ) { + this->name = TCOD_strdup(name); + fixedWidth = w = MAX((int)strlen(name)+4,w); + } + if ( tip ) setTip(tip); +} + +ToolBar::~ToolBar() { + if ( name ) free(name); +} + +void ToolBar::setName(const char *name) { + if ( this->name ) free(this->name); + if ( name ) { + this->name = TCOD_strdup(name); + fixedWidth = MAX((int)strlen(name)+4,fixedWidth); + } else { + name=NULL; + } +} + +void ToolBar::render() { + con->setDefaultBackground(back); + con->setDefaultForeground(fore); + con->printFrame(x,y,w,h,true,TCOD_BKGND_SET,name); + Container::render(); +} + +void ToolBar::computeSize() { + int cury=y+1; + w=name ? strlen(name)+4 : 2; + for (Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) { + (*wid)->x=x+1; + (*wid)->y=cury; + (*wid)->computeSize(); + if ((*wid)->w +2 > w) w=(*wid)->w + 2; + cury+=(*wid)->h; + } + } + if ( w < fixedWidth ) w=fixedWidth; + h=cury-y+1; + for (Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) { + (*wid)->expand(w-2,(*wid)->h); + } + } +} +void ToolBar::addSeparator(const char *txt, const char *tip) { + addWidget(new Separator(txt,tip)); +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/vbox.cpp b/tcod/tcod_sys/libtcod/src/gui/vbox.cpp new file mode 100644 index 00000000..c45dfe99 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/vbox.cpp @@ -0,0 +1,49 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include "gui.hpp" + +void VBox::computeSize() { + int cury=y; + w=0; + for (Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) { + (*wid)->x=x; + (*wid)->y=cury; + (*wid)->computeSize(); + if ((*wid)->w > w) w=(*wid)->w; + cury+=(*wid)->h+padding; + } + } + h=cury-y; + for (Widget **wid=content.begin(); wid != content.end(); wid ++ ) { + if ( (*wid)->isVisible() ) { + (*wid)->expand(w,(*wid)->h); + } + } +} + diff --git a/tcod/tcod_sys/libtcod/src/gui/widget.cpp b/tcod/tcod_sys/libtcod/src/gui/widget.cpp new file mode 100644 index 00000000..63a72fdf --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/gui/widget.cpp @@ -0,0 +1,143 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" +#include "gui.hpp" + +TCODColor Widget::back=TCODColor(40,40,120); +TCODColor Widget::fore=TCODColor(220,220,180); +TCODColor Widget::backFocus=TCODColor(70,70,130); +TCODColor Widget::foreFocus=TCODColor(255,255,255); +TCODConsole *Widget::con=NULL; +TCODList Widget::widgets; +TCOD_mouse_t Widget::mouse; +float Widget::elapsed; +Widget *Widget::focus=NULL; +Widget *Widget::keyboardFocus=NULL; + +Widget::Widget() : x(0),y(0),w(0),h(0),tip(NULL),mouseIn(false),mouseL(false),visible(true) { + widgets.push(this); +} + +Widget::Widget(int x,int y) : x(x),y(y),w(0),h(0),tip(NULL),mouseIn(false),mouseL(false),visible(true) { + widgets.push(this); +} + +Widget::Widget(int x,int y, int w, int h) : x(x),y(y),w(w),h(h),tip(NULL),mouseIn(false),mouseL(false),visible(true) { + widgets.push(this); +} + +Widget::~Widget() { + if ( tip ) free(tip); + if ( focus == this ) focus=NULL; + widgets.remove(this); +} + +void Widget::setBackgroundColor(const TCODColor col,const TCODColor colFocus) { + back=col; + backFocus=colFocus; +} + +void Widget::setForegroundColor(const TCODColor col,const TCODColor colFocus) { + fore=col; + foreFocus=colFocus; +} + +void Widget::setConsole(TCODConsole *console) { + con=console; +} + +void Widget::update(const TCOD_key_t k) { + bool curs=TCODMouse::isCursorVisible(); + if ( curs ) { + if ( mouse.cx >= x && mouse.cx < x+w && mouse.cy >= y && mouse.cy < y+h ) { + if ( ! mouseIn ) { + mouseIn = true; + onMouseIn(); + } + if ( focus != this ) { + focus=this; + } + } else { + if ( mouseIn ) { + mouseIn = false; + onMouseOut(); + } + mouseL=false; + if ( this == focus ) { + focus = NULL; + } + } + } + if ( mouseIn || (! curs && this == focus ) ) { + if ( mouse.lbutton && ! mouseL ) { + mouseL = true; + onButtonPress(); + } else if (! mouse.lbutton && mouseL ) { + onButtonRelease(); + keyboardFocus=NULL; + if ( mouseL ) onButtonClick(); + mouseL=false; + } else if ( mouse.lbutton_pressed ) { + keyboardFocus=NULL; + onButtonClick(); + } + } +} + +void Widget::updateWidgetsIntern(const TCOD_key_t k) { + elapsed=TCODSystem::getLastFrameLength(); + for (Widget **w=widgets.begin(); w!= widgets.end(); w++) { + if ( (*w)->isVisible() ) { + (*w)->computeSize(); + (*w)->update(k); + } + } +} + +void Widget::updateWidgets(const TCOD_key_t k,const TCOD_mouse_t pmouse) { + mouse=pmouse; + updateWidgetsIntern(k); +} + +void Widget::renderWidgets() { + if (!con) con=TCODConsole::root; + for (Widget **w=widgets.begin(); w!= widgets.end(); w++) { + if ((*w)->isVisible()) (*w)->render(); + } +} + +void Widget::move(int x,int y) { + this->x=x; + this->y=y; +} + +void Widget::setTip(const char *tip) { + if ( this->tip ) free(this->tip); + this->tip = TCOD_strdup(tip); +} + diff --git a/tcod/tcod_sys/libtcod/src/heightmap.cpp b/tcod/tcod_sys/libtcod/src/heightmap.cpp new file mode 100644 index 00000000..5165e409 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/heightmap.cpp @@ -0,0 +1,175 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" + +TCODHeightMap::TCODHeightMap(int w, int h) : w(w),h(h) { + values = new float[w*h]; + memset(values,0,sizeof(float)*w*h); +} +TCODHeightMap::~TCODHeightMap() { + delete [] values; +} + +void TCODHeightMap::clear() { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_clear(&hm); +} +void TCODHeightMap::normalize(float newMin, float newMax) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_normalize(&hm,newMin,newMax); +} + +void TCODHeightMap::getMinMax(float *min, float *max) const { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_get_minmax(&hm,min,max); +} + +void TCODHeightMap::addHill(float hx, float hy, float hradius, float height) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_add_hill(&hm,hx,hy,hradius,height); +} + +void TCODHeightMap::digHill(float hx, float hy, float hradius, float height) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_dig_hill(&hm,hx,hy,hradius,height); +} + +void TCODHeightMap::copy(const TCODHeightMap *source) { + TCOD_heightmap_t hm_source={source->w,source->h,source->values}; + TCOD_heightmap_t hm_dest={w,h,values}; + TCOD_heightmap_copy(&hm_source,&hm_dest); +} + +void TCODHeightMap::addFbm(TCODNoise *noise, float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_add_fbm(&hm,noise->data,mulx,muly,addx,addy,octaves,delta,scale); +} +void TCODHeightMap::scaleFbm(TCODNoise *noise, float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_scale_fbm(&hm,noise->data,mulx,muly,addx,addy,octaves,delta,scale); +} + +float TCODHeightMap::getInterpolatedValue(float x, float y) const { + TCOD_heightmap_t hm={w,h,values}; + return TCOD_heightmap_get_interpolated_value(&hm,x,y); +} + +void TCODHeightMap::getNormal(float x, float y,float n[3], float waterHeight) const { + TCOD_heightmap_t hm={w,h,values}; + return TCOD_heightmap_get_normal(&hm,x,y,n,waterHeight); +} + +void TCODHeightMap::digBezier(int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_dig_bezier(&hm,px,py,startRadius,startDepth,endRadius,endDepth); +} + +bool TCODHeightMap::hasLandOnBorder(float seaLevel) const { + TCOD_heightmap_t hm={w,h,values}; + return TCOD_heightmap_has_land_on_border(&hm,seaLevel) != 0; +} + +void TCODHeightMap::islandify(float seaLevel,TCODRandom *rnd) { + TCOD_heightmap_t hm={w,h,values}; + return TCOD_heightmap_islandify(&hm,seaLevel,rnd->data); +} + +void TCODHeightMap::add(float f) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_add(&hm,f); +} + +int TCODHeightMap::countCells(float min,float max) const { + TCOD_heightmap_t hm={w,h,values}; + return TCOD_heightmap_count_cells(&hm,min,max); +} + +void TCODHeightMap::scale(float f) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_scale(&hm,f); +} + +void TCODHeightMap::clamp(float min, float max) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_clamp(&hm,min,max); +} + +void TCODHeightMap::lerp(const TCODHeightMap *a, const TCODHeightMap *b,float coef) { + TCOD_heightmap_t hm1={a->w,a->h,a->values}; + TCOD_heightmap_t hm2={b->w,b->h,b->values}; + TCOD_heightmap_t hmres={w,h,values}; + TCOD_heightmap_lerp_hm(&hm1,&hm2,&hmres,coef); +} + +void TCODHeightMap::add(const TCODHeightMap *a, const TCODHeightMap *b) { + TCOD_heightmap_t hm1={a->w,a->h,a->values}; + TCOD_heightmap_t hm2={b->w,b->h,b->values}; + TCOD_heightmap_t hmres={w,h,values}; + TCOD_heightmap_add_hm(&hm1,&hm2,&hmres); +} + +void TCODHeightMap::multiply(const TCODHeightMap *a, const TCODHeightMap *b) { + TCOD_heightmap_t hm1={a->w,a->h,a->values}; + TCOD_heightmap_t hm2={b->w,b->h,b->values}; + TCOD_heightmap_t hmres={w,h,values}; + TCOD_heightmap_multiply_hm(&hm1,&hm2,&hmres); +} + +float TCODHeightMap::getSlope(int x, int y) const { + TCOD_heightmap_t hm={w,h,values}; + return TCOD_heightmap_get_slope(&hm,x,y); +} + +void TCODHeightMap::rainErosion(int nbDrops, float erosionCoef,float agregationCoef, TCODRandom *rnd) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_rain_erosion(&hm, nbDrops, erosionCoef, agregationCoef, rnd->data); +} + +void TCODHeightMap::kernelTransform(int kernelSize, const int *dx, const int *dy, const float *weight, float minLevel,float maxLevel) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_kernel_transform(&hm, kernelSize,dx,dy,weight,minLevel, maxLevel); +} + +void TCODHeightMap::addVoronoi(int nbPoints, int nbCoef, const float *coef,TCODRandom *rnd) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_add_voronoi(&hm, nbPoints, nbCoef, coef, rnd->data); +} + +#if 0 +void TCODHeightMap::heatErosion(int nbPass,float minSlope,float erosionCoef,float agregationCoef,TCODRandom *rnd) { + TCOD_heightmap_t hm={w,h,values}; + TCOD_heightmap_heat_erosion(&hm, nbPass, minSlope, erosionCoef, agregationCoef, rnd->data); +} +#endif + +void TCODHeightMap::midPointDisplacement(TCODRandom *rnd, float roughness) { + TCOD_heightmap_t hm={w,h,values}; + if ( ! rnd ) rnd = TCODRandom::getInstance(); + TCOD_heightmap_mid_point_displacement(&hm, rnd->data, roughness); +} + diff --git a/tcod/tcod_sys/libtcod/src/heightmap_c.c b/tcod/tcod_sys/libtcod/src/heightmap_c.c new file mode 100644 index 00000000..b96fc9f8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/heightmap_c.c @@ -0,0 +1,557 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include "libtcod.h" + +#define GET_VALUE(hm,x,y) (hm)->values[(x)+(y)*(hm)->w] + +TCOD_heightmap_t *TCOD_heightmap_new(int w,int h) { + TCOD_heightmap_t *hm=(TCOD_heightmap_t *)malloc(sizeof(TCOD_heightmap_t)); + hm->values = (float *)calloc(sizeof(float),w*h); + hm->w=w; + hm->h=h; + return hm; +} +void TCOD_heightmap_delete(TCOD_heightmap_t *hm) { + free(hm->values); + free(hm); +} + +void TCOD_heightmap_clear(TCOD_heightmap_t *hm) { + memset(hm->values,0,hm->w*hm->h*sizeof(float)); +} + +float TCOD_heightmap_get_value(const TCOD_heightmap_t *hm, int x, int y) { + return GET_VALUE(hm,x,y); +} + +void TCOD_heightmap_set_value(TCOD_heightmap_t *hm, int x, int y, float value) { + GET_VALUE(hm,x,y)=value; +} + +void TCOD_heightmap_get_minmax(const TCOD_heightmap_t *hm, float *min, float *max) { + float curmax=hm->values[0]; + float curmin=hm->values[0]; + int x,y; + float *value = hm->values; + /* get max and min height */ + for (y=0; y < hm->h; y++) { + for (x=0; x < hm->w; x++) { + float val=*value; + if ( val > curmax ) curmax = val; + else if ( val < curmin ) curmin = val; + value++; + } + } + *min=curmin; + *max=curmax; +} + +void TCOD_heightmap_normalize(TCOD_heightmap_t *hm, float min, float max) { + float curmin,curmax; + int x,y; + float invmax; + float *value = hm->values; + TCOD_heightmap_get_minmax(hm,&curmin,&curmax); + if (curmax - curmin == 0.0f) invmax=0.0f; + else invmax = (max-min) / (curmax-curmin); + /* normalize */ + for (y=0; y < hm->h; y++) { + for (x=0; x < hm->w; x++) { + *value = min + (*value - curmin) * invmax ; + value++; + } + } +} +void TCOD_heightmap_add_hill(TCOD_heightmap_t *hm, float hx, float hy, float hradius, float hheight) { + int x,y; + float hradius2=hradius*hradius; + float coef=hheight / hradius2; + int minx=(int)MAX(0,hx-hradius); + int maxx=(int)MIN(hm->w,hx+hradius); + int miny=(int)MAX(0,hy-hradius); + int maxy=(int)MIN(hm->h,hy+hradius); + for (x=minx; x < maxx; x++) { + float xdist=( x - hx )*( x - hx ); + for (y=miny; y < maxy; y++) { + float z = hradius2 - xdist - (y - hy)*(y - hy); + if ( z > 0.0 ) GET_VALUE(hm,x,y) += z * coef; + } + } +} + +void TCOD_heightmap_dig_hill(TCOD_heightmap_t *hm, float hx, float hy, float hradius, float hheight) { + int x,y; + float hradius2=hradius*hradius; + float coef=hheight / hradius2; + int minx=(int)MAX(0,hx-hradius); + int maxx=(int)MIN(hm->w,hx+hradius); + int miny=(int)MAX(0,hy-hradius); + int maxy=(int)MIN(hm->h,hy+hradius); + for (x=minx; x < maxx; x++) { + float xdist=( x - hx )*( x - hx ); + for (y=miny; y < maxy; y++) { + float dist=xdist + (y - hy)*(y - hy); + if ( dist < hradius2 ) { + float z = (hradius2 - dist) * coef; + if ( hheight > 0.0 ) { + if ( GET_VALUE(hm,x,y) < z ) GET_VALUE(hm,x,y) = z; + } else { + if ( GET_VALUE(hm,x,y) > z ) GET_VALUE(hm,x,y) = z; + } + } + } + } +} + +void TCOD_heightmap_copy(const TCOD_heightmap_t *hm_source,TCOD_heightmap_t *hm_dest) { + if ( hm_source->w != hm_dest->w || hm_source->h != hm_dest->h) return; + memcpy(hm_dest->values,hm_source->values,sizeof(float)*hm_source->w*hm_source->h); +} + +void TCOD_heightmap_add_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) { + int x,y; + float xcoef=mulx / hm->w; + float ycoef=muly / hm->h; + float min=1.0f; + float max=0.0f; + for (x=0; x < hm->w; x++) { + float f[2]; + int offset=x; + f[0] = (x + addx) * xcoef; + for (y=0; y < hm->h; y++) { + float value; + f[1] = (y + addy)*ycoef; + value=delta+TCOD_noise_get_fbm(noise,f,octaves)*scale; + hm->values[offset] += value; + if ( value < min ) min = value; + if ( value > max ) max=value; + offset+=hm->w; + } + } +} +void TCOD_heightmap_scale_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale) { + int x,y; + float xcoef=mulx / hm->w; + float ycoef=muly / hm->h; + for (x=0; x < hm->w; x++) { + float f[2]; + int offset=x; + f[0] = (x + addx) * xcoef; + for (y=0; y < hm->h; y++) { + f[1] = (y + addy)*ycoef; + hm->values[offset] *= (delta+TCOD_noise_get_fbm(noise,f,octaves)*scale); + offset+=hm->w; + } + } +} + +float TCOD_heightmap_get_interpolated_value(const TCOD_heightmap_t *hm, float x, float y) { + int ix = (int) x; + int iy = (int) y; + if ( ix >= hm->w-1 || iy >= hm->h-1 ) { + return GET_VALUE(hm,ix,iy); + } else { + float dx = x - ix; + float dy = y - iy; + float c1 = GET_VALUE(hm,ix,iy); + float c2 = GET_VALUE(hm,ix+1,iy); + float c3 = GET_VALUE(hm,ix,iy+1); + float c4 = GET_VALUE(hm,ix+1,iy+1); + float top = (1.0f-dx)*c1 + dx*c2; + float bottom = (1.0f-dx)*c3 + dx*c4; + return (1.0f-dy)*top + dy*bottom; + } +} + +void TCOD_heightmap_get_normal(const TCOD_heightmap_t *hm, float x, float y, float n[3], float waterLevel) { + float h0,hx,hy,invlen; /* map heights at x,y x+1,y and x,y+1 */ + n[0]=0.0f;n[1]=0.0f;n[2]=1.0f; + if ( x >= hm->w-1 || y >= hm->h-1 ) return; + h0 = TCOD_heightmap_get_interpolated_value(hm,x,y); + if ( h0 < waterLevel ) h0=waterLevel; + hx = TCOD_heightmap_get_interpolated_value(hm,x+1,y); + if ( hx < waterLevel ) hx=waterLevel; + hy = TCOD_heightmap_get_interpolated_value(hm,x,y+1); + if ( hy < waterLevel ) hy=waterLevel; + /* vx = 1 vy = 0 */ + /* 0 1 */ + /* hx-h0 hy-h0 */ + /* vz = vx cross vy */ + n[0] = 255*(h0-hx); + n[1] = 255*(h0-hy); + n[2] = 16.0f; + /* normalize */ + invlen=1.0f / (float)sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); + n[0]*=invlen; + n[1]*=invlen; + n[2]*=invlen; +} + +void TCOD_heightmap_dig_bezier(TCOD_heightmap_t *hm, int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth) { + int xFrom=px[0]; + int yFrom=py[0]; + float t; + for ( t=0.0f;t <= 1.0f ; t += 0.001f ) { + int xTo,yTo; + float it=1.0f-t; + xTo=(int)(px[0]*it*it*it + 3*px[1]*t*it*it + 3*px[2]*t*t*it + px[3]*t*t*t); + yTo=(int)(py[0]*it*it*it + 3*py[1]*t*it*it + 3*py[2]*t*t*it + py[3]*t*t*t); + if ( xTo != xFrom || yTo != yFrom ) { + float radius=startRadius+(endRadius-startRadius)*t; + float depth=startDepth+(endDepth-startDepth)*t; + TCOD_heightmap_dig_hill(hm,(float)xTo,(float)yTo,radius,depth); + xFrom=xTo; + yFrom=yTo; + } + } +} + +bool TCOD_heightmap_has_land_on_border(const TCOD_heightmap_t *hm, float waterLevel) { + int x,y; + for (x=0; x < hm->w; x++) { + if ( GET_VALUE(hm,x,0) > waterLevel + || GET_VALUE(hm,x,hm->h-1) > waterLevel ) { + return true; + } + } + for (y=0; y < hm->h; y++) { + if ( GET_VALUE(hm,0,y) > waterLevel + || GET_VALUE(hm,hm->w-1,y) > waterLevel ) { + return true; + } + } + return false; +} + +void TCOD_heightmap_islandify(TCOD_heightmap_t *hm, float seaLevel,TCOD_random_t rnd) { + /* TODO */ +} + +void TCOD_heightmap_add(TCOD_heightmap_t *hm, float value) { + int i; + for (i=0; i < hm->w*hm->h; i++ ) hm->values[i]+=value; +} + +int TCOD_heightmap_count_cells(const TCOD_heightmap_t *hm, float min, float max) { + int count=0,i; + for (i=0; i < hm->w*hm->h; i++ ) if (hm->values[i] >= min && hm->values[i] <= max) count++; + return count; +} + +void TCOD_heightmap_scale(TCOD_heightmap_t *hm, float value) { + int i; + for (i=0; i < hm->w*hm->h; i++ ) hm->values[i]*=value; +} + +void TCOD_heightmap_clamp(TCOD_heightmap_t *hm, float min, float max) { + int i; + for (i=0; i < hm->w*hm->h; i++ ) { + hm->values[i]=CLAMP(min,max,hm->values[i]); + } +} + +void TCOD_heightmap_lerp_hm(const TCOD_heightmap_t *hm1, const TCOD_heightmap_t *hm2, TCOD_heightmap_t *hmres, float coef) { + int i; + if ( hm1->w != hm2->w || hm1->h != hm2->h + || hm1->w != hmres->w || hm1->h != hmres->h + ) { + return; + } + for (i=0; i < hm1->w*hm1->h; i++ ) { + hmres->values[i]=hm1->values[i]+(hm2->values[i]-hm1->values[i])*coef; + } +} + +void TCOD_heightmap_add_hm(const TCOD_heightmap_t *hm1, const TCOD_heightmap_t *hm2, TCOD_heightmap_t *hmres) { + int i; + if ( hm1->w != hm2->w || hm1->h != hm2->h + || hm1->w != hmres->w || hm1->h != hmres->h + ) { + return; + } + for (i=0; i < hm1->w*hm1->h; i++ ) { + hmres->values[i]=hm1->values[i]+hm2->values[i]; + } +} + +void TCOD_heightmap_multiply_hm(const TCOD_heightmap_t *hm1, const TCOD_heightmap_t *hm2, TCOD_heightmap_t *hmres) { + int i; + if ( hm1->w != hm2->w || hm1->h != hm2->h + || hm1->w != hmres->w || hm1->h != hmres->h + ) { + return; + } + for (i=0; i < hm1->w*hm1->h; i++ ) { + hmres->values[i]=hm1->values[i]*hm2->values[i]; + } +} + + +float TCOD_heightmap_get_slope(const TCOD_heightmap_t *hm, int x, int y) { + static int dix[8]={-1,0,1,-1,1,-1,0,1}; + static int diy[8]={-1,-1,-1,0,0,1,1,1}; + float mindy=0.0f,maxdy=0.0f; + float v=GET_VALUE(hm,x,y); + int i; + for (i=0; i < 8; i++ ) { + int nx=x+dix[i]; + int ny=y+diy[i]; + if ( nx >= 0 && nx < hm->w && ny >= 0 && ny < hm->h ) { + float nslope=(GET_VALUE(hm,nx,ny)-v); + if ( nslope > maxdy ) { + maxdy=nslope; + } else if ( nslope < mindy ) { + mindy=nslope; + } + } + } + return (float)atan2(maxdy+mindy,1.0f); +} + +void TCOD_heightmap_rain_erosion(TCOD_heightmap_t *hm, int nbDrops,float erosionCoef,float agregationCoef,TCOD_random_t rnd) { + while ( nbDrops > 0 ) { + int curx=TCOD_random_get_int(rnd,0,hm->w-1); + int cury=TCOD_random_get_int(rnd,0,hm->h-1); + static int dx[8]={-1,0,1,-1,1,-1,0,1}; + static int dy[8]={-1,-1,-1,0,0,1,1,1}; + float slope=0.0f; + float sediment=0.0f; + do { + int nextx=0,nexty=0,i; + float v=GET_VALUE(hm,curx,cury); + /* calculate slope at x,y */ + slope=0.0f; + for (i=0; i < 8; i++ ) { + int nx=curx+dx[i]; + int ny=cury+dy[i]; + if ( nx >= 0 && nx < hm->w && ny >= 0 && ny < hm->h ) { + float nslope=v-GET_VALUE(hm,nx,ny); + if ( nslope > slope ) { + slope=nslope; + nextx=nx; + nexty=ny; + } + } + } + if ( slope > 0.0f ) { +/* GET_VALUE(hm,curx,cury) *= 1.0f - (erosionCoef * slope); */ + GET_VALUE(hm,curx,cury) -= erosionCoef * slope; + curx=nextx; + cury=nexty; + sediment+=slope; + } else { +/* GET_VALUE(hm,curx,cury) *= 1.0f + (agregationCoef*sediment); */ + GET_VALUE(hm,curx,cury) += agregationCoef*sediment; + } + } while ( slope > 0.0f ); + nbDrops--; + } +} + +#if 0 +static void setMPDHeight(TCOD_heightmap_t *hm, TCOD_random_t rnd,int x,int y, float z, float offset); +static void setMDPHeightSquare(TCOD_heightmap_t *hm, TCOD_random_t rnd,int x, int y, int initsz, int sz,float offset); + +void TCOD_heightmap_heat_erosion(TCOD_heightmap_t *hm, int nbPass,float minSlope,float erosionCoef,float agregationCoef,TCOD_random_t rnd) { + int x; + while ( nbPass > 0 ) { + for (x=0; x < hm->w; x++) { + int offset=x,y; + for (y=0; y < hm->h; y++) { + static int dx[8]={-1,0,1,-1,1,-1,0,1}; + static int dy[8]={-1,-1,-1,0,0,1,1,1}; + int nextx=0,nexty=0,i; + float v=hm->values[offset]; + /* calculate slope at x,y */ + float slope=0.0f; + for (i=0; i < 8; i++ ) { /* 4 : von neumann neighbourhood 8 : moore neighbourhood */ + int nx=x+dx[i]; + int ny=y+dy[i]; + if ( nx >= 0 && nx < hm->w && ny >= 0 && ny < hm->h ) { + float nslope=v-GET_VALUE(hm,nx,ny); + if ( nslope > slope ) { + slope=nslope; + nextx=nx; + nexty=ny; + } + } + } + if ( slope > minSlope ) { + GET_VALUE(hm,x,y) -= erosionCoef*(slope-minSlope); + GET_VALUE(hm,nextx,nexty) += agregationCoef*(slope-minSlope); + } + offset+=hm->w; + } + } + nbPass--; + } +} +#endif + +void TCOD_heightmap_kernel_transform(TCOD_heightmap_t *hm, int kernelsize, const int *dx, const int *dy, const float *weight, float minLevel,float maxLevel) { + int x,y; + for (x=0; x < hm->w; x++) { + int offset=x; + for (y=0; y < hm->h; y++) { + if ( hm->values[offset] >= minLevel && hm->values[offset] <= maxLevel ) { + float val=0.0f; + float totalWeight=0.0f; + int i; + for (i=0; i < kernelsize; i++ ) { + int nx=x+dx[i]; + int ny=y+dy[i]; + if ( nx >= 0 && nx < hm->w && ny >= 0 && ny < hm->h ) { + val+=weight[i]*GET_VALUE(hm,nx,ny); + totalWeight+=weight[i]; + } + } + hm->values[offset]=val/totalWeight; + } + offset+=hm->w; + } + } + +} + +void TCOD_heightmap_add_voronoi(TCOD_heightmap_t *hm, int nbPoints, int nbCoef, const float *coef,TCOD_random_t rnd) { + typedef struct { + int x,y; + float dist; + } point_t; + point_t *pt; + int i,x,y; + if ( nbPoints <= 0 ) return; + pt=(point_t *)malloc(sizeof(point_t)*nbPoints); + for (i=0; i < nbPoints; i++ ) { + pt[i].x = TCOD_random_get_int(rnd,0,hm->w-1); + pt[i].y = TCOD_random_get_int(rnd,0,hm->h-1); + } + for (x=0; x < hm->w; x++) { + int offset=x; + for (y=0; y < hm->h; y++) { + /* calculate distance to voronoi points */ + for (i=0; i < nbPoints; i++ ) { + pt[i].dist = (float)(pt[i].x-x)*(pt[i].x-x)+(pt[i].y-y)*(pt[i].y-y); + } + for (i=0; i < nbCoef; i++ ) { + /* get closest point */ + float minDist=1E8f; + int idx=-1,j; + for (j=0; j < nbPoints; j++ ) { + if ( pt[j].dist < minDist ) { + idx=j; + minDist=pt[j].dist; + } + } + hm->values[offset]+=coef[i]*pt[idx].dist; + pt[idx].dist=1E8f; + } + offset+= hm->w; + } + } + free(pt); +} + +static void setMPDHeight(TCOD_heightmap_t *hm, TCOD_random_t rnd,int x,int y, float z, float offset); +static void setMDPHeightSquare(TCOD_heightmap_t *hm, TCOD_random_t rnd,int x, int y, int initsz, int sz,float offset); + +void TCOD_heightmap_mid_point_displacement(TCOD_heightmap_t *hm, TCOD_random_t rnd, float roughness) { + int step = 1; + float offset = 1.0f; + int initsz = MIN(hm->w,hm->h)-1; + int sz = initsz; + hm->values[0] = TCOD_random_get_float(rnd,0.0f,1.0f); + hm->values[sz-1] = TCOD_random_get_float(rnd,0.0f,1.0f); + hm->values[(sz-1)*sz] = TCOD_random_get_float(rnd,0.0f,1.0f); + hm->values[sz*sz-1] = TCOD_random_get_float(rnd,0.0f,1.0f); + while (sz > 0) { + int x,y; + /* diamond step */ + for (x=0; x < step; x++ ) { + for (y=0; y < step; y++ ) { + int diamondx = sz / 2 + x * sz; + int diamondy = sz / 2 + y * sz; + float z= GET_VALUE(hm,x*sz,y*sz); + z += GET_VALUE(hm,(x+1)*sz,y*sz); + z += GET_VALUE(hm,(x+1)*sz,(y+1)*sz); + z += GET_VALUE(hm,x*sz,(y+1)*sz); + z *= 0.25f; + setMPDHeight(hm,rnd,diamondx,diamondy,z,offset); + } + } + offset*=roughness; + /* square step */ + for (x=0; x < step; x++ ) { + for (y=0; y < step; y++ ) { + int diamondx = sz / 2 + x * sz; + int diamondy = sz / 2 + y * sz; + /* north */ + setMDPHeightSquare(hm, rnd, diamondx, diamondy-sz/2, initsz,sz/2, offset); + /* south */ + setMDPHeightSquare(hm, rnd, diamondx, diamondy+sz/2, initsz,sz/2, offset); + /* west */ + setMDPHeightSquare(hm, rnd, diamondx-sz/2, diamondy, initsz,sz/2, offset); + /* east */ + setMDPHeightSquare(hm, rnd, diamondx+sz/2, diamondy, initsz,sz/2, offset); + } + } + sz /= 2; + step *= 2; + } +} + +/* private stuff */ +static void setMPDHeight(TCOD_heightmap_t *hm, TCOD_random_t rnd,int x,int y, float z, float offset) { + z += TCOD_random_get_float(rnd,-offset,offset); + GET_VALUE(hm,x,y)=z; +} + +static void setMDPHeightSquare(TCOD_heightmap_t *hm, TCOD_random_t rnd,int x, int y, int initsz, int sz,float offset) { + float z=0; + int count=0; + if ( y >= sz ) { + z += GET_VALUE(hm,x,y-sz); + count++; + } + if ( x >= sz ) { + z += GET_VALUE(hm,x-sz,y); + count++; + } + if ( y+sz < initsz ) { + z += GET_VALUE(hm,x,y+sz); + count++; + } + if ( x+sz < initsz ) { + z += GET_VALUE(hm,x+sz,y); + count++; + } + z /= count; + setMPDHeight(hm,rnd,x,y,z,offset); +} diff --git a/tcod/tcod_sys/libtcod/src/image.cpp b/tcod/tcod_sys/libtcod/src/image.cpp new file mode 100644 index 00000000..74e5cc63 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/image.cpp @@ -0,0 +1,124 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "libtcod.hpp" +#include "libtcod.h" + +TCODImage::TCODImage(const char *filename) : deleteData(true) { + data=(void *)TCOD_image_load(filename); +} + +TCODImage::TCODImage(int width, int height) : deleteData(true) { + data=(void *)TCOD_image_new(width,height); +} + +TCODImage::TCODImage(const TCODConsole *con) { + data=(void *)TCOD_image_from_console(con->data); +} + +void TCODImage::clear(const TCODColor col) { + TCOD_color_t ccol; + ccol.r=col.r; + ccol.g=col.g; + ccol.b=col.b; + TCOD_image_clear(data,ccol); +} + +void TCODImage::getSize(int *w,int *h) const { + TCOD_image_get_size(data,w,h); +} + +TCODImage::~TCODImage() { + if ( deleteData ) TCOD_image_delete(data); +} + +TCODColor TCODImage::getPixel(int x, int y) const { + return TCOD_image_get_pixel(data,x,y); +} + +int TCODImage::getAlpha(int x,int y) const { + return TCOD_image_get_alpha(data,x,y); +} + +TCODColor TCODImage::getMipmapPixel(float x0,float y0, float x1, float y1) { + return TCOD_image_get_mipmap_pixel(data,x0,y0,x1,y1); +} + +void TCODImage::putPixel(int x, int y, const TCODColor col) { + TCOD_color_t ccol = {col.r,col.g,col.b}; + TCOD_image_put_pixel(data,x,y,ccol); +} + +void TCODImage::blit(TCODConsole *console, float x, float y, TCOD_bkgnd_flag_t bkgnd_flag, float scalex, float scaley, float angle) const { + TCOD_image_blit(data,console->data,x,y,bkgnd_flag,scalex,scaley,angle); +} + +void TCODImage::blitRect(TCODConsole *console, int x, int y, int w, int h, TCOD_bkgnd_flag_t bkgnd_flag) const { + TCOD_image_blit_rect(data,console->data,x,y,w,h,bkgnd_flag); +} + +void TCODImage::save(const char *filename) const { + TCOD_image_save(data,filename); +} + +void TCODImage::setKeyColor(const TCODColor keyColor) { + TCOD_color_t ccol = {keyColor.r,keyColor.g,keyColor.b}; + TCOD_image_set_key_color(data,ccol); +} + +bool TCODImage::isPixelTransparent(int x, int y) const { + return TCOD_image_is_pixel_transparent(data,x,y) != 0; +} + +void TCODImage::refreshConsole(const TCODConsole *console) { + TCOD_image_refresh_console(data,console->data); +} + +void TCODImage::invert() { + TCOD_image_invert(data); +} + +void TCODImage::hflip() { + TCOD_image_hflip(data); +} + +void TCODImage::rotate90(int numRotations) { + TCOD_image_rotate90(data,numRotations); +} + +void TCODImage::vflip() { + TCOD_image_vflip(data); +} + +void TCODImage::scale(int neww, int newh) { + TCOD_image_scale(data,neww,newh); +} + + +void TCODImage::blit2x(TCODConsole *dest, int dx, int dy, int sx, int sy, int w, int h) const { + TCOD_image_blit_2x(data,dest->data,dx,dy,sx,sy,w,h); +} diff --git a/tcod/tcod_sys/libtcod/src/image_c.c b/tcod/tcod_sys/libtcod/src/image_c.c new file mode 100644 index 00000000..18c1664e --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/image_c.c @@ -0,0 +1,804 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +typedef struct { + int width,height; + float fwidth,fheight; + TCOD_color_t *buf; + bool dirty; +} mipmap_t; + +typedef struct { + void *sys_img; + int nb_mipmaps; + mipmap_t *mipmaps; + TCOD_color_t key_color; + bool has_key_color; +} image_data_t; + +static int TCOD_image_get_mipmap_levels(int width, int height) { + int curw=width; + int curh=height; + int nb_mipmap=0; + while ( curw > 0 && curh > 0 ) { + nb_mipmap++; + curw >>= 1; + curh >>= 1; + } + return nb_mipmap; +} + +static void TCOD_image_generate_mip(image_data_t *img, int mip) { + mipmap_t *orig=&img->mipmaps[0]; + mipmap_t *cur =&img->mipmaps[mip]; + int x,y; + if (! cur->buf) { + cur->buf=(TCOD_color_t *)calloc(sizeof(TCOD_color_t),cur->width*cur->height); + } + cur->dirty=false; + for (x=0; x < cur->width; x++) { + for (y=0; y < cur->height; y++) { + int r=0,g=0,b=0, count=0; + int sx,sy; + TCOD_color_t *col; + for (sx=(x << mip); sx < ((x+1)<width; + count++; + r+=orig->buf[offset].r; + g+=orig->buf[offset].g; + b+=orig->buf[offset].b; + } + } + r /= count; + g /= count; + b /= count; + col = &cur->buf[x+y*cur->width]; + col->r=r; + col->g=g; + col->b=b; + } + } +} + +static void TCOD_image_init_mipmaps(image_data_t *img) { + int w,h,i,x,y; + float fw,fh; + if (! img->sys_img ) return; + TCOD_sys_get_image_size(img->sys_img,&w,&h); + img->nb_mipmaps=TCOD_image_get_mipmap_levels(w,h); + img->mipmaps = (mipmap_t *)calloc(sizeof(mipmap_t),img->nb_mipmaps); + img->mipmaps[0].buf = (TCOD_color_t *)calloc(sizeof(TCOD_color_t),w*h); + for (x=0; x < w; x++) { + for (y=0;y < h; y++) { + img->mipmaps[0].buf[x+y*w]=TCOD_sys_get_image_pixel(img->sys_img,x,y); + } + } + fw=(float)w; + fh=(float)h; + for ( i=0; i < img->nb_mipmaps; i++) { + img->mipmaps[i].width=w; + img->mipmaps[i].height=h; + img->mipmaps[i].fwidth=fw; + img->mipmaps[i].fheight=fh; + img->mipmaps[i].dirty=true; + w >>= 1; + h >>= 1; + fw *= 0.5f; + fh *= 0.5f; + } + img->mipmaps[0].dirty=false; +} + +void TCOD_image_clear(TCOD_image_t image, TCOD_color_t color) { + int i; + image_data_t *img=(image_data_t *)image; + if ( !img->mipmaps && !img->sys_img) return; /* no image data */ + if ( ! img->mipmaps ) { + TCOD_image_init_mipmaps(img); + } + for (i=0; i< img->mipmaps[0].width*img->mipmaps[0].height; i++) { + img->mipmaps[0].buf[i] = color; + } + for ( i=1; i < img->nb_mipmaps; i++) { + img->mipmaps[i].dirty=true; + } +} + +TCOD_image_t TCOD_image_new(int width, int height) { + int i; + float fw,fh; + image_data_t *ret=(image_data_t *)calloc(sizeof(image_data_t),1); + ret->nb_mipmaps=TCOD_image_get_mipmap_levels(width,height); + ret->mipmaps = (mipmap_t *)calloc(sizeof(mipmap_t),ret->nb_mipmaps); + ret->mipmaps[0].buf = (TCOD_color_t *)calloc(sizeof(TCOD_color_t),width*height); + + for (i=0; i< width*height; i++) { + ret->mipmaps[0].buf[i] = TCOD_black; + } + fw=(float)width; + fh=(float)height; + for ( i=0; i < ret->nb_mipmaps; i++) { + ret->mipmaps[i].width=width; + ret->mipmaps[i].height=height; + ret->mipmaps[i].fwidth=fw; + ret->mipmaps[i].fheight=fh; + width >>= 1; + height >>= 1; + fw *= 0.5f; + fh *= 0.5f; + } + return (TCOD_image_t)ret; +} + +TCOD_image_t TCOD_image_load(const char *filename) { + image_data_t *ret=(image_data_t *)calloc(sizeof(image_data_t),1); + ret->sys_img=TCOD_sys_load_image(filename); + return (TCOD_image_t)ret; +} + +void TCOD_image_get_size(TCOD_image_t image, int *w,int *h) { + image_data_t *img=(image_data_t *)image; + if ( !img->mipmaps && !img->sys_img) return; /* no image data */ + if ( img->mipmaps ) { + *w = img->mipmaps[0].width; + *h = img->mipmaps[0].height; + } else { + TCOD_sys_get_image_size(img->sys_img,w,h); + } +} + +TCOD_color_t TCOD_image_get_pixel(TCOD_image_t image,int x, int y) { + image_data_t *img=(image_data_t *)image; + if ( !img->mipmaps && !img->sys_img) return TCOD_black; /* no image data */ + if ( img->mipmaps ) { + if ( x >= 0 && x < img->mipmaps[0].width + && y >= 0 && y < img->mipmaps[0].height ) { + return img->mipmaps[0].buf[x+y*img->mipmaps[0].width]; + } else { + return TCOD_black; + } + } else { + return TCOD_sys_get_image_pixel(img->sys_img,x,y); + } +} + +int TCOD_image_get_alpha(TCOD_image_t image,int x, int y) { + image_data_t *img=(image_data_t *)image; + if ( img->sys_img ) { + return TCOD_sys_get_image_alpha(img->sys_img,x,y); + } else return 255; +} + +TCOD_color_t TCOD_image_get_mipmap_pixel(TCOD_image_t image,float x0,float y0, float x1, float y1) { + int texel_xsize,texel_ysize, texel_size, texel_x,texel_y; + int cur_size=1; + int mip=0; + image_data_t *img=(image_data_t *)image; + if ( !img->mipmaps && !img->sys_img) return TCOD_black; /* no image data */ + if (!img->mipmaps) TCOD_image_init_mipmaps(img); + texel_xsize=(int)(x1-x0); + texel_ysize=(int)(y1-y0); + texel_size=texel_xsize < texel_ysize ? texel_ysize : texel_xsize; + while ( mip < img->nb_mipmaps-1 && cur_size < texel_size ) { + mip++; + cur_size <<= 1; + } + if ( mip > 0 ) mip --; + texel_x=(int)(x0*(img->mipmaps[mip].width)/img->mipmaps[0].fwidth); + texel_y=(int)(y0*(img->mipmaps[mip].height)/img->mipmaps[0].fheight); + + if (img->mipmaps[mip].buf == NULL || img->mipmaps[mip].dirty) { + TCOD_image_generate_mip(img,mip); + } + if ( texel_x < 0 || texel_y < 0 || texel_x >= img->mipmaps[mip].width || texel_y >= img->mipmaps[mip].height ) + return TCOD_black; + return img->mipmaps[mip].buf[texel_x+texel_y*img->mipmaps[mip].width]; +} + +void TCOD_image_put_pixel(TCOD_image_t image,int x, int y,TCOD_color_t col) { + image_data_t *img=(image_data_t *)image; + if ( !img->mipmaps && !img->sys_img) return; /* no image data */ + if ( ! img->mipmaps ) { + TCOD_image_init_mipmaps(img); + } + if ( x >= 0 && x < img->mipmaps[0].width + && y >= 0 && y < img->mipmaps[0].height ) { + int mip; + img->mipmaps[0].buf[x+y*img->mipmaps[0].width] = col; + for (mip=1; mip < img->nb_mipmaps; mip++) { + img->mipmaps[mip].dirty=true; + } + } +} + +void TCOD_image_delete_internal(TCOD_image_t image) { + image_data_t *img=(image_data_t *)image; + if ( img->mipmaps ) { + int i; + for ( i=0; i < img->nb_mipmaps; i++) { + if ( img->mipmaps[i].buf ) free(img->mipmaps[i].buf); + } + free(img->mipmaps); + } + if ( img->sys_img ) { + TCOD_sys_delete_bitmap(img->sys_img); + } +} + +void TCOD_image_delete(TCOD_image_t image) { + TCOD_image_delete_internal(image); + free(image); +} + +bool TCOD_image_is_pixel_transparent(TCOD_image_t image, int x, int y) { + image_data_t *img=(image_data_t *)image; + TCOD_color_t col=TCOD_image_get_pixel(image,x,y); + if ( img->has_key_color && img->key_color.r == col.r + && img->key_color.g == col.g && img->key_color.b == col.b ) { + return true; + } + if ( TCOD_image_get_alpha(image,x,y) == 0 ) return true; + return false; +} + +void TCOD_image_blit(TCOD_image_t image, TCOD_console_t console, float x, float y, + TCOD_bkgnd_flag_t bkgnd_flag, float scalex, float scaley, float angle) { + int width,height; + image_data_t *img=(image_data_t *)image; + if ( scalex == 0.0f || scaley == 0.0f || bkgnd_flag == TCOD_BKGND_NONE ) return; + TCOD_image_get_size(image,&width,&height); + float rx = x - width * 0.5f; + float ry = y - height * 0.5f; + if ( scalex == 1.0f && scaley == 1.0f && angle == 0.0f && rx == ((int)rx) && ry == ((int)ry)) { + /* clip the image */ + int ix = (int)(x - width*0.5f); + int iy = (int)(y - height*0.5f); + int minx=MAX(ix,0); + int miny=MAX(iy,0); + int maxx=MIN(ix+width,TCOD_console_get_width(console)); + int maxy=MIN(iy+height,TCOD_console_get_height(console)); + int offx=0,offy=0; + int cx,cy; + if ( ix < 0 ) offx=-ix; + if ( iy < 0 ) offy=-iy; + for (cx=minx; cx < maxx; cx ++) { + for (cy=miny; cy < maxy; cy ++) { + TCOD_color_t col=TCOD_image_get_pixel(image,cx-minx+offx,cy-miny+offy); + if ( !img->has_key_color || img->key_color.r != col.r + || img->key_color.g != col.g || img->key_color.b != col.b ) { + TCOD_console_set_char_background(console,cx,cy,col,bkgnd_flag); + } + } + } + } else { + float iw=width/2*scalex; + float ih=height/2*scaley; + /* get the coordinates of the image corners in the console */ + float newx_x = (float)cos(angle); + float newx_y = -(float)sin(angle); + float newy_x = newx_y; + float newy_y = -newx_x; + float x0,y0,x1,y1,x2,y2,x3,y3; /* image corners coordinates */ + int rx,ry,rw,rh; /* rectangular area in the console */ + int cx,cy; + int minx,miny,maxx,maxy; + float invscalex,invscaley; + /* 0 = P - w/2 x' +h/2 y' */ + x0 = x-iw*newx_x+ih*newy_x; + y0 = y-iw*newx_y+ih*newy_y; + /* 1 = P + w/2 x' + h/2 y' */ + x1 = x+iw*newx_x+ih*newy_x; + y1 = y+iw*newx_y+ih*newy_y; + /* 2 = P + w/2 x' - h/2 y' */ + x2 = x+iw*newx_x-ih*newy_x; + y2 = y+iw*newx_y-ih*newy_y; + /* 3 = P - w/2 x' - h/2 y' */ + x3 = x-iw*newx_x-ih*newy_x; + y3 = y-iw*newx_y-ih*newy_y; + /* get the affected rectangular area in the console */ + rx=(int)(MIN(MIN(x0,x1),MIN(x2,x3))); + ry=(int)(MIN(MIN(y0,y1),MIN(y2,y3))); + rw=(int)(MAX(MAX(x0,x1),MAX(x2,x3))) - rx; + rh=(int)(MAX(MAX(y0,y1),MAX(y2,y3))) - ry; + /* clip it */ + minx=MAX(rx,0); + miny=MAX(ry,0); + maxx=MIN(rx+rw,TCOD_console_get_width(console)); + maxy=MIN(ry+rh,TCOD_console_get_height(console)); + invscalex=1.0f / scalex; + invscaley=1.0f / scaley; + for (cx=minx; cx < maxx; cx ++) { + for (cy=miny; cy < maxy; cy ++) { + float ix,iy; + TCOD_color_t col; + /* map the console pixel to the image world */ + ix = (iw+ (cx-x) * newx_x + (cy-y) *(-newy_x))*invscalex; + iy = (ih + (cx-x) * (newx_y) - (cy-y)*newy_y)*invscaley; + col = TCOD_image_get_pixel(image,(int)(ix),(int)(iy)); + if ( !img->has_key_color || img->key_color.r != col.r + || img->key_color.g != col.g || img->key_color.b != col.b ) { + if ( scalex < 1.0f || scaley < 1.0f ) { + col = TCOD_image_get_mipmap_pixel(image,ix,iy,ix+1.0f,iy+1.0f); + } + TCOD_console_set_char_background(console,cx,cy,col,bkgnd_flag); + } + } + } + } +} + +void TCOD_image_blit_rect(TCOD_image_t image, TCOD_console_t console, int x, int y, + int w, int h, TCOD_bkgnd_flag_t bkgnd_flag) { + int width,height; + float scalex,scaley; + TCOD_image_get_size(image,&width,&height); + if ( w == -1 ) w=width; + if ( h == -1 ) h=height; + if ( w <= 0 || h <= 0 || bkgnd_flag == TCOD_BKGND_NONE ) return; + scalex = (float)(w)/width; + scaley = (float)(h)/height; + TCOD_image_blit(image,console,x+w*0.5f,y+h*0.5f,bkgnd_flag,scalex,scaley,0.0f); +} + +TCOD_image_t TCOD_image_from_console(TCOD_console_t console) { + image_data_t *ret; + void *bitmap=TCOD_sys_create_bitmap_for_console(console); + ret=(image_data_t *)calloc(sizeof(image_data_t),1); + ret->sys_img=bitmap; + TCOD_image_refresh_console((TCOD_image_t)ret,console); + return (TCOD_image_t)ret; +} + +void TCOD_image_refresh_console(TCOD_image_t image, TCOD_console_t console) { + image_data_t *img=(image_data_t *)image; + TCOD_sys_console_to_bitmap(img->sys_img, TCOD_console_get_width(console), TCOD_console_get_height(console), + TCOD_console_get_buf(console),NULL); +} + +void TCOD_image_save(TCOD_image_t image, const char *filename) { + image_data_t *img=(image_data_t *)image; + void *bitmap=NULL; + bool must_free=false; + if ( img->sys_img ) { + bitmap=img->sys_img; + } else if ( img->mipmaps ){ + bitmap=TCOD_sys_create_bitmap(img->mipmaps[0].width, img->mipmaps[0].height, img->mipmaps[0].buf); + must_free=true; + } + if (bitmap) { + TCOD_sys_save_bitmap(bitmap, filename); + if ( must_free ) { + TCOD_sys_delete_bitmap(bitmap); + } + } +} + +void TCOD_image_set_key_color(TCOD_image_t image, TCOD_color_t key_color) { + image_data_t *img=(image_data_t *)image; + img->has_key_color=true; + img->key_color=key_color; +} +void TCOD_image_invert(TCOD_image_t image) { + int i,mip; + int width,height; + image_data_t *img=(image_data_t *)image; + if ( !img->mipmaps && !img->sys_img) return; /* no image data */ + if ( ! img->mipmaps ) { + TCOD_image_init_mipmaps(img); + } + TCOD_image_get_size(image,&width,&height); + for (i=0; i< width*height; i++) { + TCOD_color_t col=img->mipmaps[0].buf[i]; + col.r=255-col.r; + col.g=255-col.g; + col.b=255-col.b; + img->mipmaps[0].buf[i] = col; + } + for (mip=1; mip < img->nb_mipmaps; mip++) { + img->mipmaps[mip].dirty=true; + } +} + +void TCOD_image_hflip(TCOD_image_t image) { + int px,py; + int width,height; + TCOD_image_get_size(image,&width,&height); + for (py = 0; py < height; py++ ) { + for (px = 0; px < width/2; px++ ) { + TCOD_color_t col1=TCOD_image_get_pixel(image,px,py); + TCOD_color_t col2=TCOD_image_get_pixel(image,width-1-px,py); + TCOD_image_put_pixel(image,px,py,col2); + TCOD_image_put_pixel(image,width-1-px,py,col1); + } + } +} + +void TCOD_image_vflip(TCOD_image_t image) { + int px,py; + int width,height; + TCOD_image_get_size(image,&width,&height); + for (px = 0; px < width; px++ ) { + for (py = 0; py < height/2; py++ ) { + TCOD_color_t col1=TCOD_image_get_pixel(image,px,py); + TCOD_color_t col2=TCOD_image_get_pixel(image,px,height-1-py); + TCOD_image_put_pixel(image,px,py,col2); + TCOD_image_put_pixel(image,px,height-1-py,col1); + } + } +} + +void TCOD_image_rotate90(TCOD_image_t image, int numRotations) { + int px,py; + int width,height; + numRotations = numRotations % 4; + if (numRotations == 0 ) return; + if ( numRotations < 0 ) numRotations += 4; + TCOD_image_get_size(image,&width,&height); + if (numRotations == 1) { + /* rotate 90 degrees */ + TCOD_image_t newImg=TCOD_image_new(height,width); + image_data_t *img=(image_data_t *)image; + image_data_t *img2=(image_data_t *)newImg; + for (px = 0; px < width; px++ ) { + for (py = 0; py < height; py++ ) { + TCOD_color_t col1=TCOD_image_get_pixel(image,px,py); + TCOD_image_put_pixel(newImg,height-1-py,px,col1); + } + } + TCOD_image_delete_internal(image); + /* update img with the new image content */ + img->mipmaps = img2->mipmaps; + img->sys_img=NULL; + img->nb_mipmaps=img2->nb_mipmaps; + free(img2); + } else if ( numRotations == 2 ) { + /* rotate 180 degrees */ + int maxy=height/2 + ((height & 1) == 1? 1 : 0 ); + for (px = 0; px < width; px++ ) { + for (py = 0; py < maxy; py++ ) { + if ( py != height-1-py || px < width/2 ) { + TCOD_color_t col1=TCOD_image_get_pixel(image,px,py); + TCOD_color_t col2=TCOD_image_get_pixel(image,width-1-px,height-1-py); + TCOD_image_put_pixel(image,px,py,col2); + TCOD_image_put_pixel(image,width-1-px,height-1-py,col1); + } + } + } + } else if (numRotations == 3) { + /* rotate 270 degrees */ + TCOD_image_t newImg=TCOD_image_new(height,width); + image_data_t *img=(image_data_t *)image; + image_data_t *img2=(image_data_t *)newImg; + for (px = 0; px < width; px++ ) { + for (py = 0; py < height; py++ ) { + TCOD_color_t col1=TCOD_image_get_pixel(image,px,py); + TCOD_image_put_pixel(newImg,py,width-1-px,col1); + } + } + TCOD_image_delete_internal(image); + /* update img with the new image content */ + img->mipmaps = img2->mipmaps; + img->sys_img=NULL; + img->nb_mipmaps=img2->nb_mipmaps; + free(img2); + } +} + +void TCOD_image_scale(TCOD_image_t image, int neww, int newh) { + image_data_t *img=(image_data_t *)image; + int px,py; + int width,height; + image_data_t *newimg; + TCOD_image_get_size(image,&width,&height); + if ( neww==width && newh==height ) return; + if ( neww == 0 || newh == 0 ) return; + newimg=(image_data_t *)TCOD_image_new(neww,newh); + + if ( neww < width && newh < height ) { + /* scale down image, using supersampling */ + for (py = 0; py < newh; py++ ) { + float y0 = (float)(py) * height / newh; + float y0floor = (float)floor(y0); + float y0weight = 1.0f - (y0 - y0floor); + int iy0 = (int)y0floor; + + float y1 = (float)(py+1) * height / newh; + float y1floor = (float)floor(y1-0.00001); + float y1weight = (y1 - y1floor); + int iy1 = (int)y1floor; + + for (px = 0; px < neww; px++ ) { + TCOD_color_t col; + float x0 = (float)(px) * width / neww; + float x0floor = (float)floor(x0); + float x0weight = 1.0f - (x0 - x0floor); + int ix0 = (int)x0floor; + + float x1 = (float)(px+1) * width / neww; + float x1floor = (float)floor(x1- 0.00001); + float x1weight = (x1 - x1floor); + int ix1 = (int)x1floor; + + float r=0,g=0,b=0,sumweight=0.0f; + int srcx,srcy; + /* left & right fractional edges */ + for (srcy=(int)(y0+1); srcy < (int)y1; srcy++) { + TCOD_color_t col_left=TCOD_image_get_pixel(image,ix0,srcy); + TCOD_color_t col_right=TCOD_image_get_pixel(image,ix1,srcy); + r += col_left.r * x0weight + col_right.r * x1weight; + g += col_left.g * x0weight + col_right.g * x1weight; + b += col_left.b * x0weight + col_right.b * x1weight; + sumweight += x0weight+x1weight; + } + /* top & bottom fractional edges */ + for (srcx = (int)(x0+1); srcx < (int)x1; srcx++) { + TCOD_color_t col_top=TCOD_image_get_pixel(image,srcx,iy0); + TCOD_color_t col_bottom=TCOD_image_get_pixel(image,srcx,iy1); + r += col_top.r * y0weight + col_bottom.r * y1weight; + g += col_top.g * y0weight + col_bottom.g * y1weight; + b += col_top.b * y0weight + col_bottom.b * y1weight; + sumweight += y0weight+y1weight; + } + /* center */ + for (srcy=(int)(y0+1); srcy < (int)y1; srcy++) { + for (srcx = (int)(x0+1); srcx < (int)x1; srcx++) { + TCOD_color_t col=TCOD_image_get_pixel(image,srcx,srcy); + r += col.r; + g += col.g; + b += col.b; + sumweight += 1.0f; + } + } + /* corners */ + col=TCOD_image_get_pixel(image,ix0,iy0); + r += col.r * (x0weight * y0weight); + g += col.g * (x0weight * y0weight); + b += col.b * (x0weight * y0weight); + sumweight += x0weight * y0weight; + col=TCOD_image_get_pixel(image,ix0,iy1); + r += col.r * (x0weight * y1weight); + g += col.g * (x0weight * y1weight); + b += col.b * (x0weight * y1weight); + sumweight += x0weight * y1weight; + col=TCOD_image_get_pixel(image,ix1,iy1); + r += col.r * (x1weight * y1weight); + g += col.g * (x1weight * y1weight); + b += col.b * (x1weight * y1weight); + sumweight += x1weight * y1weight; + col=TCOD_image_get_pixel(image,ix1,iy0); + r += col.r * (x1weight * y0weight); + g += col.g * (x1weight * y0weight); + b += col.b * (x1weight * y0weight); + sumweight += x1weight * y0weight; + sumweight = 1.0f / sumweight; + r = r*sumweight + 0.5f; + g = g*sumweight + 0.5f; + b = b*sumweight + 0.5f; + col.r=(int)r; + col.g=(int)g; + col.b=(int)b; + TCOD_image_put_pixel(newimg,px,py,col); + } + } + } else { + /* scale up image, using nearest neightbor */ + for (py = 0; py < newh; py++ ) { + int srcy = py * height / newh; + for (px = 0; px < neww; px++ ) { + int srcx = px * width / neww; + TCOD_color_t col=TCOD_image_get_pixel(image,srcx,srcy); + TCOD_image_put_pixel(newimg,px,py,col); + } + } + } + + /* destroy old image */ + TCOD_image_delete_internal(image); + /* update img with the new image content */ + img->mipmaps = newimg->mipmaps; + img->sys_img=NULL; + img->nb_mipmaps=newimg->nb_mipmaps; + free(newimg); +} + + +/* distance between two colors */ +int rgbdist(const TCOD_color_t *c1,const TCOD_color_t *c2) { + int dr=(int)(c1->r)-c2->r; + int dg=(int)(c1->g)-c2->g; + int db=(int)(c1->b)-c2->b; + return dr*dr+dg*dg+db*db; +} + +void getPattern(TCOD_color_t desired[4], TCOD_color_t palette[2], int *nbCols, int *ascii) { + /* adapted from Jeff Lait's code posted on r.g.r.d */ + int flag=0; + /* + pixels have following flag values : + X 1 + 2 4 + flag indicates which pixels uses foreground color (palette[1]) + */ + static int flagToAscii[8] = { + 0, + TCOD_CHAR_SUBP_NE,TCOD_CHAR_SUBP_SW,-TCOD_CHAR_SUBP_DIAG,TCOD_CHAR_SUBP_SE, + TCOD_CHAR_SUBP_E,-TCOD_CHAR_SUBP_N,-TCOD_CHAR_SUBP_NW + }; + int weight[2] = { 0, 0 }; + int i; + + /* First colour trivial. */ + palette[0] = desired[0]; + + /* Ignore all duplicates... */ + for (i = 1; i < 4; i++) { + if (desired[i].r != palette[0].r || desired[i].g != palette[0].g || desired[i].b != palette[0].b) + break; + } + + /* All the same. */ + if (i == 4) { + *nbCols=1; + return; + } + weight[0] = i; + + /* Found a second colour... */ + palette[1] = desired[i]; + weight[1] = 1; + flag |= 1<<(i-1); + *nbCols = 2; + /* remaining colours */ + i++; + while (i< 4) { + if (desired[i].r == palette[0].r && desired[i].g == palette[0].g && desired[i].b == palette[0].b) { + weight[0]++; + } else if (desired[i].r == palette[1].r && desired[i].g == palette[1].g && desired[i].b == palette[1].b) { + flag |= 1<<(i-1); + weight[1]++; + } else { + /* Bah, too many colours, */ + /* merge the two nearest */ + int dist0i=rgbdist(&desired[i], &palette[0]); + int dist1i=rgbdist(&desired[i], &palette[1]); + int dist01=rgbdist(&palette[0],&palette[1]); + if ( dist0i < dist1i ) { + if ( dist0i <= dist01 ) { + /* merge 0 and i */ + palette[0]=TCOD_color_lerp(desired[i],palette[0],weight[0]/(1.0f+weight[0])); + weight[0]++; + } else { + /* merge 0 and 1 */ + palette[0]=TCOD_color_lerp(palette[0],palette[1],(float)(weight[1])/(weight[0]+weight[1])); + weight[0]++; + palette[1]=desired[i]; + flag=1<<(i-1); + } + } else { + if ( dist1i <= dist01 ) { + /* merge 1 and i */ + palette[1]=TCOD_color_lerp(desired[i],palette[1],weight[1]/(1.0f+weight[1])); + weight[1]++; + flag|=1<<(i-1); + } else { + /* merge 0 and 1 */ + palette[0]=TCOD_color_lerp(palette[0],palette[1],(float)(weight[1])/(weight[0]+weight[1])); + weight[0]++; + palette[1]=desired[i]; + flag=1<<(i-1); + } + } + } + i++; + } + *ascii=flagToAscii[flag]; +} + +void TCOD_image_blit_2x(TCOD_image_t image, TCOD_console_t con, int dx, int dy, int sx, int sy, int w, int h) { + TCOD_color_t grid[4]; + TCOD_color_t cols[2]; + int nbCols; + int width,height,ascii,cx,cy; + TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)(con) : TCOD_ctx.root; + image_data_t *img=(image_data_t *)image; + int maxx,maxy; + TCOD_IFNOT(image != NULL && dat != NULL) return; + + TCOD_image_get_size(image,&width,&height); + if ( w == -1 ) w=width; + if ( h == -1 ) h=height; + + /* check that the sx,sy/w,h rectangle is inside the image */ + TCOD_ASSERT(sx >= 0 && sy >= 0 && sx+w <= width && sy+h <= height); + TCOD_IFNOT(w > 0 && h > 0) return; + + sx=MAX(0,sx); + sy=MAX(0,sy); + w = MIN(w,width-sx); + h = MIN(h,height-sy); + + maxx=dx+w/2 <= dat->w ? w : (dat->w-dx)*2; + maxy=dy+h/2 <= dat->h ? h : (dat->h-dy)*2; + /* check that the image is not blitted outside the console */ + TCOD_IFNOT(dx+maxx/2 >= 0 && dy+maxy/2 >= 0 && dx < dat->w && dy < dat->h) return; + maxx+=sx; + maxy+=sy; + + for (cx=sx; cx < maxx; cx += 2) { + for (cy=sy; cy < maxy; cy += 2) { + /* get the 2x2 super pixel colors from the image */ + int conx=dx+(cx-sx)/2; + int cony=dy+(cy-sy)/2; + TCOD_color_t consoleBack=TCOD_console_get_char_background(con,conx,cony); + grid[0]=TCOD_image_get_pixel(image,cx,cy); + if ( img->has_key_color && grid[0].r == img->key_color.r && grid[0].g == img->key_color.g && grid[0].b == img->key_color.b) + grid[0]=consoleBack; + if ( cx < maxx-1 ) { + grid[1]=TCOD_image_get_pixel(image,cx+1,cy); + if ( img->has_key_color && grid[1].r == img->key_color.r && grid[1].g == img->key_color.g && grid[1].b == img->key_color.b) + grid[1]=consoleBack; + } else grid[1]=consoleBack; + if ( cy < maxy-1 ) { + grid[2]=TCOD_image_get_pixel(image,cx,cy+1); + if ( img->has_key_color && grid[2].r == img->key_color.r && grid[2].g == img->key_color.g && grid[2].b == img->key_color.b) + grid[2]=consoleBack; + } else grid[2]=consoleBack; + if ( cx < maxx-1 && cy < maxy-1 ) { + grid[3]=TCOD_image_get_pixel(image,cx+1,cy+1); + if ( img->has_key_color && grid[3].r == img->key_color.r && grid[3].g == img->key_color.g && grid[3].b == img->key_color.b) + grid[3]=consoleBack; + } else grid[3]=consoleBack; + /* analyse color, posterize, get pattern */ + getPattern(grid,cols,&nbCols,&ascii); + if ( nbCols == 1 ) { + /* single color */ + TCOD_console_set_char_background(con,conx,cony,cols[0],TCOD_BKGND_SET); + TCOD_console_set_char(con,conx,cony,' '); + } else { + if ( ascii >= 0 ) { + TCOD_console_set_default_background(con,cols[0]); + TCOD_console_set_default_foreground(con,cols[1]); + TCOD_console_put_char(con,conx,cony,ascii,TCOD_BKGND_SET); + } else { + /* negative ascii code means we need to invert back/fore colors */ + TCOD_console_set_default_background(con,cols[1]); + TCOD_console_set_default_foreground(con,cols[0]); + TCOD_console_put_char(con,conx,cony,-ascii,TCOD_BKGND_SET); + } + } + } + } +} + + + diff --git a/tcod/tcod_sys/libtcod/src/lex.cpp b/tcod/tcod_sys/libtcod/src/lex.cpp new file mode 100644 index 00000000..c0584164 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/lex.cpp @@ -0,0 +1,104 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include "libtcod.hpp" +#include "libtcod_int.h" + +TCODLex::TCODLex( const char **_symbols, const char **_keywords, const char *simpleComment, + const char *commentStart, const char *commentStop, const char *javadocCommentStart, + const char *_stringDelim, int _flags) +{ + data=(void *)TCOD_lex_new(_symbols,_keywords,simpleComment,commentStart,commentStop,javadocCommentStart,_stringDelim,_flags); + +} + +TCODLex::TCODLex() +{ + data= (void *)TCOD_lex_new_intern(); +} + +TCODLex::~TCODLex() +{ + TCOD_lex_delete((TCOD_lex_t *)data); +} + +char *TCODLex::getLastJavadoc() +{ + return TCOD_lex_get_last_javadoc((TCOD_lex_t *)data); +} + + +void TCODLex::setDataBuffer(char *dat) +{ + TCOD_lex_set_data_buffer((TCOD_lex_t *)data,dat); +} + +bool TCODLex::setDataFile(const char *_filename) +{ + return TCOD_lex_set_data_file((TCOD_lex_t *)data,_filename) != 0; +} + +int TCODLex::parse() +{ + return TCOD_lex_parse((TCOD_lex_t *)data); +} + + +int TCODLex::parseUntil(int tokenType) +{ + return TCOD_lex_parse_until_token_type((TCOD_lex_t *)data,tokenType); +} + +int TCODLex::parseUntil(const char *tokenValue) +{ + return TCOD_lex_parse_until_token_value((TCOD_lex_t *)data,tokenValue); +} + +void TCODLex::savepoint(TCODLex *savepoint) +{ + TCOD_lex_savepoint((TCOD_lex_t *)data,(TCOD_lex_t *)(savepoint->data)); +} + +void TCODLex::restore(TCODLex *savepoint) +{ + TCOD_lex_restore((TCOD_lex_t *)data,(TCOD_lex_t *)(savepoint->data)); +} + +bool TCODLex::expect(int tokenType) +{ + return TCOD_lex_expect_token_type((TCOD_lex_t *)data,tokenType) != 0; +} + +bool TCODLex::expect(int tokenType, const char *tokenValue) +{ + return TCOD_lex_expect_token_value((TCOD_lex_t *)data,tokenType,tokenValue) != 0; +} + diff --git a/tcod/tcod_sys/libtcod/src/lex_c.c b/tcod/tcod_sys/libtcod/src/lex_c.c new file mode 100644 index 00000000..e42be059 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/lex_c.c @@ -0,0 +1,699 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include "libtcod.h" + +#define MAX_JAVADOC_COMMENT_SIZE 16384 + +/* damn ANSI C does not know strdup, strcasecmp, strncasecmp */ +char *TCOD_strdup(const char *s) { + uint32 l=strlen(s)+1; + char *ret=malloc(sizeof(char)*l); + memcpy(ret,s,sizeof(char)*l); + return ret; +} + +int TCOD_strcasecmp(const char *s1, const char *s2) { + unsigned char c1,c2; + do { + c1 = *s1++; + c2 = *s2++; + c1 = (unsigned char) tolower( (unsigned char) c1); + c2 = (unsigned char) tolower( (unsigned char) c2); + } while((c1 == c2) && (c1 != '\0')); + return (int) c1-c2; +} + +int TCOD_strncasecmp(const char *s1, const char *s2, size_t n) { + unsigned char c1,c2; + do { + c1 = *s1++; + c2 = *s2++; + c1 = (unsigned char) tolower( (unsigned char) c1); + c2 = (unsigned char) tolower( (unsigned char) c2); + n--; + } while((c1 == c2) && (c1 != '\0') && n > 0); + return (int) c1-c2; +} + +static const char * TCOD_LEX_names[] = { + "unknown token", + "symbol", + "keyword", + "identifier", + "string", + "integer", + "float", + "char", + "eof" +}; + +static char *TCOD_last_error=NULL; + +const char *TCOD_lex_get_token_name(int token_type) { return TCOD_LEX_names[token_type]; } + +static void allocate_tok(TCOD_lex_t *lex, int len) { + if ( lex->toklen > len ) return; + while ( lex->toklen <= len ) lex->toklen *= 2; + lex->tok = (char *)realloc(lex->tok,lex->toklen); +} + + +char *TCOD_lex_get_last_error() { + return TCOD_last_error; +} + +TCOD_lex_t *TCOD_lex_new_intern() { + return (TCOD_lex_t *)calloc(1,sizeof(TCOD_lex_t)); +} + +TCOD_lex_t * TCOD_lex_new( const char **_symbols, const char **_keywords, const char *simpleComment, + const char *commentStart, const char *commentStop, const char *javadocCommentStart, + const char *_stringDelim, int _flags) +{ + TCOD_lex_t *lex=(TCOD_lex_t *)TCOD_lex_new_intern(); + lex->flags = _flags; + lex->last_javadoc_comment = (char *)calloc(sizeof(char),MAX_JAVADOC_COMMENT_SIZE ); + if ( _symbols ) + { + while ( _symbols[ lex->nb_symbols ] ) + { + if ( strlen( _symbols[ lex->nb_symbols ] ) >= TCOD_LEX_SYMBOL_SIZE ) + { + static char msg[255]; + sprintf (msg, "symbol '%s' too long (max size %d)", + _symbols[ lex->nb_symbols ], TCOD_LEX_SYMBOL_SIZE ); + TCOD_last_error=TCOD_strdup(msg); + return NULL; + } + strcpy(lex->symbols[ lex->nb_symbols ], _symbols[ lex->nb_symbols ] ); + lex->nb_symbols++; + } + } + if ( _keywords ) + { + while ( _keywords[ lex->nb_keywords ] ) + { + if ( strlen( _keywords[ lex->nb_keywords ] ) >= TCOD_LEX_KEYWORD_SIZE ) + { + static char msg[255]; + sprintf(msg,"keyword '%s' too long (max size %d)", + _keywords[ lex->nb_keywords ], TCOD_LEX_KEYWORD_SIZE); + TCOD_last_error=TCOD_strdup(msg); + return NULL; + } + if ( lex->flags & TCOD_LEX_FLAG_NOCASE ) + { + char *ptr = (char *)_keywords[ lex->nb_keywords ]; + while ( *ptr ) + { + *ptr = (char)toupper( *ptr); + ptr++; + } + } + strcpy(lex->keywords[ lex->nb_keywords ], _keywords[ lex->nb_keywords ] ); + lex->nb_keywords++; + } + } + lex->simpleCmt = simpleComment; + lex->cmtStart = commentStart; + lex->cmtStop = commentStop; + lex->javadocCmtStart = javadocCommentStart; + lex->stringDelim = _stringDelim; + lex->lastStringDelim='\0'; + lex->tok = (char *)calloc(sizeof(char),256); + lex->toklen=256; + return (TCOD_lex_t *)lex; +} + +char *TCOD_lex_get_last_javadoc(TCOD_lex_t *lex) +{ + if ( ! lex->javadoc_read && lex->last_javadoc_comment[0] != '\0' ) + { + lex->javadoc_read=true; + return lex->last_javadoc_comment; + } + lex->javadoc_read=false; + lex->last_javadoc_comment[0]='\0'; + return NULL; +} + +void TCOD_lex_delete(TCOD_lex_t *lex) +{ + if ( ! lex->savept ) + { + if ( lex->filename ) free( lex->filename ); + if ( lex->buf && lex->allocBuf ) free(lex->buf); + if ( lex->last_javadoc_comment ) free(lex->last_javadoc_comment); + } + lex->filename=NULL; + lex->buf = NULL; + lex->allocBuf=false; + if ( lex->tok ) free(lex->tok); + free(lex); +} + +void TCOD_lex_set_data_buffer_internal(TCOD_lex_t *lex) +{ + lex->file_line = 1; + lex->pos = lex->buf; + lex->token_type = TCOD_LEX_UNKNOWN; + lex->token_int_val = 0; + lex->token_float_val = 0.0; + lex->token_idx = -1; + lex->tok[0] = '\0'; +} + + +void TCOD_lex_set_data_buffer(TCOD_lex_t *lex,char *dat) +{ + lex->buf = dat; + lex->allocBuf = false; + TCOD_lex_set_data_buffer_internal(lex); +} + +bool TCOD_lex_set_data_file(TCOD_lex_t *lex, const char *_filename) +{ + FILE *f; + char *ptr; + long size; + if ( ! _filename ) { + TCOD_last_error = (char *)"Lex.setDatafile(NULL) called"; + return false; + } + f = fopen( _filename, "rb" ); + if ( f == NULL ) + { + static char msg[255]; + sprintf(msg, "Cannot open '%s'", _filename); + TCOD_last_error=TCOD_strdup(msg); + return false; + } + fseek(f, 0, SEEK_END); + size = ftell(f); + fclose(f); + f = fopen( _filename, "r" ); + + lex->buf = (char*)calloc(sizeof(char),(size + 1)); + lex->filename = TCOD_strdup( _filename ); + if ( lex->buf == NULL || lex->filename == NULL ) + { + fclose(f); + if ( lex->buf ) free(lex->buf); + if ( lex->filename ) { + free( lex->filename ); + } + TCOD_last_error=(char *)"Out of memory"; + return false; + } + ptr=lex->buf; + /* can't rely on size to read because of MS/DOS dumb CR/LF handling */ + while ( fgets(ptr, size,f ) ) + { + ptr += strlen(ptr); + } + fclose(f); + TCOD_lex_set_data_buffer_internal(lex); + lex->allocBuf=true; + return true; +} + +void TCOD_lex_get_new_line(TCOD_lex_t *lex) +{ + if ( *(lex->pos) == '\n' ) + { + lex->file_line ++; + lex->pos++; + } +} + +#ifdef TCOD_VISUAL_STUDIO +#pragma warning(disable:4127) /* conditional expression is constant */ +#endif + +int TCOD_lex_get_space(TCOD_lex_t *lex) +{ + char c; + char *startPos=NULL; + while ( 1 ) + { + while ( (c = *lex->pos) <= ' ') + { + if (c=='\n') + TCOD_lex_get_new_line(lex); + else if (c == 0) + return TCOD_LEX_EOF; /* end of file */ + else lex->pos++; + } + if ( lex->simpleCmt && strncmp(lex->pos, lex->simpleCmt, strlen(lex->simpleCmt)) == 0 ) + { + if ( ! startPos ) startPos = lex->pos; + while ( *lex->pos != '\0' && *lex->pos != '\n' ) + lex->pos++; + TCOD_lex_get_new_line(lex); + continue; + } + if ( lex->cmtStart && lex->cmtStop && strncmp(lex->pos, lex->cmtStart, strlen(lex->cmtStart)) == 0 ) + { + int isJavadoc=( lex->javadocCmtStart && strncmp(lex->pos, lex->javadocCmtStart, strlen(lex->javadocCmtStart)) == 0 ); + int cmtLevel=1; + char *javadocStart = NULL; + if ( ! startPos ) startPos = lex->pos; + if ( isJavadoc ) + { + javadocStart=lex->pos+strlen(lex->javadocCmtStart); + while ( isspace(*javadocStart) ) javadocStart++; + } + lex->pos++; + do + { + if ( *lex->pos == '\n' ) + { + TCOD_lex_get_new_line(lex); + } + else + lex->pos++; + if ( *lex->pos == '\0' ) + return TCOD_LEX_EOF; + if ( (lex->flags & TCOD_LEX_FLAG_NESTING_COMMENT) && strncmp(lex->pos-1, lex->cmtStart, strlen(lex->cmtStart)) == 0) cmtLevel++; + if ( strncmp(lex->pos-1, lex->cmtStop, strlen(lex->cmtStop)) == 0) cmtLevel--; + } while ( cmtLevel > 0 ); + lex->pos++; + if ( isJavadoc ) + { + char *src, *dst; + char *end = lex->pos - strlen(lex->cmtStop); + while ( isspace(*end) && end > javadocStart ) end --; + src = javadocStart; + dst = lex->last_javadoc_comment; + while ( src < end ) + { + /* skip heading spaces */ + while ( src < end && isspace(*src) && *src != '\n') src ++; + /* copy comment line */ + while ( src < end && *src != '\n' ) *dst++ = *src++; + if ( *src == '\n' ) *dst++ = *src++; + } + /* remove trailing spaces */ + while ( dst > lex->last_javadoc_comment && isspace (*(dst-1)) ) dst --; + *dst = '\0'; + lex->javadoc_read=false; + } + continue; + } + break; + } + if ( (lex->flags & TCOD_LEX_FLAG_TOKENIZE_COMMENTS) && startPos && lex->pos > startPos ) { + int len = lex->pos - startPos; + allocate_tok(lex, len+1); + strncpy(lex->tok,startPos,len); + lex->tok[len]=0; + lex->token_type = TCOD_LEX_COMMENT; + lex->token_idx = -1; + return TCOD_LEX_COMMENT; + } + return TCOD_LEX_UNKNOWN; +} + + + +int TCOD_lex_hextoint(char c) { + int v=toupper(c); + if ( v >= '0' && v <= '9' ) return v-'0'; + return 10 + (v-'A'); +} + +static bool TCOD_lex_get_special_char(TCOD_lex_t *lex, char *c) { + *c = *(++(lex->pos) ); + + switch ( *c ) + { + case 'n' : *c='\n'; break; + case 't' : *c='\t'; break; + case 'r' : *c='\r'; break; + case '\\' : + case '\"' : + case '\'' : + break; + case 'x' : + { + /* hexadecimal value "\x80" */ + int value=0; + bool hasHex=false; + *c = *(++(lex->pos) ); + while (( *c >= '0' && *c <= '9' ) || (*c >= 'a' && *c <= 'f') || (*c >= 'A' && *c <= 'F') ) { + hasHex=true; + value <<= 4; + value += TCOD_lex_hextoint(*c); + *c = *(++(lex->pos) ); + } + if (! hasHex ) { + TCOD_last_error=(char *)"\\x must be followed by an hexadecimal value"; + return false; + } + *c = value; + lex->pos--; + } + break; + case '0' : + case '1' : + case '2' : + case '3' : + case '4' : + case '5' : + case '6' : + case '7' : + { + /* octal value "\200" */ + int value=0; + while ( *c >= '0' && *c <= '7' ) { + value <<= 3; + value += (*c - '0'); + *c = *(++(lex->pos) ); + } + *c = value; + lex->pos--; + } + break; + default : + TCOD_last_error=(char *)"bad escape sequence inside quote"; + return false; + } + return true; +} + +int TCOD_lex_get_string(TCOD_lex_t *lex) +{ + char c; + int len = 0; + do + { + c= *(++(lex->pos)); + if ( c == '\0' ) { + TCOD_last_error=(char *)"EOF inside quote"; + return TCOD_LEX_ERROR; + } + if ( c == '\n' ) { + TCOD_last_error=(char *)"newline inside quote"; + return TCOD_LEX_ERROR; + } + if ( c== '\\' ) + { + if ( ! TCOD_lex_get_special_char(lex,&c) ) return TCOD_LEX_ERROR; + } + else if ( c == lex->lastStringDelim ) + { + allocate_tok(lex, len); + lex->tok[ len ] = '\0'; + lex->token_type = TCOD_LEX_STRING; + lex->token_idx = -1; + lex->pos++; + return TCOD_LEX_STRING; + } + allocate_tok(lex, len); + lex->tok[ len++ ] = c; + } while ( 1 ); +} + +#ifdef TCOD_VISUAL_STUDIO +#pragma warning(default:4127) /* conditional expression is constant */ +#endif + +int TCOD_lex_get_number(TCOD_lex_t *lex) +{ + int c; + int len; + char *ptr; + int bhex = 0, bfloat = 0; + + len = 0; + if ( *lex->pos == '-' ) + { + allocate_tok(lex, len); + lex->tok[ len ++ ] = '-'; + lex->pos++; + } + + c = toupper(*lex->pos); + + if ( c == '0' && ( lex->pos[1] == 'x' || lex->pos[1]=='X') ) + { + bhex = 1; + allocate_tok(lex, len); + lex->tok[ len ++ ] = '0'; + lex->pos++; + c = toupper( * (lex->pos)); + } + do + { + allocate_tok(lex, len); + lex->tok[ len++ ] = (char)c; + lex->pos++; + if ( c == '.' ) + { + if ( bhex ) { + TCOD_last_error=(char *)"bad constant format"; + return TCOD_LEX_ERROR; + } + bfloat = 1; + } + c = toupper(*lex->pos); + } while ((c >= '0' && c<= '9') + || ( bhex && c >= 'A' && c <= 'F' ) + || c == '.' ); + allocate_tok(lex, len); + lex->tok[len] = 0; + + if ( !bfloat ) + { + lex->token_int_val = strtol( lex->tok, &ptr, 0 ); + lex->token_float_val = (float)lex->token_int_val; + lex->token_type = TCOD_LEX_INTEGER; + lex->token_idx = -1; + return TCOD_LEX_INTEGER; + } + else + { + lex->token_float_val = (float)atof( lex->tok ); + lex->token_type = TCOD_LEX_FLOAT; + lex->token_idx = -1; + return TCOD_LEX_FLOAT; + } +} + +int TCOD_lex_get_char(TCOD_lex_t *lex) +{ + char c; + c= *(++(lex->pos)); + + if ( c == '\0' ) { + TCOD_last_error=(char *)"EOF inside simple quote"; + return TCOD_LEX_ERROR; + } + if ( c == '\n' ) { + TCOD_last_error=(char *)"newline inside simple quote"; + return TCOD_LEX_ERROR; + } + if ( c== '\\' ) + { + if ( ! TCOD_lex_get_special_char(lex,&c) ) return TCOD_LEX_ERROR; + lex->pos++; + } + else + lex->pos++; + + if ( *lex->pos != '\'' ) { + TCOD_last_error= (char *)"bad character inside simple quote" ; + return TCOD_LEX_ERROR; + } + lex->pos ++; + lex->tok[ 0 ] = c; + lex->tok[ 1 ] = '\0'; + lex->token_type = TCOD_LEX_CHAR; + lex->token_int_val = (int)c; + lex->token_idx = -1; + return TCOD_LEX_CHAR; +} + +int TCOD_lex_get_symbol(TCOD_lex_t *lex) +{ + int symb = 0; + static char msg[255]; + + while ( symb < lex->nb_symbols ) + { + if ( ( ( lex->flags & TCOD_LEX_FLAG_NOCASE ) + && TCOD_strncasecmp( lex->symbols[ symb ], lex->pos, strlen( lex->symbols[ symb ] ) ) == 0 ) + || ( strncmp( lex->symbols[ symb ], lex->pos, strlen( lex->symbols[ symb ] ) ) == 0 ) ) + { + strcpy( lex->tok, lex->symbols[ symb ] ); + lex->pos += strlen( lex->symbols[ symb ] ); + lex->token_idx = symb; + lex->token_type = TCOD_LEX_SYMBOL; + return TCOD_LEX_SYMBOL; + } + symb ++; + } + + lex->pos++; + sprintf(msg, "unknown symbol %.10s", lex->pos-1 ); + TCOD_last_error=TCOD_strdup(msg); + return TCOD_LEX_ERROR; +} + +int TCOD_lex_get_iden(TCOD_lex_t *lex) +{ + char c = *lex->pos; + int len = 0, key = 0; + + do + { + allocate_tok(lex, len); + lex->tok[ len++ ] = c; + c = *( ++ (lex->pos) ); + } while ( ( c >= 'a' && c <= 'z' ) + || ( c >= 'A' && c <= 'Z' ) + || ( c >= '0' && c <= '9' ) + || c == '_' ); + allocate_tok(lex, len); + lex->tok[len ] = 0; + + while ( key < lex->nb_keywords ) + { + if ( strcmp( lex->tok, lex->keywords[ key ] ) == 0 + || ( lex->flags & TCOD_LEX_FLAG_NOCASE && TCOD_strcasecmp( lex->tok, lex->keywords[ key ] ) == 0 )) + { + lex->token_type = TCOD_LEX_KEYWORD; + lex->token_idx = key; + return TCOD_LEX_KEYWORD; + } + key ++; + } + + lex->token_type = TCOD_LEX_IDEN; + lex->token_idx = -1; + return TCOD_LEX_IDEN; +} + +int TCOD_lex_parse(TCOD_lex_t *lex) +{ + char *ptr; + int token; + + token = TCOD_lex_get_space(lex); + if ( token == TCOD_LEX_ERROR ) return token; + ptr = lex->pos; + if ( token != TCOD_LEX_UNKNOWN ) + { + lex->token_type = token; + return token; + } + if ( strchr(lex->stringDelim, *ptr) ) + { + lex->lastStringDelim=*ptr; + return TCOD_lex_get_string(lex); + } + if ( *ptr == '\'' ) + { + return TCOD_lex_get_char(lex); + } + if ( isdigit( (int)(*ptr) ) + || ( *ptr == '-' && isdigit( (int)(ptr[1]) ) ) + ) + { + return TCOD_lex_get_number(lex); + } + if ( ( *ptr >= 'a' && *ptr <= 'z' ) || ( *ptr >= 'A' && *ptr <= 'Z' ) + || *ptr == '_' ) + { + return TCOD_lex_get_iden(lex); + } + return TCOD_lex_get_symbol(lex); +} + + +int TCOD_lex_parse_until_token_type(TCOD_lex_t *lex,int tokenType) +{ + int token; + token = TCOD_lex_parse(lex); + if ( token == TCOD_LEX_ERROR ) return token; + while ( token != TCOD_LEX_EOF ) + { + if ( token == tokenType ) + return token; + token = TCOD_lex_parse(lex); + if ( token == TCOD_LEX_ERROR ) return token; + } + return token; +} + +int TCOD_lex_parse_until_token_value(TCOD_lex_t *lex, const char *tokenValue) +{ + int token; + token = TCOD_lex_parse(lex); + if ( token == TCOD_LEX_ERROR ) return token; + { + while ( token != TCOD_LEX_EOF ) + if ( strcmp( lex->tok, tokenValue ) == 0 + || ( ( lex->flags & TCOD_LEX_FLAG_NOCASE ) && TCOD_strcasecmp(lex->tok, tokenValue ) == 0 ) ) + return token; + token = TCOD_lex_parse(lex); + if ( token == TCOD_LEX_ERROR ) return token; + } + return token; +} + +void TCOD_lex_savepoint(TCOD_lex_t *lex,TCOD_lex_t *_savept) +{ + TCOD_lex_t *savept=(TCOD_lex_t *)_savept; + *savept = *lex; + savept->tok = (char *)calloc(sizeof(char),lex->toklen); + strcpy(savept->tok,lex->tok); + savept->savept=true; +} + +void TCOD_lex_restore(TCOD_lex_t *lex,TCOD_lex_t *_savept) +{ + TCOD_lex_t *savept=(TCOD_lex_t *)_savept; + *lex = *savept; + lex->savept=false; +} + +bool TCOD_lex_expect_token_type(TCOD_lex_t *lex,int token_type) +{ + return (TCOD_lex_parse(lex) == token_type); +} + +bool TCOD_lex_expect_token_value(TCOD_lex_t *lex,int token_type, const char *token_value) +{ + TCOD_lex_parse(lex); + return (token_type == lex->token_type && strcmp(lex->tok, token_value) == 0 ); +} + diff --git a/tcod/tcod_sys/libtcod/src/list_c.c b/tcod/tcod_sys/libtcod/src/list_c.c new file mode 100644 index 00000000..1050c45a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/list_c.c @@ -0,0 +1,198 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include /* calloc */ +#include /* NULL/memcpy */ +#include "libtcod.h" + +#define LIST(l) ((TCOD_list_int_t *)l) + +typedef struct { + void **array; + int fillSize; + int allocSize; +} TCOD_list_int_t; + +static void TCOD_list_allocate_int(TCOD_list_t l) { + void **newArray; + int newSize = LIST(l)->allocSize * 2; + if ( newSize == 0 ) newSize = 16; + newArray = (void **)calloc(sizeof(void *),newSize ); + if ( LIST(l)->array ) { + if ( LIST(l)->fillSize > 0 ) memcpy(newArray, LIST(l)->array, sizeof(void *)*LIST(l)->fillSize); + free(LIST(l)->array); + } + LIST(l)->array=newArray; + LIST(l)->allocSize=newSize; +} + +void TCOD_list_set_size(TCOD_list_t l, int size) { + LIST(l)->fillSize=MIN(size,LIST(l)->allocSize); +} + +TCOD_list_t TCOD_list_new() { + return (TCOD_list_t)calloc(1,sizeof(TCOD_list_int_t)); +} + +TCOD_list_t TCOD_list_allocate(int nb_elements) { + TCOD_list_t l=TCOD_list_new(); + LIST(l)->array = (void **)calloc(sizeof(void *),nb_elements); + LIST(l)->allocSize = nb_elements; + return l; +} + +TCOD_list_t TCOD_list_duplicate(TCOD_list_t l) { + int i=0; + void **t; + TCOD_list_int_t *ret=(TCOD_list_int_t *)TCOD_list_new(); + while ( ret->allocSize < LIST(l)->allocSize ) TCOD_list_allocate_int((TCOD_list_t)ret); + ret->fillSize=LIST(l)->fillSize; + for (t=TCOD_list_begin(l); t != TCOD_list_end(l); t++) { + ret->array[i++]=*t; + } + return (TCOD_list_t)ret; +} + +void TCOD_list_delete(TCOD_list_t l) { + if ( l ) { + if ( LIST(l)->array ) free(LIST(l)->array); + free(l); + } +} + +void TCOD_list_push(TCOD_list_t l, const void * elt) { + if ( LIST(l)->fillSize+1 >= LIST(l)->allocSize ) TCOD_list_allocate_int(l); + LIST(l)->array[LIST(l)->fillSize++] = (void *)elt; +} +void * TCOD_list_pop(TCOD_list_t l) { + if ( LIST(l)->fillSize == 0 ) return NULL; + return LIST(l)->array[--(LIST(l)->fillSize)]; +} +void * TCOD_list_peek(TCOD_list_t l) { + if ( LIST(l)->fillSize == 0 ) return NULL; + return LIST(l)->array[LIST(l)->fillSize-1]; +} +void TCOD_list_add_all(TCOD_list_t l, TCOD_list_t l2) { + void **curElt; + for ( curElt = TCOD_list_begin(l2); curElt != TCOD_list_end(l2); curElt ++) { + TCOD_list_push(l,*curElt); + } +} +void * TCOD_list_get(TCOD_list_t l,int idx) { + return LIST(l)->array[idx]; +} +void TCOD_list_set(TCOD_list_t l,const void *elt, int idx) { + if ( idx < 0 ) return; + while ( LIST(l)->allocSize < idx+1 ) TCOD_list_allocate_int(l); + LIST(l)->array[idx]=(void *)elt; + if ( idx+1 > LIST(l)->fillSize ) LIST(l)->fillSize = idx+1; +} +void ** TCOD_list_begin(TCOD_list_t l) { + if ( LIST(l)->fillSize == 0 ) return (void **)NULL; + return &LIST(l)->array[0]; +} +void ** TCOD_list_end(TCOD_list_t l) { + if ( LIST(l)->fillSize == 0 ) return (void **)NULL; + return &LIST(l)->array[LIST(l)->fillSize]; +} +void TCOD_list_reverse(TCOD_list_t l) { + void **head=TCOD_list_begin(l); + void **tail=TCOD_list_end(l); + while ( head < tail ) { + void *tmp=*head; + *head=*tail; + *tail=tmp; + head++; + tail--; + } +} +void **TCOD_list_remove_iterator(TCOD_list_t l, void **elt) { + void **curElt; + for ( curElt = elt; curElt < TCOD_list_end(l)-1; curElt ++) { + *curElt = *(curElt+1); + } + LIST(l)->fillSize--; + if ( LIST(l)->fillSize == 0 ) return ((void **)NULL)-1; + else return elt-1; +} +void TCOD_list_remove(TCOD_list_t l, const void * elt) { + void **curElt; + for ( curElt = TCOD_list_begin(l); curElt != TCOD_list_end(l); curElt ++) { + if ( *curElt == elt ) { + TCOD_list_remove_iterator(l,curElt); + return; + } + } +} +void **TCOD_list_remove_iterator_fast(TCOD_list_t l, void **elt) { + *elt = LIST(l)->array[LIST(l)->fillSize-1]; + LIST(l)->fillSize--; + if ( LIST(l)->fillSize == 0 ) return ((void **)NULL)-1; + else return elt-1; +} +void TCOD_list_remove_fast(TCOD_list_t l, const void * elt) { + void **curElt; + for ( curElt = TCOD_list_begin(l); curElt != TCOD_list_end(l); curElt ++) { + if ( *curElt == elt ) { + TCOD_list_remove_iterator_fast(l,curElt); + return; + } + } +} +bool TCOD_list_contains(TCOD_list_t l,const void * elt) { + void **curElt; + for ( curElt = TCOD_list_begin(l); curElt != TCOD_list_end(l); curElt ++) { + if ( *curElt == elt ) return true; + } + return false; +} +void TCOD_list_clear(TCOD_list_t l) { + LIST(l)->fillSize=0; +} +void TCOD_list_clear_and_delete(TCOD_list_t l) { + void **curElt; + for ( curElt = TCOD_list_begin(l); curElt != TCOD_list_end(l); curElt ++ ) { + free(*curElt); + } + LIST(l)->fillSize=0; +} +int TCOD_list_size(TCOD_list_t l) { + return LIST(l)->fillSize; +} +void **TCOD_list_insert_before(TCOD_list_t l,const void *elt,int before) { + int idx; + if ( LIST(l)->fillSize+1 >= LIST(l)->allocSize ) TCOD_list_allocate_int(l); + for (idx=LIST(l)->fillSize; idx > before; idx--) { + LIST(l)->array[idx]=LIST(l)->array[idx-1]; + } + LIST(l)->array[before]=(void *)elt; + LIST(l)->fillSize++; + return &LIST(l)->array[before]; +} +bool TCOD_list_is_empty(TCOD_list_t l) { + return ( LIST(l)->fillSize == 0 ); +} + diff --git a/tcod/tcod_sys/libtcod/src/mersenne.cpp b/tcod/tcod_sys/libtcod/src/mersenne.cpp new file mode 100644 index 00000000..93b89f4a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/mersenne.cpp @@ -0,0 +1,60 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" +#include "libtcod_int.h" + +static TCODRandom *instance=(TCODRandom *)NULL; + +TCODRandom *TCODRandom::getInstance(void) { + if (! instance ) { + instance=new TCODRandom(TCOD_RNG_CMWC,true); + } + return instance; +} + +TCODRandom::TCODRandom(TCOD_random_algo_t algo, bool allocate) { + if ( allocate ) data = TCOD_random_new(algo); +} + +TCODRandom::TCODRandom(uint32 seed, TCOD_random_algo_t algo) { + data=TCOD_random_new_from_seed(algo, seed); +} + +TCODRandom::~TCODRandom() { + TCOD_random_delete(data); +} + +TCODRandom *TCODRandom::save() const { + TCODRandom *ret=new TCODRandom(((mersenne_data_t *)data)->algo,false); + ret->data=TCOD_random_save(data); + return ret; +} + +void TCODRandom::restore(const TCODRandom *backup) { + TCOD_random_restore(data,backup->data); +} diff --git a/tcod/tcod_sys/libtcod/src/mersenne_c.c b/tcod/tcod_sys/libtcod/src/mersenne_c.c new file mode 100644 index 00000000..f4042cfc --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/mersenne_c.c @@ -0,0 +1,542 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +static TCOD_random_t instance=NULL; +static float rand_div=1.0f/(float)(0xffffffff); +static double rand_div_double = 1.0 / (double)(0xffffffff); + +/* initialize the mersenne twister array */ +static void mt_init(uint32 seed, uint32 mt[624] ) +{ + int i; + mt[0]= seed; + for (i=1; i<624; i++) { + mt[i] = (1812433253 * (mt[i-1] ^ (mt[i-1] >> 30)) + i); + } +} + +/* get the next random value from the mersenne twister array */ +static uint32 mt_rand(uint32 mt[624], int *cur_mt) +{ +#define MT_HIGH_BIT 0x80000000UL +#define MT_LOW_BITS 0x7fffffffUL + uint32 y; + + if (*cur_mt == 624) { + /* our 624 sequence is finished. generate a new one */ + int i; + + for (i=0;i<623;i++) { + y = ( mt[i] & MT_HIGH_BIT ) | ( mt[i+1] & MT_LOW_BITS ); + if ( y & 1 ) { + /* odd y */ + mt[i] = mt[ (i + 397) % 624 ] ^ (y >> 1) ^ 2567483615UL; + } else { + /* even y */ + mt[i] = mt[ (i + 397) % 624 ] ^ (y >> 1); + } + } + y = ( mt[623] & MT_HIGH_BIT ) | ( mt[0] & MT_LOW_BITS ); + if ( y & 1 ) { + /* odd y */ + mt[623] = mt[396] ^ (y >> 1) ^ 2567483615UL; + } else { + mt[623] = mt[396] ^ (y >> 1); + } + + *cur_mt = 0; + } + + y = mt[(*cur_mt)++]; + y ^= (y >> 11); + y ^= (y << 7) & 2636928640UL; + y ^= (y << 15) & 4022730752UL; + y ^= (y >> 18); + return y; +} + +/* get a random float between 0 and 1 */ +static float frandom01(mersenne_data_t *r) { + return (float)mt_rand(r->mt,&r->cur_mt)*rand_div; +} + +/* string hashing function */ +/* not used (yet) +static uint32 hash(const char *data,int len) { + uint32 hash = 0; + uint32 x; + int i; + for(i = 0; i < len; data++, i++) { + hash = (hash << 4) + (*data); + if((x = hash & 0xF0000000L) != 0) { + hash ^= (x >> 24); + hash &= ~x; + } + } + return (hash & 0x7FFFFFFF); +} +*/ + +/* get a random number from the CMWC */ +#define CMWC_GET_NUMBER(num) { unsigned long long t; uint32 x; r->cur=(r->cur+1)&4095; t=18782LL*r->Q[r->cur]+r->c; r->c=(t>>32); x=(uint32)(t+r->c); if (x < r->c) { x++; r->c++; } if((x+1)==0) { r->c++; x=0; } num = (uint32)(r->Q[r->cur] = 0xfffffffe - x); } + +TCOD_random_t TCOD_random_new(TCOD_random_algo_t algo) { + return TCOD_random_new_from_seed(algo,(uint32)time(0)); +} + +TCOD_random_t TCOD_random_get_instance(void) { + if (! instance ) { + instance=TCOD_random_new(TCOD_RNG_CMWC); + } + return instance; +} + +TCOD_random_t TCOD_random_new_from_seed(TCOD_random_algo_t algo, uint32 seed) { + mersenne_data_t *r = (mersenne_data_t *)calloc(sizeof(mersenne_data_t),1); + /* Mersenne Twister */ + if (algo == TCOD_RNG_MT) { + r->algo = TCOD_RNG_MT; + r->cur_mt=624; + mt_init(seed,r->mt); + } + /* Complementary-Multiply-With-Carry or Generalised Feedback Shift Register */ + else { + int i; + /* fill the Q array with pseudorandom seeds */ + uint32 s = seed; + for (i = 0; i < 4096; i++) r->Q[i] = s = (s * 1103515245) + 12345; /* glibc LCG */ + r->c = ((s * 1103515245) + 12345) % 809430660; /* this max value is recommended by George Marsaglia */ + r->cur = 0; + r->algo = TCOD_RNG_CMWC; + } + r->distribution = TCOD_DISTRIBUTION_LINEAR; + return (TCOD_random_t)r; +} + + +int TCOD_random_get_i(TCOD_random_t mersenne, int min, int max) { + mersenne_data_t *r; + int delta; + if (max==min) return min; + else if (max < min) { + int tmp=max; + max=min; + min=tmp; + } + if (!mersenne) mersenne=TCOD_random_get_instance(); + r=(mersenne_data_t *)mersenne; + delta = max - min + 1; + /* return a number from the Mersenne Twister */ + if (r->algo == TCOD_RNG_MT) return ( mt_rand(r->mt,&r->cur_mt) % delta ) + min; + /* or from the CMWC */ + else { + uint32 number; + CMWC_GET_NUMBER(number) + return number % delta + min; + } +} + +float TCOD_random_get_f(TCOD_random_t mersenne,float min, float max) { + mersenne_data_t *r; + float delta,f; + if (max==min) return min; + else if (max < min) { + float tmp=max; + max=min; + min=tmp; + } + if (!mersenne) mersenne=TCOD_random_get_instance(); + r=(mersenne_data_t *)mersenne; + delta = max - min; + /* Mersenne Twister */ + if (r->algo == TCOD_RNG_MT) f = delta * frandom01(r); + /* CMWC */ + else { + uint32 number; + CMWC_GET_NUMBER(number) + f = (float)(number) * rand_div * delta; + } + return min + f; +} + +double TCOD_random_get_d(TCOD_random_t mersenne, double min, double max) { + mersenne_data_t *r; + double delta,f; + if (max==min) return min; + else if (max < min) { + double tmp=max; + max=min; + min=tmp; + } + if (!mersenne) mersenne=TCOD_random_get_instance(); + r=(mersenne_data_t *)mersenne; + delta = max - min; + /* Mersenne Twister */ + if (r->algo == TCOD_RNG_MT) f = delta * (double)frandom01(r); + /* CMWC */ + else { + uint32 number; + CMWC_GET_NUMBER(number) + f = (double)(number) * rand_div_double * delta; + } + return min + f; +} + +void TCOD_random_delete(TCOD_random_t mersenne) { + TCOD_IFNOT(mersenne != NULL) return; + if ( mersenne == instance ) instance = NULL; + free(mersenne); +} +TCOD_random_t TCOD_random_save(TCOD_random_t mersenne) { + mersenne_data_t *ret=(mersenne_data_t *)malloc(sizeof(mersenne_data_t)); + if (!mersenne) mersenne=TCOD_random_get_instance(); + memcpy(ret,mersenne,sizeof(mersenne_data_t)); + return (TCOD_random_t)ret; +} + +void TCOD_random_restore(TCOD_random_t mersenne, TCOD_random_t backup) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + memcpy(mersenne,backup,sizeof(mersenne_data_t)); +} + +/* Box-Muller transform (Gaussian distribution) */ + +double TCOD_random_get_gaussian_double (TCOD_random_t mersenne, double mean, double std_deviation) { + double x1, x2, w, y1; + static double y2; + static bool again = false; + double ret; + if (again) + ret = mean + y2 * std_deviation; + else { + mersenne_data_t *r = NULL; + if (!mersenne) mersenne=TCOD_random_get_instance(); + r = (mersenne_data_t *)mersenne; + /* MT */ + if (r->algo == TCOD_RNG_MT) { + do { + x1 = frandom01(r) * 2.0 - 1.0; + x2 = frandom01(r) * 2.0 - 1.0; + w = x1 * x1 + x2 * x2; + } while (w >= 1.0); + } + /* CMWC */ + else { + uint32 number; + do { + CMWC_GET_NUMBER(number) + x1 = number * rand_div_double * 2.0 - 1.0; + CMWC_GET_NUMBER(number) + x2 = number * rand_div_double * 2.0 - 1.0; + w = x1 * x1 + x2 * x2; + } while (w >= 1.0); + } + w = sqrt((-2.0 * log(w)) / w); + y1 = x1 * w; + y2 = x2 * w; + ret = mean + y1 * std_deviation; + } + again = !again; + return ret; +} + +float TCOD_random_get_gaussian_float (TCOD_random_t mersenne, float mean, float std_deviation) { + return (float)TCOD_random_get_gaussian_double(mersenne, (double)mean, (double)std_deviation); +} + +int TCOD_random_get_gaussian_int (TCOD_random_t mersenne, int mean, int std_deviation) { + double num = TCOD_random_get_gaussian_double(mersenne,(double)mean,(double)std_deviation); + return (num >= 0.0 ? (int)(num + 0.5) : (int)(num - 0.5)); +} + +/* Box-Muller, ranges */ + +double TCOD_random_get_gaussian_double_range (TCOD_random_t mersenne, double min, double max) { + double mean, std_deviation, ret; + if (min > max) { + double tmp = max; + max = min; + min = tmp; + } + mean = (min + max) / 2; + std_deviation = (max - min) / 6.0; /* 6.0 is used because of the three-sigma rule */ + ret = TCOD_random_get_gaussian_double(mersenne, mean, std_deviation); + return CLAMP(min,max,ret); +} + +float TCOD_random_get_gaussian_float_range (TCOD_random_t mersenne, float min, float max) { + if (min > max) { + float tmp = max; + max = min; + min = tmp; + } + return (float)TCOD_random_get_gaussian_double_range (mersenne, (double)min, (double)max); +} + +int TCOD_random_get_gaussian_int_range (TCOD_random_t mersenne, int min, int max) { + double num; + int ret; + if (min > max) { + int tmp = max; + max = min; + min = tmp; + } + num = TCOD_random_get_gaussian_double_range (mersenne, (double)min, (double)max); + ret = (num >= 0.0 ? (int)(num + 0.5) : (int)(num - 0.5)); + return CLAMP(min,max,ret); +} + +/* Box-Muller, ranges with a custom mean */ + +double TCOD_random_get_gaussian_double_range_custom (TCOD_random_t mersenne, double min, double max, double mean) { + double d1, d2, std_deviation, ret; + if (min > max) { + double tmp = max; + max = min; + min = tmp; + } + d1 = max - mean; + d2 = mean - min; + std_deviation = MAX(d1,d2) / 3.0; + ret = TCOD_random_get_gaussian_double(mersenne, mean, std_deviation); + return CLAMP(min,max,ret); +} + +float TCOD_random_get_gaussian_float_range_custom (TCOD_random_t mersenne, float min, float max, float mean) { + if (min > max) { + float tmp = max; + max = min; + min = tmp; + } + return (float)TCOD_random_get_gaussian_double_range_custom (mersenne, (double)min, (double)max, (double)mean); +} + +int TCOD_random_get_gaussian_int_range_custom (TCOD_random_t mersenne, int min, int max, int mean) { + double num; + int ret; + if (min > max) { + int tmp = max; + max = min; + min = tmp; + } + num = TCOD_random_get_gaussian_double_range_custom (mersenne, (double)min, (double)max, (double)mean); + ret = (num >= 0.0 ? (int)(num + 0.5) : (int)(num - 0.5)); + return CLAMP(min,max,ret); +} + +/* Box-Muller, inverted distribution */ + +double TCOD_random_get_gaussian_double_inv (TCOD_random_t mersenne, double mean, double std_deviation) { + double num = TCOD_random_get_gaussian_double(mersenne,mean,std_deviation); + return (num >= mean ? num - (3 * std_deviation) : num + (3 * std_deviation)); +} + +float TCOD_random_get_gaussian_float_inv (TCOD_random_t mersenne, float mean, float std_deviation) { + double num = TCOD_random_get_gaussian_double(mersenne,(double)mean,(double)std_deviation); + return (num >= mean ? (float)(num - (3 * std_deviation)) : (float)(num + (3 * std_deviation))); +} + +int TCOD_random_get_gaussian_int_inv (TCOD_random_t mersenne, int mean, int std_deviation) { + double num = TCOD_random_get_gaussian_double(mersenne,(double)mean,(double)std_deviation); + int inum = (num >= 0.0 ? (int)(num + 0.5) : (int)(num - 0.5)); + return (num >= mean ? inum - (3 * std_deviation) : inum + (3 * std_deviation)); +} + +/* Box-Muller, ranges, inverted distribution */ + +double TCOD_random_get_gaussian_double_range_inv (TCOD_random_t mersenne, double min, double max) { + double mean, std_deviation, ret; + if (min > max) { + double tmp = max; + max = min; + min = tmp; + } + mean = (min + max) / 2.0; + std_deviation = (max - min) / 6.0; /* 6.0 is used because of the three-sigma rule */ + ret = TCOD_random_get_gaussian_double_inv(mersenne, mean, std_deviation); + return CLAMP(min,max,ret); +} + +float TCOD_random_get_gaussian_float_range_inv (TCOD_random_t mersenne, float min, float max) { + float ret = (float)TCOD_random_get_gaussian_double_range_inv(mersenne, (double)min, (double)max); + return CLAMP(min,max,ret); +} + +int TCOD_random_get_gaussian_int_range_inv (TCOD_random_t mersenne, int min, int max) { + double num = TCOD_random_get_gaussian_double_range_inv(mersenne, (double)min, (double)max); + int ret = (num >= 0.0 ? (int)(num + 0.5) : (int)(num - 0.5)); + return CLAMP(min,max,ret); +} + +/* Box-Muller, ranges with a custom mean, inverted distribution */ + +double TCOD_random_get_gaussian_double_range_custom_inv (TCOD_random_t mersenne, double min, double max, double mean) { + double d1, d2, std_deviation, ret; + if (min > max) { + double tmp = max; + max = min; + min = tmp; + } + d1 = max - mean; + d2 = mean - min; + std_deviation = MAX(d1,d2) / 3.0; + ret = TCOD_random_get_gaussian_double_inv(mersenne, mean, std_deviation); + return CLAMP(min,max,ret); +} + +float TCOD_random_get_gaussian_float_range_custom_inv (TCOD_random_t mersenne, float min, float max, float mean) { + float ret = (float)TCOD_random_get_gaussian_double_range_custom_inv(mersenne, (double)min, (double)max, (double)mean); + return CLAMP(min,max,ret); +} + +int TCOD_random_get_gaussian_int_range_custom_inv (TCOD_random_t mersenne, int min, int max, int mean) { + double num = TCOD_random_get_gaussian_double_range_custom_inv(mersenne, (double)min, (double)max, (double)mean); + int ret = (num >= 0.0 ? (int)(num + 0.5) : (int)(num - 0.5)); + return CLAMP(min,max,ret); +} + +void TCOD_random_set_distribution (TCOD_random_t mersenne, TCOD_distribution_t distribution) { + mersenne_data_t *r = NULL; + if (!mersenne) mersenne=TCOD_random_get_instance(); + r = (mersenne_data_t *)mersenne; + r->distribution = distribution; +} + +int TCOD_random_get_int (TCOD_random_t mersenne, int min, int max) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + switch (((mersenne_data_t *)mersenne)->distribution) { + case TCOD_DISTRIBUTION_LINEAR: return TCOD_random_get_i(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN: return TCOD_random_get_gaussian_int(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: return TCOD_random_get_gaussian_int_inv(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE: return TCOD_random_get_gaussian_int_range(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: return TCOD_random_get_gaussian_int_range_inv(mersenne, min, max); break; + default: return TCOD_random_get_i(mersenne, min, max); break; + } +} + +float TCOD_random_get_float (TCOD_random_t mersenne, float min, float max) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + switch (((mersenne_data_t *)mersenne)->distribution) { + case TCOD_DISTRIBUTION_LINEAR: return TCOD_random_get_f(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN: return TCOD_random_get_gaussian_float(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: return TCOD_random_get_gaussian_float_inv(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE: return TCOD_random_get_gaussian_float_range(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: return TCOD_random_get_gaussian_float_range_inv(mersenne, min, max); break; + default: return TCOD_random_get_f(mersenne, min, max); break; + } +} + +double TCOD_random_get_double (TCOD_random_t mersenne, double min, double max) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + switch (((mersenne_data_t *)mersenne)->distribution) { + case TCOD_DISTRIBUTION_LINEAR: return TCOD_random_get_d(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN: return TCOD_random_get_gaussian_double(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: return TCOD_random_get_gaussian_double_inv(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE: return TCOD_random_get_gaussian_double_range(mersenne, min, max); break; + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: return TCOD_random_get_gaussian_double_range_inv(mersenne, min, max); break; + default: return TCOD_random_get_d(mersenne, min, max); break; + } +} + +int TCOD_random_get_int_mean (TCOD_random_t mersenne, int min, int max, int mean) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + switch (((mersenne_data_t *)mersenne)->distribution) { + case TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: return TCOD_random_get_gaussian_int_range_custom_inv(mersenne, min, max, mean); break; + default: return TCOD_random_get_gaussian_int_range_custom(mersenne, min, max, mean); break; + } +} + +float TCOD_random_get_float_mean (TCOD_random_t mersenne, float min, float max, float mean) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + switch (((mersenne_data_t *)mersenne)->distribution) { + case TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: return TCOD_random_get_gaussian_float_range_custom_inv(mersenne, min, max, mean); break; + default: return TCOD_random_get_gaussian_float_range_custom(mersenne, min, max, mean); break; + } +} + +double TCOD_random_get_double_mean (TCOD_random_t mersenne, double min, double max, double mean) { + if (!mersenne) mersenne=TCOD_random_get_instance(); + switch (((mersenne_data_t *)mersenne)->distribution) { + case TCOD_DISTRIBUTION_GAUSSIAN_INVERSE: + case TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE: return TCOD_random_get_gaussian_double_range_custom_inv(mersenne, min, max, mean); break; + default: return TCOD_random_get_gaussian_double_range_custom(mersenne, min, max, mean); break; + } +} + +TCOD_dice_t TCOD_random_dice_new (const char * s) { + TCOD_dice_t d = { 1, 1, 1.0f, 0.0f }; + char * ptr = (char *)s; + char tmp[128]; + size_t l; + /* get multiplier */ + if ((l = strcspn(ptr,"*x")) < strlen(ptr)) { + strcpy(tmp,ptr); + tmp[l] = '\0'; + d.multiplier = (float)atof(tmp); + ptr += l + 1; + } + /* get rolls */ + l = strcspn(ptr,"dD"); + strcpy(tmp,ptr); + tmp[l] = '\0'; + d.nb_rolls = atoi(tmp); + ptr += l + 1; + /* get faces */ + l = strcspn(ptr,"-+"); + strcpy(tmp,ptr); + tmp[l] = '\0'; + d.nb_faces = atoi(tmp); + ptr += l; + /* get addsub */ + if (strlen(ptr) > 0) { + int sign = (*ptr == '+') ? 1 : (-1); + ptr++; + d.addsub = (float)(atof(ptr) * sign); + } + return d; +} + +int TCOD_random_dice_roll (TCOD_random_t mersenne, TCOD_dice_t dice) { + int rolls; + int result = 0; + for (rolls = 0; rolls < dice.nb_rolls; rolls++) + result += TCOD_random_get_i(mersenne,1,dice.nb_faces); + return (int)((result + dice.addsub) * dice.multiplier); +} + +int TCOD_random_dice_roll_s (TCOD_random_t mersenne, const char * s) { + return TCOD_random_dice_roll(mersenne,TCOD_random_dice_new(s)); +} diff --git a/tcod/tcod_sys/libtcod/src/mouse.cpp b/tcod/tcod_sys/libtcod/src/mouse.cpp new file mode 100644 index 00000000..e7652441 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/mouse.cpp @@ -0,0 +1,44 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" + +void TCODMouse::showCursor(bool visible) { + TCOD_mouse_show_cursor(visible); +} + +bool TCODMouse::isCursorVisible() { + return TCOD_mouse_is_cursor_visible() != 0; +} + +void TCODMouse::move(int x, int y) { + TCOD_mouse_move(x,y); +} + +TCOD_mouse_t TCODMouse::getStatus() { + return TCOD_mouse_get_status(); +} + diff --git a/tcod/tcod_sys/libtcod/src/namegen.cpp b/tcod/tcod_sys/libtcod/src/namegen.cpp new file mode 100644 index 00000000..b1d23f1b --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/namegen.cpp @@ -0,0 +1,52 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* Mingos' NameGen +* This file was written by Dominik "Mingos" Marczuk. +*/ + +#include "libtcod.hpp" + +void TCODNamegen::parse (const char * filename, TCODRandom * random) { + TCOD_namegen_parse (filename, random ? random->data : NULL); +} + +char * TCODNamegen::generate (char * name, bool allocate) { + return TCOD_namegen_generate (name, allocate); +} + +char * TCODNamegen::generateCustom (char * name, char * rule, bool allocate) { + return TCOD_namegen_generate_custom (name, rule, allocate); +} + +TCOD_list_t TCODNamegen::getSets (void) { + return TCOD_namegen_get_sets (); +} + +void TCODNamegen::destroy (void) { + TCOD_namegen_destroy (); +} diff --git a/tcod/tcod_sys/libtcod/src/namegen_c.c b/tcod/tcod_sys/libtcod/src/namegen_c.c new file mode 100644 index 00000000..081a7595 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/namegen_c.c @@ -0,0 +1,639 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* Mingos' NameGen +* This file was written by Dominik "Mingos" Marczuk. +*/ + +#include +#include +#include +#include +#include "libtcod.h" + +/* ------------ * + * the typedefs * + * ------------ */ + +/* the struct containing a definition of an unprocessed syllable set */ +typedef struct { + char * name; + char * vocals; + char * consonants; + char * pre; + char * start; + char * middle; + char * end; + char * post; + char * illegal; + char * rules; +} namegen_syllables_t; + +/* and the generator struct */ +typedef struct { + /* the name that will be called */ + char * name; + /* needs to use a random number generator */ + TCOD_random_t random; + /* the lists with all the data */ + TCOD_list_t vocals; + TCOD_list_t consonants; + TCOD_list_t syllables_pre; + TCOD_list_t syllables_start; + TCOD_list_t syllables_middle; + TCOD_list_t syllables_end; + TCOD_list_t syllables_post; + TCOD_list_t illegal_strings; + TCOD_list_t rules; +} namegen_t; + +/* ------------------- * + * variables and stuff * + * ------------------- */ + +/* the list containing the generators */ +TCOD_list_t namegen_generators_list = NULL; + +/* the file parser */ +TCOD_parser_t namegen_parser; +/* parsed files list */ +TCOD_list_t parsed_files = NULL; +/* the data that will be filled out */ +namegen_syllables_t * parser_data = NULL; +namegen_t * parser_output = NULL; +/* this one's needed to correctly update the generators with RNG pointer */ +TCOD_random_t namegen_random; + +/* the string that will be pointed to upon generating a name */ +char * namegen_name = NULL; +/* for keeping track of the size of output names */ +size_t namegen_name_size; + +/* ------------------------------------ * + * stuff to operate on the syllable set * + * ------------------------------------ */ + +/* initialise a syllable set */ +namegen_syllables_t * namegen_syllables_new (void) { + namegen_syllables_t * data = calloc(sizeof(namegen_syllables_t),1); + return data; +} + +/* free a syllables set */ +void namegen_syllables_delete (namegen_syllables_t * data) { + if (data->vocals) free(data->vocals); + if (data->consonants) free(data->consonants); + if (data->pre) free(data->pre); + if (data->start) free(data->start); + if (data->middle) free(data->middle); + if (data->end) free(data->end); + if (data->post) free(data->post); + if (data->illegal) free(data->illegal); + if (data->rules) free(data->rules); + free(data->name); + free(data); +} + +/* ---------------------------------- * + * stuff to operate on the generators * + * ---------------------------------- */ + +/* create a new generator */ +namegen_t * namegen_generator_new (void) { + namegen_t * data = malloc(sizeof(namegen_t)); + data->name = NULL; + /* assign the rng */ + data->random = TCOD_random_get_instance(); + /* create the lists */ + data->vocals = TCOD_list_new(); + data->consonants = TCOD_list_new(); + data->syllables_pre = TCOD_list_new(); + data->syllables_start = TCOD_list_new(); + data->syllables_middle = TCOD_list_new(); + data->syllables_end = TCOD_list_new(); + data->syllables_post = TCOD_list_new(); + data->illegal_strings = TCOD_list_new(); + data->rules = TCOD_list_new(); + return (TCOD_namegen_t)data; +} + +/* check whether a given generator already exists */ +bool namegen_generator_check (const char * name) { + /* if the list is not created yet, create it */ + if (namegen_generators_list == NULL) { + namegen_generators_list = TCOD_list_new(); + return false; + } + /* otherwise, scan it for the name */ + else { + namegen_t ** it; + for (it = (namegen_t**)TCOD_list_begin(namegen_generators_list); it < (namegen_t**)TCOD_list_end(namegen_generators_list); it++) { + if (strcmp((*it)->name,name) == 0) return true; + } + return false; + } +} + +/* retrieve available generator names */ +void namegen_get_sets_on_error (void) { + namegen_t ** it; + fprintf (stderr,"Registered syllable sets are:\n"); + for (it = (namegen_t**)TCOD_list_begin(namegen_generators_list); it < (namegen_t**)TCOD_list_end(namegen_generators_list); it++) { + fprintf (stderr," * \"%s\"\n",(*it)->name); + } +} + +/* get the appropriate syllables set */ +namegen_t * namegen_generator_get (const char * name) { + if (namegen_generator_check(name) == true) { + namegen_t ** it; + for (it = (namegen_t**)TCOD_list_begin(namegen_generators_list); it != (namegen_t**)TCOD_list_end(namegen_generators_list); it++) { + if (strcmp((*it)->name,name) == 0) return (*it); + } + } + /* and if there's no such set... */ + else + fprintf(stderr,"Generator \"%s\" could not be retrieved.\n",name); + return NULL; +} + + + +/* destroy a generator */ +void namegen_generator_delete (namegen_t * generator) { + namegen_t * data = generator; + free(data->name); + data->random = NULL; + TCOD_list_clear_and_delete(data->vocals); + TCOD_list_clear_and_delete(data->consonants); + TCOD_list_clear_and_delete(data->syllables_pre); + TCOD_list_clear_and_delete(data->syllables_start); + TCOD_list_clear_and_delete(data->syllables_middle); + TCOD_list_clear_and_delete(data->syllables_end); + TCOD_list_clear_and_delete(data->syllables_post); + TCOD_list_clear_and_delete(data->illegal_strings); + TCOD_list_clear_and_delete(data->rules); + free(data); +} + +/* ------------------------------ * + * Populating namegen_t with data * + * ------------------------------ */ + +/* fill the pointed list with syllable data by extracting tokens */ +void namegen_populate_list (char * source, TCOD_list_t list, bool wildcards) { + size_t len = strlen(source); + size_t i = 0; + char * token = malloc(strlen(source)+1); /* tokens will typically be many and very short, but let's be cautious. What if the entire string is a single token?*/ + memset(token,'\0',strlen(source)+1); + do { + /* do the tokenising using an iterator immitation :) */ + char * it = source + i; + /* append a normal character */ + if ((*it >= 'a' && *it <= 'z') || (*it >= 'A' && *it <= 'Z') || *it == '\'' || *it == '-') + strncat(token,it,1); + /* special character */ + else if (*it == '/') { + if (wildcards == true) strncat(token,it++,2); + else strncat(token,++it,1); + i++; + } + /* underscore is converted to space */ + else if (*it == '_') { + if (wildcards == true) strncat(token,it,1); + else strcat(token," "); + } + /* add wildcards if they are allowed */ + else if (wildcards == true && (*it == '$' || *it == '%' || (*it >= '0' && *it <= '9'))) + strncat(token,it,1); + /* all other characters are treated as separators and cause adding the current token to the list */ + else if (strlen(token) > 0) { + TCOD_list_push(list,TCOD_strdup(token)); + memset(token,'\0',strlen(source)+1); + } + } while (++i <= len); + free(token); +} + +/* populate all lists of a namegen_t struct */ +void namegen_populate (namegen_t * dst, namegen_syllables_t * src) { + if (dst == NULL || src == NULL) { + fprintf(stderr,"Couldn't populate the name generator with data.\n"); + exit(1); + } + if (src->vocals != NULL) namegen_populate_list (src->vocals,dst->vocals,false); + if (src->consonants != NULL) namegen_populate_list (src->consonants,dst->consonants,false); + if (src->pre != NULL) namegen_populate_list (src->pre,dst->syllables_pre,false); + if (src->start != NULL) namegen_populate_list (src->start,dst->syllables_start,false); + if (src->middle != NULL) namegen_populate_list (src->middle,dst->syllables_middle,false); + if (src->end != NULL) namegen_populate_list (src->end,dst->syllables_end,false); + if (src->post != NULL) namegen_populate_list (src->post,dst->syllables_post,false); + if (src->illegal != NULL) namegen_populate_list (src->illegal,dst->illegal_strings,false); + if (src->rules != NULL) namegen_populate_list (src->rules,dst->rules,true); + dst->name = TCOD_strdup(src->name); +} + +/* -------------------- * + * parser-related stuff * + * -------------------- */ + +/* preparing the parser */ +void namegen_parser_prepare (void) { + static bool namegen_parser_ready = false; + if (namegen_parser_ready == true) return; + else { + TCOD_parser_struct_t parser_name ; + namegen_parser = TCOD_parser_new(); + parser_name = TCOD_parser_new_struct(namegen_parser, "name"); + TCOD_struct_add_property(parser_name, "phonemesVocals", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "phonemesConsonants", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "syllablesPre", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "syllablesStart", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "syllablesMiddle", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "syllablesEnd", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "syllablesPost", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "illegal", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(parser_name, "rules", TCOD_TYPE_STRING, true); + namegen_parser_ready = true; + } +} + +/* parser listener */ +bool namegen_parser_new_struct (TCOD_parser_struct_t str, const char *name) { + parser_data = namegen_syllables_new(); + return true; +} + +bool namegen_parser_flag (const char *name) { + return true; +} + +bool namegen_parser_property(const char *name, TCOD_value_type_t type, TCOD_value_t value) { + if (strcmp(name,"syllablesStart") == 0) parser_data->start = TCOD_strdup(value.s); + else if (strcmp(name,"syllablesMiddle") == 0) parser_data->middle = TCOD_strdup(value.s); + else if (strcmp(name,"syllablesEnd") == 0) parser_data->end = TCOD_strdup(value.s); + else if (strcmp(name,"syllablesPre") == 0) parser_data->pre = TCOD_strdup(value.s); + else if (strcmp(name,"syllablesPost") == 0) parser_data->post = TCOD_strdup(value.s); + else if (strcmp(name,"phonemesVocals") == 0) parser_data->vocals = TCOD_strdup(value.s); + else if (strcmp(name,"phonemesConsonants") == 0) parser_data->consonants = TCOD_strdup(value.s); + else if (strcmp(name,"rules") == 0) parser_data->rules = TCOD_strdup(value.s); + else if (strcmp(name,"illegal") == 0) { /* illegal strings are converted to lowercase */ + char * str ; + int i; + parser_data->illegal = TCOD_strdup(value.s); + str = parser_data->illegal; + for(i = 0; i < (int)strlen(str); i++) str[i] = (char)(tolower(str[i])); + } + else return false; + return true; +} + +bool namegen_parser_end_struct(TCOD_parser_struct_t str, const char *name) { + /* if there's no syllable set by this name, add it to the list */ + if (namegen_generator_check(name) == false) { + parser_data->name = TCOD_strdup(name); + parser_output = namegen_generator_new(); + namegen_populate(parser_output,parser_data); + parser_output->random = namegen_random; + if (namegen_generators_list == NULL) namegen_generators_list = TCOD_list_new(); + TCOD_list_push(namegen_generators_list, (const void*)parser_output); + } + /* free the allocated memory to prevent a memory leak */ + namegen_syllables_delete(parser_data); + return true; +} + +void namegen_parser_error(const char *msg) { + fprintf(stderr,"%s\n",msg); + exit(1); +} + +TCOD_parser_listener_t namegen_listener = { + namegen_parser_new_struct, + namegen_parser_flag, + namegen_parser_property, + namegen_parser_end_struct, + namegen_parser_error +}; + +/* run the parser */ +void namegen_parser_run (const char * filename) { + char ** it; + /* prepare the parser --- this will be executed only once */ + namegen_parser_prepare(); + if (parsed_files == NULL) parsed_files = TCOD_list_new(); + if (TCOD_list_size(parsed_files) > 0) { + for (it = (char **)TCOD_list_begin(parsed_files); it != (char **)TCOD_list_end(parsed_files); it++) + if (strcmp(*it,filename) == 0) return; + } + /* if the file hasn't been parsed yet, add its name to the list so that it's never parsed twice */ + TCOD_list_push(parsed_files,(const void *)TCOD_strdup(filename)); + /* run the parser */ + TCOD_parser_run(namegen_parser,filename,&namegen_listener); +} + +/* --------------- * + * rubbish pruning * + * --------------- */ + +/* search for occurrences of triple characters (case-insensitive) */ +bool namegen_word_has_triples (char * str) { + char * it = str; + char c = (char)(tolower(*it)); + int cnt = 1; + bool has_triples = false; + it++; + while (*it != '\0') { + if ((char)(tolower(*it)) == c) cnt++; + else { + cnt = 1; + c = (char)(tolower(*it)); + } + if (cnt >= 3) has_triples = true; + it++; + } + return has_triples; +} + +/* search for occurrences of illegal strings */ +bool namegen_word_has_illegal (namegen_t * data, char * str) { + /* convert word to lowercase */ + char * haystack = TCOD_strdup(str); + int i; + for(i = 0; i < (int)strlen(haystack); i++) haystack[i] = (char)(tolower(haystack[i])); + /* look for illegal strings */ + if (TCOD_list_size(data->illegal_strings) > 0) { + char ** it; + for (it = (char**)TCOD_list_begin(data->illegal_strings); it != (char**)TCOD_list_end(data->illegal_strings); it++) { + if (strstr(haystack,*it) != NULL) { + free(haystack); + return true; + } + } + } + free(haystack); + return false; +} + +/* removes double spaces, as well as leading and ending spaces */ +void namegen_word_prune_spaces (char * str) { + char * s; + char * data = str; + /* remove leading spaces */ + while (data[0] == ' ') memmove (data, data+1, strlen(data)); + /* reduce double spaces to single spaces */ + while ((s = strstr(data," ")) != NULL) memmove (s, s+1, strlen(s)); + /* remove the final space */ + while (data[strlen(data)-1] == ' ') data[strlen(data)-1] = '\0'; +} + +/* prune repeated "syllables", such as Arnarn */ +bool namegen_word_prune_syllables (char *str) { + char * data = TCOD_strdup(str); + int len = strlen(data); /* length of the string */ + char check[8]; + int i; /* iteration in for loops */ + /* change to lowercase */ + for (i = 0; i < len; i++) data[i] = (char)(tolower(data[i])); + /* start pruning */ + /* 2-character direct repetitions */ + for (i = 0; i < len - 4; i++) { + memset(check,'\0',8); + strncpy(check,data+i,2); + strncat(check,data+i,2); + if (strstr(data,check) != NULL) { + free(data); + return true; + } + } + /* 3-character repetitions (anywhere in the word) - prunes everything, even 10-char repetitions */ + for (i = 0; i < len - 6; i++) { + memset(check,'\0',8); + strncpy(check,data+i,3); + if (strstr(data+i+3,check) != NULL) { + free(data); + return true; + } + } + free(data); + return false; +} + +/* everything stacked together */ +bool namegen_word_is_ok (namegen_t * data, char * str) { + namegen_word_prune_spaces(str); + return + (strlen(str)>0) & + (!namegen_word_has_triples(str)) & + (!namegen_word_has_illegal(data,str)) & + (!namegen_word_prune_syllables(str)); +} + +/* ---------------------------- * + * publicly available functions * + * ---------------------------- */ + +/* parse a new syllable sets file - allocates a new data structure and fills it with necessary content */ +void TCOD_namegen_parse (const char * filename, TCOD_random_t random) { + /* check for file existence */ + FILE * in = fopen(filename,"r"); + if (in == NULL) { + fprintf(stderr,"File \"%s\" not found!\n",filename); + return; + } + fclose(in); + /* set namegen RNG */ + namegen_random = random; + /* run the proper parser - add the file's contents to the data structures */ + namegen_parser_run(filename); +} + +/* generate a name using a given generation rule */ +char * TCOD_namegen_generate_custom (char * name, char * rule, bool allocate) { + namegen_t * data; + size_t buflen = 1024; + char * buf ; + size_t rule_len ; + if (namegen_generator_check(name)) data = namegen_generator_get(name); + else { + fprintf(stderr,"The name \"%s\" has not been found.\n",name); + namegen_get_sets_on_error(); + return NULL; + } + buf = malloc(buflen); + rule_len = strlen(rule); + /* let the show begin! */ + do { + char * it = rule; + memset(buf,'\0',buflen); + while (it <= rule + rule_len) { + /* make sure the buffer is large enough */ + if (strlen(buf) >= buflen) { + char * tmp ; + while (strlen(buf) >= buflen) buflen *= 2; + tmp = malloc(buflen); + strcpy(tmp,buf); + free(buf); + buf = tmp; + } + /* append a normal character */ + if ((*it >= 'a' && *it <= 'z') || (*it >= 'A' && *it <= 'Z') || *it == '\'' || *it == '-') + strncat(buf,it,1); + /* special character */ + else if (*it == '/') { + it++; + strncat(buf,it,1); + } + /* underscore is converted to space */ + else if (*it == '_') strcat(buf," "); + /* interpret a wildcard */ + else if (*it == '$') { + int chance = 100; + it++; + /* food for the randomiser */ + if (*it >= '0' && *it <= '9') { + chance = 0; + while (*it >= '0' && *it <= '9') { + chance *= 10; + chance += (int)(*it) - (int)('0'); + it++; + } + } + /* ok, so the chance of wildcard occurrence is calculated, now evaluate it */ + if (chance >= TCOD_random_get_int(data->random,0,100)) { + TCOD_list_t lst; + switch (*it) { + case 'P': lst = data->syllables_pre; break; + case 's': lst = data->syllables_start; break; + case 'm': lst = data->syllables_middle; break; + case 'e': lst = data->syllables_end; break; + case 'p': lst = data->syllables_post; break; + case 'v': lst = data->vocals; break; + case 'c': lst = data->consonants; break; + case '?': lst = (TCOD_random_get_int(data->random,0,1) == 0 ? data->vocals : data->consonants); break; + default: + fprintf(stderr,"Wrong rules syntax encountered!\n"); + exit(1); + break; + } + if (TCOD_list_size(lst) == 0) + fprintf(stderr,"No data found in the requested string (wildcard *%c). Check your name generation rule %s.\n",*it,rule); + else + strcat(buf,(char*)TCOD_list_get(lst,TCOD_random_get_int(data->random,0,TCOD_list_size(lst)-1))); + } + } + it++; + } + } while (!namegen_word_is_ok(data,buf)); + /* prune the spare spaces out */ + namegen_word_prune_spaces(buf); + /* return the name accordingly */ + if (allocate == true) return buf; + else { + /* take care of ensuring the recipient is sized properly */ + if (namegen_name == NULL) { + namegen_name_size = 64; + namegen_name = malloc (namegen_name_size); + } + while (strlen(buf) > namegen_name_size - 1) { + namegen_name_size *= 2; + free(namegen_name); + namegen_name = malloc(namegen_name_size); + } + strcpy(namegen_name,buf); + free(buf); + return namegen_name; + } +} + +/* generate a name with one of the rules from the file */ +char * TCOD_namegen_generate (char * name, bool allocate) { + namegen_t * data; + int rule_number; + int chance; + char * rule_rolled; + int truncation; + char * rule_parsed ; + char * ret ; + if (namegen_generator_check(name)) data = namegen_generator_get(name); + else { + fprintf(stderr,"The name \"%s\" has not been found.\n",name); + namegen_get_sets_on_error(); + return NULL; + } + /* check if the rules list is present */ + if (TCOD_list_size(data->rules) == 0) { + fprintf(stderr,"The rules list is empty!\n"); + exit(1); + } + /* choose the rule */ + do { + rule_number = TCOD_random_get_int(data->random,0,TCOD_list_size(data->rules)-1); + rule_rolled = (char*)TCOD_list_get(data->rules,rule_number); + chance = 100; + truncation = 0; + if (rule_rolled[0] == '%') { + truncation = 1; + chance = 0; + while (rule_rolled[truncation] >= '0' && rule_rolled[truncation] <= '9') { + chance *= 10; + chance += (int)(rule_rolled[truncation]) - (int)('0'); + truncation++; + } + } + } while (TCOD_random_get_int(data->random,0,100) > chance); + /* OK, we've got ourselves a new rule! */ + rule_parsed = TCOD_strdup(rule_rolled+truncation); + ret = TCOD_namegen_generate_custom(name,rule_parsed,allocate); + free(rule_parsed); + return ret; +} + +/* retrieve the list of all available syllable set names */ +TCOD_list_t TCOD_namegen_get_sets (void) { + TCOD_list_t l = TCOD_list_new(); + if (namegen_generators_list != NULL) { + namegen_t ** it; + for (it = (namegen_t**)TCOD_list_begin(namegen_generators_list); it < (namegen_t**)TCOD_list_end(namegen_generators_list); it++) { + TCOD_list_push(l,(const void*)((*it)->name)); + } + } + return l; +} + +/* delete all the generators */ +void TCOD_namegen_destroy (void) { + /* delete all generators */ + namegen_t ** it; + for (it = (namegen_t**)TCOD_list_begin(namegen_generators_list); it < (namegen_t**)TCOD_list_end(namegen_generators_list); it++) + namegen_generator_delete(*it); + /* clear the generators list */ + TCOD_list_clear(namegen_generators_list); + /* get rid of the parsed files list */ + TCOD_list_clear_and_delete(parsed_files); +} + diff --git a/tcod/tcod_sys/libtcod/src/noise.cpp b/tcod/tcod_sys/libtcod/src/noise.cpp new file mode 100644 index 00000000..a24d4b66 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/noise.cpp @@ -0,0 +1,70 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.hpp" +TCODNoise::TCODNoise(int dimensions, TCOD_noise_type_t type) { + data = TCOD_noise_new(dimensions, TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY, TCODRandom::getInstance()->data); + TCOD_noise_set_type(data,type); +} + +TCODNoise::TCODNoise(int dimensions, TCODRandom *random, TCOD_noise_type_t type) { + data = TCOD_noise_new(dimensions, TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY, random->data); + TCOD_noise_set_type(data,type); +} + +TCODNoise::TCODNoise(int dimensions, float hurst, float lacunarity, TCOD_noise_type_t type) { + data = TCOD_noise_new(dimensions, hurst, lacunarity, TCODRandom::getInstance()->data); + TCOD_noise_set_type(data,type); +} + +TCODNoise::TCODNoise(int dimensions, float hurst, float lacunarity, TCODRandom *random, TCOD_noise_type_t type) { + data = TCOD_noise_new(dimensions, hurst, lacunarity, random->data); + TCOD_noise_set_type(data,type); +} + +void TCODNoise::setType(TCOD_noise_type_t type) { + TCOD_noise_set_type(data,type); +} + +float TCODNoise::get (float *f, TCOD_noise_type_t type) { + if (type == TCOD_NOISE_DEFAULT) return TCOD_noise_get(data,f); + else return TCOD_noise_get_ex(data,f,type); +} + +float TCODNoise::getFbm (float *f, float octaves, TCOD_noise_type_t type) { + if (type == TCOD_NOISE_DEFAULT) return TCOD_noise_get_fbm(data,f,octaves); + else return TCOD_noise_get_fbm_ex(data,f,octaves,type); +} + +float TCODNoise::getTurbulence (float *f, float octaves, TCOD_noise_type_t type) { + if (type == TCOD_NOISE_DEFAULT) return TCOD_noise_get_turbulence(data,f,octaves); + else return TCOD_noise_get_turbulence_ex(data,f,octaves,type); +} + +TCODNoise::~TCODNoise() { + TCOD_noise_delete(data); +} diff --git a/tcod/tcod_sys/libtcod/src/noise_c.c b/tcod/tcod_sys/libtcod/src/noise_c.c new file mode 100644 index 00000000..2c62cb74 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/noise_c.c @@ -0,0 +1,798 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "libtcod.h" + +#define WAVELET_TILE_SIZE 32 +#define WAVELET_ARAD 16 + +#define SIMPLEX_SCALE 0.5f +#define WAVELET_SCALE 2.0f + +typedef struct { + int ndim; + unsigned char map[256]; /* Randomized map of indexes into buffer */ + float buffer[256][TCOD_NOISE_MAX_DIMENSIONS]; /* Random 256 x ndim buffer */ + /* fractal stuff */ + float H; + float lacunarity; + float exponent[TCOD_NOISE_MAX_OCTAVES]; + float *waveletTileData; + TCOD_random_t rand; + /* noise type */ + TCOD_noise_type_t noise_type; +} perlin_data_t; + +static float lattice( perlin_data_t *data, int ix, float fx, int iy, float fy, int iz, float fz, int iw, float fw) +{ + int n[4] = {ix, iy, iz, iw}; + float f[4] = {fx, fy, fz, fw}; + int nIndex = 0; + int i; + float value = 0; + for(i=0; indim; i++) + nIndex = data->map[(nIndex + n[i]) & 0xFF]; + for(i=0; indim; i++) + value += data->buffer[nIndex][i] * f[i]; + return value; +} + +#define DEFAULT_SEED 0x15687436 +#define DELTA 1e-6f +#define SWAP(a, b, t) t = a; a = b; b = t + +#define FLOOR(a) ((a)> 0 ? ((int)a) : (((int)a)-1) ) +#define CUBIC(a) ( a * a * (3 - 2*a) ) + +static void normalize(perlin_data_t *data, float *f) +{ + float magnitude = 0; + int i; + for(i=0; indim; i++) + magnitude += f[i]*f[i]; + magnitude = 1.0f / (float)sqrt(magnitude); + for(i=0; indim; i++) + f[i] *= magnitude; +} + + +TCOD_noise_t TCOD_noise_new(int ndim, float hurst, float lacunarity, TCOD_random_t random) +{ + perlin_data_t *data=(perlin_data_t *)calloc(sizeof(perlin_data_t),1); + int i, j; + unsigned char tmp; + float f = 1; + data->rand = random ? random : TCOD_random_get_instance(); + data->ndim = ndim; + for(i=0; i<256; i++) + { + data->map[i] = (unsigned char)i; + for(j=0; jndim; j++) + data->buffer[i][j] = TCOD_random_get_float(data->rand,-0.5, 0.5); + normalize(data,data->buffer[i]); + } + + while(--i) + { + j = TCOD_random_get_int(data->rand,0, 255); + SWAP(data->map[i], data->map[j], tmp); + } + + data->H = hurst; + data->lacunarity = lacunarity; + for(i=0; iexponent[i] = 1.0f / f; + f *= lacunarity; + } + data->noise_type = TCOD_NOISE_DEFAULT; + return (TCOD_noise_t)data; +} + +float TCOD_noise_perlin( TCOD_noise_t noise, float *f ) +{ + perlin_data_t *data=(perlin_data_t *)noise; + int n[TCOD_NOISE_MAX_DIMENSIONS]; /* Indexes to pass to lattice function */ + int i; + float r[TCOD_NOISE_MAX_DIMENSIONS]; /* Remainders to pass to lattice function */ + float w[TCOD_NOISE_MAX_DIMENSIONS]; /* Cubic values to pass to interpolation function */ + float value; + + for(i=0; indim; i++) + { + n[i] = FLOOR(f[i]); + r[i] = f[i] - n[i]; + w[i] = CUBIC(r[i]); + } + + switch(data->ndim) + { + case 1: + value = LERP(lattice(data,n[0], r[0],0,0,0,0,0,0), + lattice(data,n[0]+1, r[0]-1,0,0,0,0,0,0), + w[0]); + break; + case 2: + value = LERP(LERP(lattice(data,n[0], r[0], n[1], r[1],0,0,0,0), + lattice(data,n[0]+1, r[0]-1, n[1], r[1],0,0,0,0), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1,0,0,0,0), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1,0,0,0,0), + w[0]), + w[1]); + break; + case 3: + value = LERP(LERP(LERP(lattice(data,n[0], r[0], n[1], r[1], n[2], r[2],0,0), + lattice(data,n[0]+1, r[0]-1, n[1], r[1], n[2], r[2],0,0), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1, n[2], r[2],0,0), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1, n[2], r[2],0,0), + w[0]), + w[1]), + LERP(LERP(lattice(data,n[0], r[0], n[1], r[1], n[2]+1, r[2]-1,0,0), + lattice(data,n[0]+1, r[0]-1, n[1], r[1], n[2]+1, r[2]-1,0,0), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1, n[2]+1, r[2]-1,0,0), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1, n[2]+1, r[2]-1,0,0), + w[0]), + w[1]), + w[2]); + break; + case 4: + default: + value = LERP(LERP(LERP(LERP(lattice(data,n[0], r[0], n[1], r[1], n[2], r[2], n[3], r[3]), + lattice(data,n[0]+1, r[0]-1, n[1], r[1], n[2], r[2], n[3], r[3]), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1, n[2], r[2], n[3], r[3]), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1, n[2], r[2], n[3], r[3]), + w[0]), + w[1]), + LERP(LERP(lattice(data,n[0], r[0], n[1], r[1], n[2]+1, r[2]-1, n[3], r[3]), + lattice(data,n[0]+1, r[0]-1, n[1], r[1], n[2]+1, r[2]-1, n[3], r[3]), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1, n[2]+1, r[2]-1,0,0), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1, n[2]+1, r[2]-1, n[3], r[3]), + w[0]), + w[1]), + w[2]), + LERP(LERP(LERP(lattice(data,n[0], r[0], n[1], r[1], n[2], r[2], n[3]+1, r[3]-1), + lattice(data,n[0]+1, r[0]-1, n[1], r[1], n[2], r[2], n[3]+1, r[3]-1), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1, n[2], r[2], n[3]+1, r[3]-1), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1, n[2], r[2], n[3]+1, r[3]-1), + w[0]), + w[1]), + LERP(LERP(lattice(data,n[0], r[0], n[1], r[1], n[2]+1, r[2]-1, n[3]+1, r[3]-1), + lattice(data,n[0]+1, r[0]-1, n[1], r[1], n[2]+1, r[2]-1, n[3]+1, r[3]-1), + w[0]), + LERP(lattice(data,n[0], r[0], n[1]+1, r[1]-1, n[2]+1, r[2]-1,0,0), + lattice(data,n[0]+1, r[0]-1, n[1]+1, r[1]-1, n[2]+1, r[2]-1, n[3]+1, r[3]-1), + w[0]), + w[1]), + w[2]), + w[3]); + break; + } + return CLAMP(-0.99999f, 0.99999f, value); +} + +/* simplex noise, adapted from Ken Perlin's presentation at Siggraph 2001 */ +/* and Stefan Gustavson implementation */ + +#define TCOD_NOISE_SIMPLEX_GRADIENT_1D(n,h,x) { float grad; h &= 0xF; grad=1.0f+(h & 7); if ( h & 8 ) grad = -grad; n = grad * x; } + +#define TCOD_NOISE_SIMPLEX_GRADIENT_2D(n,h,x,y) { float u,v; h &= 0x7; if ( h < 4 ) { u=x; v=2.0f*y; } else { u=y; v=2.0f*x; } n = ((h & 1) ? -u : u) + ((h & 2) ? -v :v ); } + +#define TCOD_NOISE_SIMPLEX_GRADIENT_3D(n,h,x,y,z) { float u,v; h &= 0xF; u = (h < 8 ? x : y); v = (h < 4 ? y : ( h == 12 || h == 14 ? x : z ) ); n= ((h & 1) ? -u : u ) + ((h & 2) ? -v : v); } + +#define TCOD_NOISE_SIMPLEX_GRADIENT_4D(n,h,x,y,z,t) { float u,v,w; h &= 0x1F; u = (h < 24 ? x:y); v = (h < 16 ? y:z); w = (h < 8 ? z:t); n= ((h & 1) ? -u : u ) + ((h & 2) ? -v : v) + ((h & 4) ? -w : w);} + +static float simplex[64][4] = { + {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0}, + {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0}, + {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, + {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0}, + {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0}, + {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, + {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0}, + {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}, + +}; + +float TCOD_noise_simplex(TCOD_noise_t noise, float *f) { + perlin_data_t *data=(perlin_data_t *)noise; + switch(data->ndim) { + case 1 : + { + int i0=(int)FLOOR(f[0]*SIMPLEX_SCALE); + int i1=i0+1; + float x0 = f[0]*SIMPLEX_SCALE - i0; + float x1 = x0 - 1.0f; + float t0 = 1.0f - x0*x0; + float t1 = 1.0f - x1*x1; + float n0,n1; + t0 = t0*t0; + t1 = t1*t1; + i0=data->map[i0&0xFF]; + TCOD_NOISE_SIMPLEX_GRADIENT_1D(n0,i0,x0); + n0*=t0*t0; + i1=data->map[i1&0xFF]; + TCOD_NOISE_SIMPLEX_GRADIENT_1D(n1,i1,x1); + n1*=t1*t1; + return 0.25f * (n0+n1); + } + break; + case 2 : + { + #define F2 0.366025403f /* 0.5f * (sqrtf(3.0f)-1.0f); */ + #define G2 0.211324865f /* (3.0f - sqrtf(3.0f))/6.0f; */ + + float s = (f[0]+f[1])*F2*SIMPLEX_SCALE; + float xs = f[0]*SIMPLEX_SCALE+s; + float ys = f[1]*SIMPLEX_SCALE+s; + int i=FLOOR(xs); + int j=FLOOR(ys); + float t = (i+j)*G2; + float xo = i-t; + float yo = j-t; + float x0 = f[0]*SIMPLEX_SCALE-xo; + float y0 = f[1]*SIMPLEX_SCALE-yo; + int i1,j1,ii = i%256,jj = j%256; + float n0,n1,n2,x1,y1,x2,y2,t0,t1,t2; + if ( x0 > y0 ) { + i1=1;j1=0; + } else { + i1=0;j1=1; + } + x1 = x0 - i1 + G2; + y1 = y0 - j1 + G2; + x2 = x0 - 1.0f + 2.0f * G2; + y2 = y0 - 1.0f + 2.0f * G2; + t0 = 0.5f - x0*x0 - y0*y0; + if ( t0 < 0.0f ) { + n0 = 0.0f; + } else { + int idx = (ii + data->map[jj])&0xFF; + t0 *= t0; + idx=data->map[idx]; + TCOD_NOISE_SIMPLEX_GRADIENT_2D(n0,idx,x0,y0); + n0 *= t0*t0; + } + t1 = 0.5f - x1*x1 -y1*y1; + if ( t1 < 0.0f ) { + n1 = 0.0f; + } else { + int idx = (ii + i1 + data->map[(jj+j1)&0xFF]) & 0xFF; + t1 *= t1; + idx=data->map[idx]; + TCOD_NOISE_SIMPLEX_GRADIENT_2D(n1,idx,x1,y1); + n1 *= t1*t1; + } + t2 = 0.5f - x2*x2 -y2*y2; + if ( t2 < 0.0f ) { + n2 = 0.0f; + } else { + int idx = (ii + 1 + data->map[(jj+1)&0xFF]) & 0xFF; + t2 *= t2; + idx=data->map[idx]; + TCOD_NOISE_SIMPLEX_GRADIENT_2D(n2,idx,x2,y2); + n2 *= t2*t2; + } + return 40.0f * (n0+n1+n2); + } + break; + case 3 : + { + #define F3 0.333333333f + #define G3 0.166666667f + float n0,n1,n2,n3; + float s =(f[0]+f[1]+f[2])*F3*SIMPLEX_SCALE; + float xs=f[0]*SIMPLEX_SCALE+s; + float ys=f[1]*SIMPLEX_SCALE+s; + float zs=f[2]*SIMPLEX_SCALE+s; + int i=FLOOR(xs); + int j=FLOOR(ys); + int k=FLOOR(zs); + float t=(float)(i+j+k)*G3; + float xo = i-t; + float yo = j-t; + float zo = k-t; + float x0 = f[0]*SIMPLEX_SCALE-xo; + float y0 = f[1]*SIMPLEX_SCALE-yo; + float z0 = f[2]*SIMPLEX_SCALE-zo; + int i1,j1,k1,i2,j2,k2,ii,jj,kk; + float x1,y1,z1,x2,y2,z2,x3,y3,z3,t0,t1,t2,t3; + if ( x0 >= y0 ) { + if ( y0 >= z0 ) { + i1=1;j1=0;k1=0;i2=1;j2=1;k2=0; + } else if ( x0 >= z0 ) { + i1=1;j1=0;k1=0;i2=1;j2=0;k2=1; + } else { + i1=0;j1=0;k1=1;i2=1;j2=0;k2=1; + } + } else { + if ( y0 < z0 ) { + i1=0;j1=0;k1=1;i2=0;j2=1;k2=1; + } else if ( x0 < z0 ) { + i1=0;j1=1;k1=0;i2=0;j2=1;k2=1; + } else { + i1=0;j1=1;k1=0;i2=1;j2=1;k2=0; + } + } + x1 = x0 -i1 + G3; + y1 = y0 -j1 + G3; + z1 = z0 -k1 + G3; + x2 = x0 -i2 + 2.0f*G3; + y2 = y0 -j2 + 2.0f*G3; + z2 = z0 -k2 + 2.0f*G3; + x3 = x0 - 1.0f +3.0f * G3; + y3 = y0 - 1.0f +3.0f * G3; + z3 = z0 - 1.0f +3.0f * G3; + ii = i%256; + jj = j%256; + kk = k%256; + t0 = 0.6f - x0*x0 -y0*y0 -z0*z0; + if ( t0 < 0.0f ) n0 = 0.0f; + else { + int idx = data->map[ (ii + data->map[ (jj + data->map[ kk ]) &0xFF ])& 0xFF ]; + t0 *= t0; + TCOD_NOISE_SIMPLEX_GRADIENT_3D(n0,idx,x0,y0,z0); + n0 *= t0*t0; + } + t1 = 0.6f - x1*x1 -y1*y1 -z1*z1; + if ( t1 < 0.0f ) n1 = 0.0f; + else { + int idx = data->map[ (ii + i1 + data->map[ (jj + j1 + data->map[ (kk + k1)& 0xFF ]) &0xFF ])& 0xFF ]; + t1 *= t1; + TCOD_NOISE_SIMPLEX_GRADIENT_3D(n1,idx,x1,y1,z1); + n1 *= t1*t1; + } + t2 = 0.6f - x2*x2 -y2*y2 -z2*z2; + if ( t2 < 0.0f ) n2 = 0.0f; + else { + int idx = data->map[ (ii + i2 + data->map[ (jj + j2 + data->map[ (kk + k2)& 0xFF ]) &0xFF ])& 0xFF ]; + t2 *= t2; + TCOD_NOISE_SIMPLEX_GRADIENT_3D(n2,idx,x2,y2,z2); + n2 *= t2*t2; + } + t3 = 0.6f - x3*x3 -y3*y3 -z3*z3; + if ( t3 < 0.0f ) n3 = 0.0f; + else { + int idx = data->map[ (ii + 1 + data->map[ (jj + 1 + data->map[ (kk + 1)& 0xFF ]) &0xFF ])& 0xFF ]; + t3 *= t3; + TCOD_NOISE_SIMPLEX_GRADIENT_3D(n3,idx,x3,y3,z3); + n3 *= t3*t3; + } + return 32.0f * (n0+n1+n2+n3); + + } + break; + case 4 : + { + #define F4 0.309016994f /* (sqrtf(5.0f)-1.0f)/4.0f */ + #define G4 0.138196601f /* (5.0f - sqrtf(5.0f))/20.0f */ + float n0,n1,n2,n3,n4; + float s = (f[0]+f[1]+f[2]+f[3])*F4 * SIMPLEX_SCALE; + float xs=f[0]*SIMPLEX_SCALE+s; + float ys=f[1]*SIMPLEX_SCALE+s; + float zs=f[2]*SIMPLEX_SCALE+s; + float ws=f[3]*SIMPLEX_SCALE+s; + int i=FLOOR(xs); + int j=FLOOR(ys); + int k=FLOOR(zs); + int l=FLOOR(ws); + float t=(float)(i+j+k+l)*G4; + float xo = i-t; + float yo = j-t; + float zo = k-t; + float wo = l-t; + float x0 = f[0]*SIMPLEX_SCALE-xo; + float y0 = f[1]*SIMPLEX_SCALE-yo; + float z0 = f[2]*SIMPLEX_SCALE-zo; + float w0 = f[3]*SIMPLEX_SCALE-wo; + int c1 = (x0 > y0 ? 32 : 0); + int c2 = (x0 > z0 ? 16 : 0); + int c3 = (y0 > z0 ? 8 : 0); + int c4 = (x0 > w0 ? 4 : 0); + int c5 = (y0 > w0 ? 2 : 0); + int c6 = (z0 > w0 ? 1 : 0); + int c = c1+c2+c3+c4+c5+c6; + + + int i1,j1,k1,l1,i2,j2,k2,l2,i3,j3,k3,l3,ii,jj,kk,ll; + float x1,y1,z1,w1,x2,y2,z2,w2,x3,y3,z3,w3,x4,y4,z4,w4,t0,t1,t2,t3,t4; + i1 = simplex[c][0] >= 3 ? 1:0; + j1 = simplex[c][1] >= 3 ? 1:0; + k1 = simplex[c][2] >= 3 ? 1:0; + l1 = simplex[c][3] >= 3 ? 1:0; + + i2 = simplex[c][0] >= 2 ? 1:0; + j2 = simplex[c][1] >= 2 ? 1:0; + k2 = simplex[c][2] >= 2 ? 1:0; + l2 = simplex[c][3] >= 2 ? 1:0; + + i3 = simplex[c][0] >= 1 ? 1:0; + j3 = simplex[c][1] >= 1 ? 1:0; + k3 = simplex[c][2] >= 1 ? 1:0; + l3 = simplex[c][3] >= 1 ? 1:0; + + x1 = x0 -i1 + G4; + y1 = y0 -j1 + G4; + z1 = z0 -k1 + G4; + w1 = w0 -l1 + G4; + x2 = x0 -i2 + 2.0f*G4; + y2 = y0 -j2 + 2.0f*G4; + z2 = z0 -k2 + 2.0f*G4; + w2 = w0 -l2 + 2.0f*G4; + x3 = x0 -i3 + 3.0f*G4; + y3 = y0 -j3 + 3.0f*G4; + z3 = z0 -k3 + 3.0f*G4; + w3 = w0 -l3 + 3.0f*G4; + x4 = x0 - 1.0f +4.0f * G4; + y4 = y0 - 1.0f +4.0f * G4; + z4 = z0 - 1.0f +4.0f * G4; + w4 = w0 - 1.0f +4.0f * G4; + + ii = i%256; + jj = j%256; + kk = k%256; + ll = l%256; + + t0 = 0.6f - x0*x0 -y0*y0 -z0*z0 -w0*w0; + if ( t0 < 0.0f ) n0 = 0.0f; + else { + int idx = data->map[ (ii + data->map[ (jj + data->map[ (kk + data->map[ ll ] ) &0xFF]) &0xFF ])& 0xFF ]; + t0 *= t0; + TCOD_NOISE_SIMPLEX_GRADIENT_4D(n0,idx,x0,y0,z0,w0); + n0 *= t0*t0; + } + t1 = 0.6f - x1*x1 -y1*y1 -z1*z1 -w1*w1; + if ( t1 < 0.0f ) n1 = 0.0f; + else { + int idx = data->map[ (ii + i1 + data->map[ (jj + j1 + data->map[ (kk + k1 + data->map[ (ll+l1)&0xFF])& 0xFF ]) &0xFF ])& 0xFF ]; + t1 *= t1; + TCOD_NOISE_SIMPLEX_GRADIENT_4D(n1,idx,x1,y1,z1,w1); + n1 *= t1*t1; + } + t2 = 0.6f - x2*x2 -y2*y2 -z2*z2 -w2*w2; + if ( t2 < 0.0f ) n2 = 0.0f; + else { + int idx = data->map[ (ii + i2 + data->map[ (jj + j2 + data->map[ (kk + k2 + data->map[(ll+l2)&0xFF])& 0xFF ]) &0xFF ])& 0xFF ]; + t2 *= t2; + TCOD_NOISE_SIMPLEX_GRADIENT_4D(n2,idx,x2,y2,z2,w2); + n2 *= t2*t2; + } + t3 = 0.6f - x3*x3 -y3*y3 -z3*z3 -w3*w3; + if ( t3 < 0.0f ) n3 = 0.0f; + else { + int idx = data->map[ (ii + i3 + data->map[ (jj + j3 + data->map[ (kk + k3 + data->map[(ll+l3)&0xFF])& 0xFF ]) &0xFF ])& 0xFF ]; + t3 *= t3; + TCOD_NOISE_SIMPLEX_GRADIENT_4D(n3,idx,x3,y3,z3,w3); + n3 *= t3*t3; + } + t4 = 0.6f - x4*x4 -y4*y4 -z4*z4 -w4*w4; + if ( t4 < 0.0f ) n4 = 0.0f; + else { + int idx = data->map[ (ii + 1 + data->map[ (jj + 1 + data->map[ (kk + 1 + data->map[(ll+1)&0xFF])& 0xFF ]) &0xFF ])& 0xFF ]; + t4 *= t4; + TCOD_NOISE_SIMPLEX_GRADIENT_4D(n4,idx,x4,y4,z4,w4); + n4 *= t4*t4; + } + return 27.0f * (n0+n1+n2+n3+n4); + + } + break; + } + return 0.0f; +} + +typedef float (*TCOD_noise_func_t)( TCOD_noise_t noise, float *f ); + +static float TCOD_noise_fbm_int(TCOD_noise_t noise, float *f, float octaves, TCOD_noise_func_t func ) { + float tf[TCOD_NOISE_MAX_DIMENSIONS]; + perlin_data_t *data=(perlin_data_t *)noise; + /* Initialize locals */ + double value = 0; + int i,j; + memcpy(tf,f,sizeof(float)*data->ndim); + + /* Inner loop of spectral construction, where the fractal is built */ + for(i=0; i<(int)octaves; i++) + { + value += (double)(func(noise,tf)) * data->exponent[i]; + for (j=0; j < data->ndim; j++) tf[j] *= data->lacunarity; + } + + /* Take care of remainder in octaves */ + octaves -= (int)octaves; + if(octaves > DELTA) + value += (double)(octaves * func(noise,tf)) * data->exponent[i]; + return CLAMP(-0.99999f, 0.99999f, (float)value); +} + +float TCOD_noise_fbm_perlin( TCOD_noise_t noise, float *f, float octaves ) +{ + return TCOD_noise_fbm_int(noise,f,octaves,TCOD_noise_perlin); +} + +float TCOD_noise_fbm_simplex( TCOD_noise_t noise, float *f, float octaves ) +{ + return TCOD_noise_fbm_int(noise,f,octaves,TCOD_noise_simplex); +} + +static float TCOD_noise_turbulence_int( TCOD_noise_t noise, float *f, float octaves, TCOD_noise_func_t func ) +{ + float tf[TCOD_NOISE_MAX_DIMENSIONS]; + perlin_data_t *data=(perlin_data_t *)noise; + /* Initialize locals */ + double value = 0; + int i,j; + memcpy(tf,f,sizeof(float)*data->ndim); + + /* Inner loop of spectral construction, where the fractal is built */ + for(i=0; i<(int)octaves; i++) + { + float nval=func(noise,tf); + value += (double)(ABS(nval)) * data->exponent[i]; + for (j=0; j < data->ndim; j++) tf[j] *= data->lacunarity; + } + + /* Take care of remainder in octaves */ + octaves -= (int)octaves; + if(octaves > DELTA) { + float nval=func(noise,tf); + value += (double)(octaves * ABS(nval)) * data->exponent[i]; + } + return CLAMP(-0.99999f, 0.99999f, (float)value); +} + +float TCOD_noise_turbulence_perlin( TCOD_noise_t noise, float *f, float octaves ) { + return TCOD_noise_turbulence_int(noise,f,octaves,TCOD_noise_perlin); +} + +float TCOD_noise_turbulence_simplex( TCOD_noise_t noise, float *f, float octaves ) { + return TCOD_noise_turbulence_int(noise,f,octaves,TCOD_noise_simplex); +} + +/* wavelet noise, adapted from Robert L. Cook and Tony Derose 'Wavelet noise' paper */ + +static int absmod(int x, int n) { + int m=x%n; + return m < 0 ? m+n : m; +} + +static void TCOD_noise_wavelet_downsample(float *from, float *to, int stride) { + static float acoeffs[2*WAVELET_ARAD]= { + 0.000334f, -0.001528f, 0.000410f, 0.003545f, -0.000938f, -0.008233f, 0.002172f, 0.019120f, + -0.005040f,-0.044412f, 0.011655f, 0.103311f, -0.025936f, -0.243780f, 0.033979f, 0.655340f, + 0.655340f, 0.033979f,-0.243780f,-0.025936f, 0.103311f, 0.011655f,-0.044412f,-0.005040f, + 0.019120f, 0.002172f,-0.008233f,-0.000938f, 0.003546f, 0.000410f,-0.001528f, 0.000334f, + }; + static float *a = &acoeffs[WAVELET_ARAD]; + int i; + for (i=0; i < WAVELET_TILE_SIZE/2; i++) { + int k; + to[i*stride]=0; + for (k=2*i-WAVELET_ARAD; k <2*i+WAVELET_ARAD; k++) { + to[i*stride] += a[k-2*i]* from[ absmod(k,WAVELET_TILE_SIZE) * stride ]; + } + } +} + +static void TCOD_noise_wavelet_upsample(float *from, float *to, int stride) { + static float pcoeffs[4]= { 0.25f, 0.75f, 0.75f, 0.25f }; + static float *p = &pcoeffs[2]; + int i; + for (i=0; i < WAVELET_TILE_SIZE; i++) { + int k; + to[i*stride]=0; + for (k=i/2; k rand,-1.0f,1.0f); + } + for (iy=0; iy < WAVELET_TILE_SIZE; iy++ ) { + for (iz=0; iz < WAVELET_TILE_SIZE; iz++ ) { + i = iy * WAVELET_TILE_SIZE + iz * WAVELET_TILE_SIZE * WAVELET_TILE_SIZE; + TCOD_noise_wavelet_downsample(&noise[i], &temp1[i], 1); + TCOD_noise_wavelet_upsample(&temp1[i], &temp2[i], 1); + } + } + for (ix=0; ix < WAVELET_TILE_SIZE; ix++ ) { + for (iz=0; iz < WAVELET_TILE_SIZE; iz++ ) { + i = ix + iz * WAVELET_TILE_SIZE * WAVELET_TILE_SIZE; + TCOD_noise_wavelet_downsample(&temp2[i], &temp1[i], WAVELET_TILE_SIZE); + TCOD_noise_wavelet_upsample(&temp1[i], &temp2[i], WAVELET_TILE_SIZE); + } + } + for (ix=0; ix < WAVELET_TILE_SIZE; ix++ ) { + for (iy=0; iy < WAVELET_TILE_SIZE; iy++ ) { + i = ix + iy * WAVELET_TILE_SIZE; + TCOD_noise_wavelet_downsample(&temp2[i], &temp1[i], WAVELET_TILE_SIZE * WAVELET_TILE_SIZE); + TCOD_noise_wavelet_upsample(&temp1[i], &temp2[i], WAVELET_TILE_SIZE * WAVELET_TILE_SIZE); + } + } + for (i=0; i < WAVELET_TILE_SIZE*WAVELET_TILE_SIZE*WAVELET_TILE_SIZE; i++ ) { + noise[i] -= temp2[i]; + } + offset = WAVELET_TILE_SIZE/2; + if ( (offset & 1) == 0 ) offset++; + for (i=0,ix=0; ix < WAVELET_TILE_SIZE; ix++ ) { + for (iy=0; iy < WAVELET_TILE_SIZE; iy++ ) { + for (iz=0; iz < WAVELET_TILE_SIZE; iz++ ) { + temp1[i++]=noise[ absmod(ix+offset,WAVELET_TILE_SIZE) + + absmod(iy+offset,WAVELET_TILE_SIZE)*WAVELET_TILE_SIZE + + absmod(iz+offset,WAVELET_TILE_SIZE)*WAVELET_TILE_SIZE*WAVELET_TILE_SIZE + ]; + } + } + } + for (i=0; i < WAVELET_TILE_SIZE*WAVELET_TILE_SIZE*WAVELET_TILE_SIZE; i++ ) { + noise[i] += temp1[i]; + } + data->waveletTileData=noise; + free(temp1); + free(temp2); +} + +float TCOD_noise_wavelet (TCOD_noise_t noise, float *f) { + perlin_data_t *data=(perlin_data_t *)noise; + float pf[3]; + int i; + int p[3],c[3],mid[3],n=WAVELET_TILE_SIZE; + float w[3][3],t,result=0.0f; + if ( data->ndim > 3 ) return 0.0f; /* not supported */ + if (! data->waveletTileData ) TCOD_noise_wavelet_init(noise); + for (i=0; i < data->ndim; i++ ) pf[i]=f[i]*WAVELET_SCALE; + for (i=data->ndim; i < 3; i++ ) pf[i]=0.0f; + for (i=0; i < 3; i++ ) { + mid[i]=(int)ceil(pf[i]-0.5f); + t=mid[i] - (pf[i]-0.5f); + w[i][0]=t*t*0.5f; + w[i][2]=(1.0f-t)*(1.0f-t)*0.5f; + w[i][1]=1.0f - w[i][0]-w[i][2]; + } + for (p[2]=-1; p[2]<=1; p[2]++) { + for (p[1]=-1; p[1]<=1; p[1]++) { + for (p[0]=-1; p[0]<=1; p[0]++) { + float weight=1.0f; + for (i=0;i<3;i++) { + c[i]=absmod(mid[i]+p[i],n); + weight *= w[i][p[i]+1]; + } + result += weight * data->waveletTileData[ c[2]*n*n + c[1]*n + c[0] ]; + } + } + } + return CLAMP(-1.0f,1.0f,result); +} + +float TCOD_noise_fbm_wavelet(TCOD_noise_t noise, float *f, float octaves) { + return TCOD_noise_fbm_int(noise,f,octaves,TCOD_noise_wavelet); +} + +float TCOD_noise_turbulence_wavelet(TCOD_noise_t noise, float *f, float octaves) { + return TCOD_noise_turbulence_int(noise,f,octaves,TCOD_noise_wavelet); +} + +void TCOD_noise_set_type (TCOD_noise_t noise, TCOD_noise_type_t type) { + ((perlin_data_t *)noise)->noise_type = type; +} + +float TCOD_noise_get_ex (TCOD_noise_t noise, float *f, TCOD_noise_type_t type) { + switch (type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_perlin(noise,f); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_simplex(noise,f); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_wavelet(noise,f); break; + default: + switch (((perlin_data_t *)noise)->noise_type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_perlin(noise,f); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_simplex(noise,f); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_wavelet(noise,f); break; + default: return TCOD_noise_simplex(noise,f); break; + } + break; + } +} + +float TCOD_noise_get_fbm_ex (TCOD_noise_t noise, float *f, float octaves, TCOD_noise_type_t type) { + switch (type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_fbm_perlin(noise,f,octaves); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_fbm_simplex(noise,f,octaves); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_fbm_wavelet(noise,f,octaves); break; + default: + switch (((perlin_data_t *)noise)->noise_type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_fbm_perlin(noise,f,octaves); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_fbm_simplex(noise,f,octaves); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_fbm_wavelet(noise,f,octaves); break; + default: return TCOD_noise_fbm_simplex(noise,f,octaves); break; + } + break; + } +} + +float TCOD_noise_get_turbulence_ex (TCOD_noise_t noise, float *f, float octaves, TCOD_noise_type_t type) { + switch (type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_turbulence_perlin(noise,f,octaves); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_turbulence_simplex(noise,f,octaves); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_turbulence_wavelet(noise,f,octaves); break; + default: + switch (((perlin_data_t *)noise)->noise_type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_turbulence_perlin(noise,f,octaves); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_turbulence_simplex(noise,f,octaves); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_turbulence_wavelet(noise,f,octaves); break; + default: return TCOD_noise_turbulence_simplex(noise,f,octaves); break; + } + break; + } +} + +float TCOD_noise_get (TCOD_noise_t noise, float *f) { + switch (((perlin_data_t *)noise)->noise_type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_perlin(noise,f); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_simplex(noise,f); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_wavelet(noise,f); break; + default: return TCOD_noise_simplex(noise,f); break; + } +} + +float TCOD_noise_get_fbm (TCOD_noise_t noise, float *f, float octaves) { + switch (((perlin_data_t *)noise)->noise_type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_fbm_perlin(noise,f,octaves); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_fbm_simplex(noise,f,octaves); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_fbm_wavelet(noise,f,octaves); break; + default: return TCOD_noise_fbm_simplex(noise,f,octaves); break; + } +} + +float TCOD_noise_get_turbulence (TCOD_noise_t noise, float *f, float octaves) { + switch (((perlin_data_t *)noise)->noise_type) { + case (TCOD_NOISE_PERLIN): return TCOD_noise_turbulence_perlin(noise,f,octaves); break; + case (TCOD_NOISE_SIMPLEX): return TCOD_noise_turbulence_simplex(noise,f,octaves); break; + case (TCOD_NOISE_WAVELET): return TCOD_noise_turbulence_wavelet(noise,f,octaves); break; + default: return TCOD_noise_turbulence_simplex(noise,f,octaves); break; + } +} + +void TCOD_noise_delete(TCOD_noise_t noise) { + free((perlin_data_t *)noise); +} diff --git a/tcod/tcod_sys/libtcod/src/parser.cpp b/tcod/tcod_sys/libtcod/src/parser.cpp new file mode 100644 index 00000000..3a989125 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/parser.cpp @@ -0,0 +1,184 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include "libtcod.hpp" + +const char *TCODParserStruct::getName() const { + return TCOD_struct_get_name(data); +} + +TCODParserStruct* TCODParserStruct::addProperty(const char *propname, TCOD_value_type_t type, bool mandatory) { + TCOD_struct_add_property(data,propname,type,mandatory); + return this; +} + +TCODParserStruct* TCODParserStruct::addListProperty(const char *propname, TCOD_value_type_t type, bool mandatory) { + TCOD_struct_add_list_property(data,propname,type,mandatory); + return this; +} + +TCODParserStruct* TCODParserStruct::addValueList(const char *propname, const char **value_list, bool mandatory) { + TCOD_struct_add_value_list(data,propname,value_list,mandatory); + return this; +} + +TCODParserStruct* TCODParserStruct::addFlag(const char *propname) { + TCOD_struct_add_flag(data,propname); + return this; +} + +TCODParserStruct* TCODParserStruct::addStructure(TCODParserStruct *sub_entity) { + TCOD_struct_add_structure(data,sub_entity->data); + return this; +} + +bool TCODParserStruct::isPropertyMandatory(const char *propname) const { + return TCOD_struct_is_mandatory(data,propname) != 0; +} + +TCOD_value_type_t TCODParserStruct::getPropertyType(const char *propname) const { + return TCOD_struct_get_type(data,propname); +} + +TCODParserStruct *TCODParser::newStructure(const char *name) { + TCODParserStruct *ent = new TCODParserStruct(); + ent->data = TCOD_parser_new_struct(data,(char *)name); + defs.push(ent); + return ent; +} + +static ITCODParserListener *listener=NULL; +static TCODParser *parser=NULL; +extern "C" uint8 new_struct(TCOD_parser_struct_t def,const char *name) { + for ( TCODParserStruct **idef=parser->defs.begin(); idef != parser->defs.end(); idef++) { + if ( (*idef)->data == def ) { + return listener->parserNewStruct(parser,*idef,name) ? 1 : 0; + } + } + // not found. autodeclaring struct + TCODParserStruct *idef = new TCODParserStruct(); + idef->data = def; + parser->defs.push(idef); + return listener->parserNewStruct(parser,idef,name) ? 1 : 0; +} +extern "C" uint8 new_flag(const char *name) { + return listener->parserFlag(parser,name) ? 1 : 0; +} +extern "C" uint8 new_property(const char *propname, TCOD_value_type_t type, TCOD_value_t value) { + return listener->parserProperty(parser,propname,type, value) ? 1 : 0; +} +extern "C" uint8 end_struct(TCOD_parser_struct_t def, const char *name) { + for ( TCODParserStruct **idef=parser->defs.begin(); idef != parser->defs.end(); idef++) { + if ( (*idef)->data == def ) { + return listener->parserEndStruct(parser,*idef,name) ? 1 : 0; + } + } + return 0; +} + +extern "C" void error(const char *msg) { + listener->error(msg); +} + +static TCOD_parser_listener_t c_to_cpp_listener = { + new_struct, + new_flag, + new_property, + end_struct, + error +}; + +TCODParser::TCODParser() { + data = TCOD_parser_new(); +} + +void TCODParser::run(const char *filename, ITCODParserListener *_listener) { + listener=_listener; + parser=this; + if ( listener ) TCOD_parser_run(data,(char *)filename,&c_to_cpp_listener); + else TCOD_parser_run(data,(char *)filename, NULL); +} + +TCOD_value_type_t TCODParser::newCustomType(TCOD_parser_custom_t custom_type_parser) { + return TCOD_parser_new_custom_type(data,custom_type_parser); +} + +void TCODParser::error(const char *msg, ...) { + char buf[2048]; + va_list ap; + va_start(ap,msg); + vsprintf(buf,msg,ap); + va_end(ap); + TCOD_parser_error(buf); +} + +// default parser + +bool TCODParser::hasProperty(const char *name) const { + return TCOD_parser_has_property(data,name) != 0; +} + +bool TCODParser::getBoolProperty(const char *name) const { + return TCOD_parser_get_bool_property(data,name) != 0; +} + +int TCODParser::getIntProperty(const char *name) const { + return TCOD_parser_get_int_property(data,name); +} + +int TCODParser::getCharProperty(const char *name) const { + return TCOD_parser_get_char_property(data,name); +} + +float TCODParser::getFloatProperty(const char *name) const { + return TCOD_parser_get_float_property(data,name); +} + +TCODColor TCODParser::getColorProperty(const char *name) const { + return TCOD_parser_get_color_property(data,name); +} + +TCOD_dice_t TCODParser::getDiceProperty(const char *name) const { + return TCOD_parser_get_dice_property(data,name); +} + +const char * TCODParser::getStringProperty(const char *name) const { + return TCOD_parser_get_string_property(data,name); +} + +void * TCODParser::getCustomProperty(const char *name) const { + return TCOD_parser_get_custom_property(data,name); +} + +TCOD_list_t TCODParser::getListProperty(const char *name, TCOD_value_type_t type) const { + return TCOD_parser_get_list_property(data,name,type); +} + diff --git a/tcod/tcod_sys/libtcod/src/parser_c.c b/tcod/tcod_sys/libtcod/src/parser_c.c new file mode 100644 index 00000000..0968a013 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/parser_c.c @@ -0,0 +1,931 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +#define BIG_NAME_LEN 128 + +#define DEF_NAME(d) (((TCOD_struct_int_t *)d)->name) +#define DEF_FLAGS(d) (((TCOD_struct_int_t *)d)->flags) +#define DEF_PROPS(d) (((TCOD_struct_int_t *)d)->props) +#define DEF_LISTS(d) (((TCOD_struct_int_t *)d)->lists) + +/* definition property */ +typedef struct { + char *name; + TCOD_value_type_t value; + bool mandat; +} TCOD_struct_prop_t; + +static TCOD_lex_t *lex=NULL; + +static const char *symbols[] = { + "{","}","=","/","+","-","[","]",",","#",NULL +}; + +static const char *keywords[] = { + "struct","bool","char","int","float","string","color","dice",NULL +}; + +static TCOD_parser_listener_t *listener=NULL; + +static bool default_new_struct(TCOD_parser_struct_t str,const char *name); +static bool default_new_flag(const char *name); +static bool default_new_property(const char *propname, TCOD_value_type_t type, TCOD_value_t value); +static bool default_end_struct(TCOD_parser_struct_t str, const char *name); +static void default_error(const char *msg); + +static TCOD_parser_listener_t default_listener = { + default_new_struct, + default_new_flag, + default_new_property, + default_end_struct, + default_error +}; + +static bool string_copy(char *dest, char *source, int len) { + if ( source == NULL ) return false; + strncpy(dest,source,len); + dest[len-1]='\0'; + if ( strlen(source) >= (unsigned)len ) return false; + return true; +} + +void TCOD_parser_error(const char *msg, ...) { + char buf[2048]; + char buf2[2048]; + va_list ap; + va_start(ap,msg); + vsprintf(buf,msg,ap); + va_end(ap); + sprintf(buf2,"error in %s line %d : %s",lex->filename,lex->file_line,buf); + listener->error(buf2); + lex->token_type = TCOD_LEX_ERROR; +} + +const char *TCOD_struct_get_name(TCOD_parser_struct_t def) { + return ((TCOD_struct_int_t *)def)->name; +} + +/* add a property to an entity definition */ +void TCOD_struct_add_property(TCOD_parser_struct_t def,const char *name,TCOD_value_type_t type, bool mandatory) { + TCOD_struct_prop_t *prop=(TCOD_struct_prop_t *)calloc(1,sizeof(TCOD_struct_prop_t)); + prop->name=TCOD_strdup(name); + prop->value=type; + prop->mandat=mandatory; + TCOD_list_push(DEF_PROPS(def),(void *)prop); +} + +/* add a list property to an entity definition */ +void TCOD_struct_add_list_property(TCOD_parser_struct_t def,const char *name,TCOD_value_type_t type, bool mandatory) { + TCOD_struct_add_property(def,name,type|TCOD_TYPE_LIST,mandatory); +} + +void TCOD_struct_add_value_list_sized(TCOD_parser_struct_t def,const char *name, const char **value_list, int size, bool mandatory) { + char ** newArray = NULL; + /* duplicate value list to avoid issues with C# garbage collector */ + TCOD_value_type_t type = (TCOD_value_type_t)((int)TCOD_TYPE_VALUELIST00 + TCOD_list_size(DEF_LISTS(def))); + int i = 0; + + if(size) newArray = calloc(size+1, sizeof(char*)); + + for(i = 0 ; i < size ; i++) + newArray[i] = TCOD_strdup(value_list[i]); + newArray[size] = NULL; + + TCOD_struct_add_property(def,name,type,mandatory); + TCOD_list_push(DEF_LISTS(def),(void *)newArray); +} + +/* add a value-list property to an entity definition */ +void TCOD_struct_add_value_list(TCOD_parser_struct_t def,const char *name, const char **value_list, bool mandatory) { + int size = 0; + if(value_list) + { + while(value_list[size] != NULL) + { + size++; + }; + } + TCOD_struct_add_value_list_sized(def, name, value_list, size, mandatory); +} + + +/* add a flag (simplified bool value) to an entity definition */ +/* a flag cannot be mandatory. if present => true, if omitted => false */ +void TCOD_struct_add_flag(TCOD_parser_struct_t def,const char *propname) { + TCOD_list_push(DEF_FLAGS(def),(void *)TCOD_strdup(propname)); +} + +/* add a sub-entity to an entity definition */ +void TCOD_struct_add_structure(TCOD_parser_struct_t def, TCOD_parser_struct_t sub_definition) { + TCOD_list_push(((TCOD_struct_int_t *)def)->structs,(const void *)sub_definition); +} + +/* check if given property is mandatory for this entity definition */ +bool TCOD_struct_is_mandatory(TCOD_parser_struct_t def, const char *propname) { + TCOD_struct_prop_t **iprop; + for (iprop=(TCOD_struct_prop_t **)TCOD_list_begin(DEF_PROPS(def)); iprop!=(TCOD_struct_prop_t **)TCOD_list_end(DEF_PROPS(def));iprop++) { + if ( strcmp((*iprop)->name,propname) == 0 ) return (*iprop)->mandat; + } + return false; +} + +/* returns the type of given property */ +/* NONE if the property does not exist */ +TCOD_value_type_t TCOD_struct_get_type(TCOD_parser_struct_t def, const char *propname) { + TCOD_struct_prop_t **iprop; + char **iflag; + for (iprop=(TCOD_struct_prop_t **)TCOD_list_begin(DEF_PROPS(def)); iprop!=(TCOD_struct_prop_t **)TCOD_list_end(DEF_PROPS(def));iprop++) { + if ( strcmp((*iprop)->name,propname) == 0 ) return (*iprop)->value; + } + for (iflag=(char **)TCOD_list_begin(DEF_FLAGS(def)); iflag!=(char **)TCOD_list_end(DEF_FLAGS(def));iflag++) { + if ( strcmp((*iflag),propname) == 0 ) return TCOD_TYPE_BOOL; + } + return TCOD_TYPE_NONE; +} + +TCOD_value_t TCOD_parse_bool_value() { + TCOD_value_t ret; + if ( strcmp(lex->tok,"true") == 0 ) ret.b=true; + else if ( strcmp(lex->tok,"false") == 0 ) ret.b=false; + else TCOD_parser_error("parseBoolValue : unknown value %s for bool. 'true' or 'false' expected",lex->tok); + return ret; +} + +TCOD_value_t TCOD_parse_char_value() { + TCOD_value_t ret; + if ( lex->token_type != TCOD_LEX_CHAR && lex->token_type != TCOD_LEX_INTEGER ) + TCOD_parser_error("parseCharValue : char constant expected instead of '%s'",lex->tok); + ret.c=lex->token_int_val; + return ret; +} + +TCOD_value_t TCOD_parse_integer_value() { + TCOD_value_t ret; + if ( lex->token_type != TCOD_LEX_INTEGER ) + TCOD_parser_error("parseIntegerValue : integer constant expected instead of '%s'",lex->tok); + ret.i=lex->token_int_val; + return ret; +} + +TCOD_value_t TCOD_parse_float_value() { + TCOD_value_t ret; + if ( lex->token_type != TCOD_LEX_FLOAT && lex->token_type != TCOD_LEX_INTEGER ) + TCOD_parser_error("parseFloatValue : float constant expected instead of '%s'",lex->tok); + if ( lex->token_type == TCOD_LEX_FLOAT ) ret.f=lex->token_float_val; + else ret.f=(float)lex->token_int_val; + return ret; +} + +TCOD_value_t TCOD_parse_string_value() { + TCOD_value_t ret; + TCOD_list_t l; + bool end=false; + char **s; + int slen=0; + l=TCOD_list_new(); + if ( lex->token_type != TCOD_LEX_STRING ) TCOD_parser_error("parseStringValue : string constant expected instead of '%s'",lex->tok); + while ( !end ) { + TCOD_lex_t save; + TCOD_list_push(l,(void *)TCOD_strdup(lex->tok)); + TCOD_lex_savepoint(lex,&save); + if (TCOD_lex_parse(lex) != TCOD_LEX_STRING) { + end=true; + TCOD_lex_restore(lex,&save); + } + } + for (s=(char **)TCOD_list_begin(l); s != (char **)TCOD_list_end(l); s++ ) { + slen += strlen(*s); + } + ret.s=(char *)calloc(sizeof(char),slen+1); + for (s=(char **)TCOD_list_begin(l); s != (char **)TCOD_list_end(l); s++ ) { + strcat(ret.s,*s); + free(*s); + } + TCOD_list_delete(l); + return ret; +} + +TCOD_value_t TCOD_parse_color_value() { + TCOD_value_t ret; + if ( lex->token_type == TCOD_LEX_SYMBOL && lex->tok[0]=='#') { + char tmp[128]=""; + int tok=TCOD_lex_parse(lex); + /* format : col = #FFFFFF */ + strcat(tmp,"#"); + if ( tok == TCOD_LEX_IDEN || tok == TCOD_LEX_INTEGER ) { + strcat(tmp,lex->tok); + strcpy(lex->tok,tmp); + if ( strlen(lex->tok) < 7 && tok == TCOD_LEX_INTEGER ) { + /* special case of #12AABB => symbol # + + integer 12 + iden AABB */ + tok=TCOD_lex_parse(lex); + if ( tok == TCOD_LEX_IDEN ) { + strcat(tmp,lex->tok); + strcpy(lex->tok,tmp); + } + } + lex->token_type = TCOD_LEX_STRING; + } + } + if ( lex->token_type != TCOD_LEX_STRING ) TCOD_parser_error("parseColorValue : string constant expected instead of '%s'",lex->tok); + if (lex->tok[0] == '#') { + int r,g,b; + if ( strlen(lex->tok) != 7 ) TCOD_parser_error("parseColorValue : bad color format. '#rrggbb' expected instead of '%s'",lex->tok); + /* web format : #rrggbb */ + r=(TCOD_lex_hextoint(lex->tok[1])<<4) + TCOD_lex_hextoint(lex->tok[2]); + g=(TCOD_lex_hextoint(lex->tok[3])<<4) + TCOD_lex_hextoint(lex->tok[4]); + b=(TCOD_lex_hextoint(lex->tok[5])<<4) + TCOD_lex_hextoint(lex->tok[6]); + ret.col.r=r; + ret.col.g=g; + ret.col.b=b; + } else { + /* standard format : rrr,ggg,bbb */ + char *begin=lex->tok; + char *end=strchr(begin,','); + bool ok=true; + if (! end) ok=false; + else { + *end=0; + ret.col.r=atoi(begin); + begin=end+1; + end=strchr(begin,','); + if ( !end ) ok=false; + else { + ret.col.g=atoi(begin); + begin=end+1; + ret.col.b=atoi(begin); + } + + } + if (!ok) TCOD_parser_error("parseColorValue : bad color format 'rrr,ggg,bbb' expected instead of '%s'",lex->tok); + } + return ret; +} + +TCOD_value_t TCOD_parse_dice_value() { + /* dice format : [(x|*)](D|d)[(+|-)] */ + TCOD_value_t ret; + bool minus=false; + char *begin; + char *ptr; + ret.dice.multiplier=1.0f; + ret.dice.addsub=0.0f; + begin=lex->tok; + ptr=strchr(begin,'x'); + if (! ptr ) ptr=strchr(begin,'*'); + if ( ptr ) { + /* parse multiplier */ + *ptr=0; + ret.dice.multiplier=(float)atof(lex->tok); + begin=ptr+1; + } + ptr=strchr(begin,'D'); + if (!ptr ) ptr=strchr(begin,'d'); + if (! ptr ) TCOD_parser_error("parseDiceValue : bad dice format. [(x|*)](D|d)[(+|-)] expected instead of '%s'",lex->tok); + *ptr=0; + /* parse nb_rolls */ + ret.dice.nb_rolls=atoi(begin); + begin=ptr+1; + ptr=strchr(begin,'+'); + if (! ptr) { + ptr = strchr(begin,'-'); + if ( ptr ) minus=true; + } + if (ptr) *ptr=0; + /* parse nb_faces */ + ret.dice.nb_faces=atoi(begin); + if ( ptr ) { + /* parse addsub */ + begin=ptr+1; + ret.dice.addsub=(float)atof(begin); + if ( minus ) ret.dice.addsub=-ret.dice.addsub; + } + return ret; +} + +TCOD_value_t TCOD_parse_value_list_value(TCOD_struct_int_t *def,int listnum) { + TCOD_value_t ret; + int i=0; + char *value; + char **value_list=TCOD_list_get(def->lists,listnum); + if ( lex->token_type != TCOD_LEX_STRING) TCOD_parser_error("parseValueListValue : string constant expected instead of '%s'",lex->tok); + value= value_list[i]; + while ( value ) { + if ( strcmp(lex->tok,value) == 0 ) break; + i++; + value=value_list[i]; + } + if (! value ) TCOD_parser_error("parseValueListValue : incorrect value '%s'",lex->tok); + ret.s = value; + return ret; +} + + +TCOD_value_t TCOD_parse_property_value(TCOD_parser_int_t *parser, TCOD_parser_struct_t def, char *propname, bool list) { + TCOD_value_type_t type=TCOD_struct_get_type(def,propname); + TCOD_value_t ret={0}; + if (! list ) type &= ~ TCOD_TYPE_LIST; + if ( type & TCOD_TYPE_LIST ) { + type &= ~ TCOD_TYPE_LIST; + if ( strcmp(lex->tok,"[") != 0 ) { + TCOD_parser_error("'[' expected for list value instead of '%s'",lex->tok); + } + ret.list=TCOD_list_new(); + do { + TCOD_value_t val; + int tok=TCOD_lex_parse(lex); + if ( tok == TCOD_LEX_EOF || tok == TCOD_LEX_ERROR ) { + TCOD_parser_error("Missing ']' in list value"); + } + val=TCOD_parse_property_value(parser,def,propname,false); + if ( type == TCOD_TYPE_STRING || (type >= TCOD_TYPE_VALUELIST00 && type <= TCOD_TYPE_VALUELIST15 ) ) { + TCOD_list_push(ret.list,TCOD_strdup(val.s)); + } else { + TCOD_list_push(ret.list,val.custom); + } + TCOD_lex_parse(lex); + if ( strcmp(lex->tok,",") != 0 && strcmp(lex->tok,"]") != 0 ) { + TCOD_parser_error("',' or ']' expected in list value instead of '%s'",lex->tok); + } + } while ( strcmp(lex->tok,"]") != 0 ); + } else { + switch (type) { + case TCOD_TYPE_BOOL : return TCOD_parse_bool_value(); break; + case TCOD_TYPE_CHAR : return TCOD_parse_char_value(); break; + case TCOD_TYPE_INT : return TCOD_parse_integer_value(); break; + case TCOD_TYPE_FLOAT : return TCOD_parse_float_value(); break; + case TCOD_TYPE_STRING : return TCOD_parse_string_value(); break; + case TCOD_TYPE_COLOR : return TCOD_parse_color_value(); break; + case TCOD_TYPE_DICE : return TCOD_parse_dice_value(); break; + case TCOD_TYPE_VALUELIST00 : + case TCOD_TYPE_VALUELIST01 : + case TCOD_TYPE_VALUELIST02 : + case TCOD_TYPE_VALUELIST03 : + case TCOD_TYPE_VALUELIST04 : + case TCOD_TYPE_VALUELIST05 : + case TCOD_TYPE_VALUELIST06 : + case TCOD_TYPE_VALUELIST07 : + case TCOD_TYPE_VALUELIST08 : + case TCOD_TYPE_VALUELIST09 : + case TCOD_TYPE_VALUELIST10 : + case TCOD_TYPE_VALUELIST11 : + case TCOD_TYPE_VALUELIST12 : + case TCOD_TYPE_VALUELIST13 : + case TCOD_TYPE_VALUELIST14 : + case TCOD_TYPE_VALUELIST15 : { + int listnum = type - TCOD_TYPE_VALUELIST00; + return TCOD_parse_value_list_value((TCOD_struct_int_t *)def,listnum); break; + } + case TCOD_TYPE_CUSTOM00 : + case TCOD_TYPE_CUSTOM01 : + case TCOD_TYPE_CUSTOM02 : + case TCOD_TYPE_CUSTOM03 : + case TCOD_TYPE_CUSTOM04 : + case TCOD_TYPE_CUSTOM05 : + case TCOD_TYPE_CUSTOM06 : + case TCOD_TYPE_CUSTOM07 : + case TCOD_TYPE_CUSTOM08 : + case TCOD_TYPE_CUSTOM09 : + case TCOD_TYPE_CUSTOM10 : + case TCOD_TYPE_CUSTOM11 : + case TCOD_TYPE_CUSTOM12 : + case TCOD_TYPE_CUSTOM13 : + case TCOD_TYPE_CUSTOM14 : + case TCOD_TYPE_CUSTOM15 : + if ( parser->customs[type - TCOD_TYPE_CUSTOM00] ) { + return parser->customs[type-TCOD_TYPE_CUSTOM00](lex,listener,def,propname); + } else { + TCOD_parser_error("parse_property_value : no custom parser for property type %d for entity %s prop %s", + type,DEF_NAME(def),propname); + } + break; + default : TCOD_parser_error("parse_property_value : unknown property type %d for entity %s prop %s", + type,DEF_NAME(def),propname); break; + } + } + return ret; +} + +static bool TCOD_parser_parse_entity(TCOD_parser_int_t *parser, TCOD_struct_int_t *def) { + char *name=NULL; + if ( TCOD_lex_parse(lex) == TCOD_LEX_STRING ) { + /* entity type name */ + name=TCOD_strdup(lex->tok); + TCOD_lex_parse(lex); + } + if ( strcmp(lex->tok,"{") != 0 ) { + TCOD_parser_error("Parser::parseEntity : '{' expected"); + return false; + } + TCOD_lex_parse(lex); + while ( strcmp(lex->tok,"}") != 0 ) { + bool found=false; + char **iflag; + bool dynStruct=false; + TCOD_value_type_t dynType = TCOD_TYPE_NONE; + if ( lex->token_type == TCOD_LEX_KEYWORD ) { + /* dynamic property declaration */ + if ( strcmp(lex->tok,"bool") == 0 ) dynType=TCOD_TYPE_BOOL; + else if ( strcmp(lex->tok,"char") == 0 ) dynType=TCOD_TYPE_CHAR; + else if ( strcmp(lex->tok,"int") == 0 ) dynType=TCOD_TYPE_INT; + else if ( strcmp(lex->tok,"float") == 0 ) dynType=TCOD_TYPE_FLOAT; + else if ( strcmp(lex->tok,"string") == 0 ) dynType=TCOD_TYPE_STRING; + else if ( strcmp(lex->tok,"color") == 0 ) dynType=TCOD_TYPE_COLOR; + else if ( strcmp(lex->tok,"dice") == 0 ) dynType=TCOD_TYPE_DICE; + else if ( strcmp(lex->tok,"struct") == 0 ) dynStruct=true; + else { + TCOD_parser_error("Parser::parseEntity : dynamic declaration of '%s' not supported",lex->tok); + return false; + } + /* TODO : dynamically declared sub-structures */ + TCOD_lex_parse(lex); + if ( strcmp(lex->tok,"[") == 0 ) { + if ( dynType == TCOD_TYPE_NONE ) { + TCOD_parser_error("Parser::parseEntity : unexpected symbol '['"); + return false; + } + TCOD_lex_parse(lex); + if ( strcmp(lex->tok,"]") != 0 ) { + TCOD_parser_error("Parser::parseEntity : syntax error. ']' expected instead of '%s'",lex->tok); + return false; + } + dynType |= TCOD_TYPE_LIST; + TCOD_lex_parse(lex); + } + } + /* parse entity type content */ + if ( lex->token_type != TCOD_LEX_IDEN ) { + TCOD_parser_error("Parser::parseEntity : identifier expected"); + return false; + } + /* is it a flag ? */ + if (! dynStruct && dynType == TCOD_TYPE_NONE) { + for (iflag=(char **)TCOD_list_begin(def->flags);iflag!=(char **)TCOD_list_end(def->flags); iflag++) { + if ( strcmp(*iflag,lex->tok) == 0 ) { + found=true; + if (!listener->new_flag(lex->tok)) return false; + break; + } + } + } + if (!found && ! dynStruct) { + do { + /* is it a property ? */ + TCOD_struct_prop_t **iprop; + for (iprop=(TCOD_struct_prop_t **)TCOD_list_begin(def->props); iprop!=(TCOD_struct_prop_t **)TCOD_list_end(def->props);iprop++) { + if ( strcmp((*iprop)->name,lex->tok) == 0 ) { + char propname[BIG_NAME_LEN]; + string_copy(propname,lex->tok,BIG_NAME_LEN); + TCOD_lex_parse(lex); + if ( strcmp(lex->tok,"=") != 0 ) { + TCOD_parser_error("Parser::parseEntity : '=' expected"); + return false; + } + TCOD_lex_parse(lex); + if (!listener->new_property(propname,TCOD_struct_get_type(def,propname), + TCOD_parse_property_value(parser, (TCOD_parser_struct_t *)def,propname,true))) return false; + if ( lex->token_type == TCOD_LEX_ERROR ) return false; + found=true; + break; + } + } + if ( !found && dynType != TCOD_TYPE_NONE ) { + /* dynamically add a property to the current structure */ + TCOD_struct_add_property(def,lex->tok,dynType,false); + } + } while ( ! found && dynType != TCOD_TYPE_NONE); + } + if (! found ) { + /* is it a sub-entity type */ + char id[BIG_NAME_LEN*2 + 2]; + bool blockFound=false; + do { + TCOD_lex_t save; + char type[BIG_NAME_LEN]; + char *subname=NULL; + bool named=false; + TCOD_lex_savepoint(lex,&save); + string_copy(type,lex->tok,BIG_NAME_LEN); + strcpy(id,type); + if ( TCOD_lex_parse(lex) == TCOD_LEX_STRING ) { + /* # */ + TCOD_struct_int_t **sub; + strcat(id,"#"); + strcat(id,lex->tok); + named=true; + subname=TCOD_strdup(lex->tok); + TCOD_lex_restore(lex,&save); + for ( sub = (TCOD_struct_int_t **)TCOD_list_begin(def->structs); + sub != (TCOD_struct_int_t **)TCOD_list_end(def->structs); sub ++ ) { + if ( strcmp((*sub)->name,id) == 0 ) { + if (!listener->new_struct((TCOD_parser_struct_t *)(*sub),lex->tok)) return false; + if (!TCOD_parser_parse_entity(parser,*sub)) return false; + blockFound=true; + found=true; + break; + } + } + } else { + TCOD_lex_restore(lex,&save); + } + if (! blockFound ) { + /* alone */ + TCOD_struct_int_t **sub; + for ( sub = (TCOD_struct_int_t **)TCOD_list_begin(def->structs); + sub != (TCOD_struct_int_t **)TCOD_list_end(def->structs); sub ++ ) { + if ( strcmp((*sub)->name,type) == 0 ) { + if (!listener->new_struct((TCOD_parser_struct_t *)(*sub),subname)) return false; + if (!TCOD_parser_parse_entity(parser,*sub)) return false; + blockFound=true; + found=true; + break; + } + } + } + if (! blockFound && dynStruct ) { + /* unknown structure. auto-declaration */ + TCOD_struct_int_t **idef; + TCOD_struct_int_t *s=NULL; + for (idef=(TCOD_struct_int_t **)TCOD_list_begin(parser->structs); idef!=(TCOD_struct_int_t **)TCOD_list_end(parser->structs); idef ++) { + if ( strcmp((*idef)->name,id) == 0 ) { + s=*idef; + break; + } + } + if ( s == NULL && named ) { + /* look for general definition for entity # */ + for (idef=(TCOD_struct_int_t **)TCOD_list_begin(parser->structs); idef!=(TCOD_struct_int_t **)TCOD_list_end(parser->structs); idef ++) { + if ( strcmp((*idef)->name,type) == 0 ) { + s=*idef; + break; + } + } + } + if ( s == NULL ) { + /* dyn struct not found. create it */ + s = TCOD_parser_new_struct(parser,type); + } + TCOD_struct_add_structure(def,s); + } + } while (!blockFound && dynStruct ); + if (! blockFound ) { + TCOD_parser_error("Parser::parseEntity : entity type %s does not contain %s", + def->name,id); + return false; + } + } + TCOD_lex_parse(lex); + } + if (!listener->end_struct((TCOD_parser_struct_t *)def,name)) return false; + return true; +} + +/****************************************/ +/* generic parser */ +/****************************************/ + +TCOD_parser_t TCOD_parser_new() { + TCOD_parser_int_t *ent = (TCOD_parser_int_t*)calloc(1,sizeof(TCOD_parser_int_t)); + ent->structs=TCOD_list_new(); + return (TCOD_parser_t) ent; +} + +TCOD_value_type_t TCOD_parser_new_custom_type(TCOD_parser_t parser, TCOD_parser_custom_t custom_type_parser) { + TCOD_parser_int_t *p=(TCOD_parser_int_t *)parser; + TCOD_value_type_t type= TCOD_TYPE_CUSTOM00; + while ( p->customs[ type - TCOD_TYPE_CUSTOM00 ] && type < TCOD_TYPE_CUSTOM15 ) type=(TCOD_value_type_t)(type+1); + if ( p->customs[ type - TCOD_TYPE_CUSTOM00 ] ) { + /* no more custom types slots available */ + return TCOD_TYPE_NONE; + } + p->customs[type - TCOD_TYPE_CUSTOM00] = custom_type_parser; + return type; +} + +TCOD_parser_struct_t TCOD_parser_new_struct(TCOD_parser_t parser, char *name) { + TCOD_struct_int_t *ent = (TCOD_struct_int_t*)calloc(1,sizeof(TCOD_struct_int_t)); + ent->name=TCOD_strdup(name); + ent->flags=TCOD_list_new(); + ent->props=TCOD_list_new(); + ent->lists=TCOD_list_new(); + ent->structs=TCOD_list_new(); + TCOD_list_push(((TCOD_parser_int_t *)parser)->structs,ent); + return (TCOD_parser_struct_t )ent; +} + +void TCOD_parser_delete(TCOD_parser_t parser) { + TCOD_parser_int_t *p=(TCOD_parser_int_t *)parser; + TCOD_struct_int_t **idef; + TCOD_struct_prop_t **propCleanup; + + char *** listCleanup; + int listSize = 0; + + for (idef=(TCOD_struct_int_t **)TCOD_list_begin(p->structs); idef!= (TCOD_struct_int_t **)TCOD_list_end(p->structs); idef++) { + free((*idef)->name); + + for ( propCleanup = (TCOD_struct_prop_t**) TCOD_list_begin((*idef)->props); propCleanup != (TCOD_struct_prop_t**)TCOD_list_end((*idef)->props); propCleanup++ ) { + free((*propCleanup)->name); + } + TCOD_list_clear_and_delete((*idef)->props); + + + for ( listCleanup = (char ***) TCOD_list_begin((*idef)->lists); listCleanup != (char ***)TCOD_list_end((*idef)->lists); listCleanup++ ) { + while((*listCleanup)[listSize] != NULL) { + free((*listCleanup)[listSize]); + listSize++; + } + } + TCOD_list_clear_and_delete((*idef)->lists); + } + TCOD_list_clear_and_delete(p->structs); +} + +/* parse a file */ +static TCOD_list_t *default_props; +/* triggers callbacks in the listener for each event during parsing */ +void TCOD_parser_run(TCOD_parser_t parser, const char *filename, TCOD_parser_listener_t *_listener) { + TCOD_parser_int_t *p=(TCOD_parser_int_t *)parser; + if (! _listener && ! p->props ) p->props=TCOD_list_new(); + listener=_listener ? _listener : &default_listener; + default_props = p->props; + lex=TCOD_lex_new(symbols,keywords,"//","/*","*/",NULL,"\"",TCOD_LEX_FLAG_NESTING_COMMENT); + if (!TCOD_lex_set_data_file(lex,(char *)filename)) { + char buf[1024]; + sprintf(buf,"Fatal error : %s\n",TCOD_lex_get_last_error()); + listener->error(buf); + return; + } + while (1) { + bool named=false; + char id[ BIG_NAME_LEN*2 + 2 ]; + char type[ BIG_NAME_LEN ]; + TCOD_lex_t save; + TCOD_struct_int_t *def=NULL; + TCOD_struct_int_t **idef; + bool dynStruct=false; + TCOD_lex_parse(lex); + if ( lex->token_type == TCOD_LEX_EOF || lex->token_type == TCOD_LEX_ERROR ) break; + if ( lex->token_type == TCOD_LEX_KEYWORD ) { + if ( strcmp(lex->tok,"struct") == 0) { + /* level 0 dynamic structure declaration */ + dynStruct=true; + TCOD_lex_parse(lex); + } else { + TCOD_parser_error("Parser::parse : unexpected keyword '%s'",lex->tok); + return; + } + } + /* get entity type */ + if ( lex->token_type != TCOD_LEX_IDEN ) { + TCOD_parser_error("Parser::parse : identifier token expected"); + return; + } + string_copy(type,lex->tok,BIG_NAME_LEN); + strcpy(id,type); + TCOD_lex_savepoint(lex,&save); + if ( TCOD_lex_parse(lex) == TCOD_LEX_STRING ) { + /* named entity. id = # */ + strcat(id,"#"); + if ( strlen(lex->tok) >= BIG_NAME_LEN ) { + TCOD_parser_error("Parser::parse : name %s too long. Max %d characters", + lex->tok,BIG_NAME_LEN-1); + return; + } + strcat(id,lex->tok); + named=true; + } + TCOD_lex_restore(lex,&save); + do { + /* look for a definition for id */ + for (idef=(TCOD_struct_int_t **)TCOD_list_begin(p->structs); idef!=(TCOD_struct_int_t **)TCOD_list_end(p->structs); idef ++) { + if ( strcmp((*idef)->name,id) == 0 ) { + def=*idef; + break; + } + } + if ( def == NULL && named ) { + /* look for general definition for entity # */ + for (idef=(TCOD_struct_int_t **)TCOD_list_begin(p->structs); idef!=(TCOD_struct_int_t **)TCOD_list_end(p->structs); idef ++) { + if ( strcmp((*idef)->name,type) == 0 ) { + def=(*idef); + break; + } + } + } + if ( def == NULL && dynStruct ) { + /* dyn struct not found. create it */ + TCOD_parser_new_struct(parser,type); + } + } while ( def == NULL && dynStruct ); + if (def == NULL ) { + TCOD_parser_error("Parser::parse : unknown entity type %s",type); + return; + } else { + if (!listener->new_struct((TCOD_parser_struct_t)def,named ? strchr(id,'#')+1 : NULL )) return; + if (!TCOD_parser_parse_entity(p,def)) return; + } + } + if (lex->token_type == TCOD_LEX_ERROR) { + TCOD_parser_error("Parser::parse : error while parsing"); + return; + } + TCOD_lex_delete(lex); +} +/* default parser listener */ +typedef struct { + char *name; + TCOD_value_type_t type; + TCOD_value_t value; +} prop_t; +static char cur_prop_name[512]=""; +static bool default_new_struct(TCOD_parser_struct_t str,const char *name) { + if ( cur_prop_name[0] ) strcat(cur_prop_name,"."); + strcat(cur_prop_name,((TCOD_struct_int_t *)str)->name); + return true; +} + +static bool default_new_flag(const char *name) { + char tmp[512]; + prop_t *prop=(prop_t *)calloc(sizeof(prop_t),1); + sprintf(tmp,"%s.%s",cur_prop_name,name); + prop->name=TCOD_strdup(tmp); + prop->type=TCOD_TYPE_BOOL; + prop->value.b=true; + TCOD_list_push(default_props,prop); + return true; +} + +static bool default_new_property(const char *propname, TCOD_value_type_t type, TCOD_value_t value) { + char tmp[512]; + prop_t *prop=(prop_t *)calloc(sizeof(prop_t),1); + sprintf(tmp,"%s.%s",cur_prop_name,propname); + prop->name=TCOD_strdup(tmp); + prop->type=type; + prop->value=value; + TCOD_list_push(default_props,prop); + return true; +} + +static bool default_end_struct(TCOD_parser_struct_t str, const char *name) { + char *ptr=strrchr(cur_prop_name,'.'); + if ( ptr ) *ptr='\0'; + else cur_prop_name[0]='\0'; + return true; +} + +static void default_error(const char *msg) { + TCOD_fatal_nopar(msg); +} + +static const TCOD_value_t * TCOD_get_property(TCOD_parser_t parser, TCOD_value_type_t expectedType, const char *name) { + void **it; + char tmp[512],err[512]; + char *ptr,*curname; + TCOD_struct_int_t *str=NULL; + TCOD_value_type_t type; + TCOD_parser_int_t *p=(TCOD_parser_int_t *)parser; + if (! p->props ) return NULL; + for (it=TCOD_list_begin(p->props);it!=TCOD_list_end(p->props);it++) { + prop_t *prop=*((prop_t **)it); + if (strcmp(prop->name,name) == 0 ) { + /* property found. check type */ + if ( expectedType == TCOD_TYPE_STRING && prop->type >= TCOD_TYPE_VALUELIST00 + && prop->type <= TCOD_TYPE_VALUELIST15 ) return &prop->value; + if ( expectedType == TCOD_TYPE_CUSTOM00 && prop->type >= TCOD_TYPE_CUSTOM00 + && prop->type <= TCOD_TYPE_CUSTOM15 ) return &prop->value; + if (prop->type != expectedType ) { + sprintf(err,"Fatal error ! Try to read property '%s' width bad type\n",name); + default_error(err); + } + return &prop->value; + } + } + /* property not found. Check if it exists */ + strcpy(tmp,name); + ptr=strchr(tmp,'.'); + curname=tmp; + sprintf(err,"Fatal error ! Try to read unknown property '%s'\n",name); + while ( ptr ) { + bool found=false; + *ptr=0; + for (it=TCOD_list_begin(p->structs);!found && it!=TCOD_list_end(p->structs);it++) { + str=*((TCOD_struct_int_t **)it); + if ( strcmp(str->name,curname) == 0 ) found=true; + } + if ( ! found ) { + /* one of the structures is unknown */ + default_error(err); + } + curname=ptr+1; + ptr=strchr(curname,'.'); + } + if ( ! str ) { + /* no structure in name */ + default_error(err); + } + type = TCOD_struct_get_type((TCOD_parser_struct_t) str, curname); + if ( type == TCOD_TYPE_NONE ) { + /* property does not exist in structure */ + default_error(err); + } + /* optional property not defined in the file => ok */ + return NULL; +} + +bool TCOD_parser_has_property(TCOD_parser_t parser, const char *name) { + void **it; + TCOD_parser_int_t *p=(TCOD_parser_int_t *)parser; + if (! p->props ) return false; + for (it=TCOD_list_begin(p->props);it!=TCOD_list_end(p->props);it++) { + prop_t *prop=*((prop_t **)it); + if (strcmp(prop->name,name) == 0 ) { + return true; + } + } + return false; +} + +bool TCOD_parser_get_bool_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_BOOL,name); + return value ? value->b : false; +} + +int TCOD_parser_get_int_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_INT,name); + return value ? value->i : 0; +} + +int TCOD_parser_get_char_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_CHAR,name); + return value ? value->c : 0; +} + +float TCOD_parser_get_float_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_FLOAT,name); + return value ? value->f : 0.0f; +} + +const char * TCOD_parser_get_string_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_STRING,name); + return value ? value->s : NULL; +} + +TCOD_color_t TCOD_parser_get_color_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_COLOR,name); + return value ? value->col : TCOD_black; +} + +TCOD_dice_t TCOD_parser_get_dice_property(TCOD_parser_t parser, const char *name) { + static TCOD_dice_t default_dice={0,0,0.0f,0.0f}; + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_DICE,name); + return value ? value->dice : default_dice; +} + +void TCOD_parser_get_dice_property_py(TCOD_parser_t parser, const char *name, TCOD_dice_t *dice) { + *dice=TCOD_parser_get_dice_property(parser,name); +} + +void * TCOD_parser_get_custom_property(TCOD_parser_t parser, const char *name) { + const TCOD_value_t *value=TCOD_get_property(parser,TCOD_TYPE_CUSTOM00,name); + return value ? value->custom : NULL; +} + +TCOD_list_t TCOD_parser_get_list_property(TCOD_parser_t parser, const char *name, TCOD_value_type_t type) { + static TCOD_list_t empty_list=NULL; + const TCOD_value_t *value; + if (! empty_list ) empty_list=TCOD_list_new(); + value=TCOD_get_property(parser,TCOD_TYPE_LIST|type,name); + return value ? value->list : empty_list; +} + diff --git a/tcod/tcod_sys/libtcod/src/path.cpp b/tcod/tcod_sys/libtcod/src/path.cpp new file mode 100644 index 00000000..3e0f3382 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/path.cpp @@ -0,0 +1,139 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" + + +TCODPath::TCODPath(const TCODMap *map, float diagonalCost) { + data=(void *)TCOD_path_new_using_map(map->data,diagonalCost); +} + +TCODPath::~TCODPath() { + TCOD_path_delete(data); +} + +float TCOD_path_func(int xFrom, int yFrom, int xTo,int yTo, void *data) { + TCODPath::WrapperData *cppData=(TCODPath::WrapperData *)data; + return cppData->listener->getWalkCost(xFrom,yFrom,xTo,yTo,cppData->userData); +} + +TCODPath::TCODPath(int width, int height, const ITCODPathCallback *listener, void *userData, float diagonalCost) { + cppData.listener=listener; + cppData.userData=userData; + data=(void *)TCOD_path_new_using_function(width, height, TCOD_path_func, (void *)&cppData,diagonalCost); +} + + +bool TCODPath::compute(int ox, int oy, int dx, int dy) { + return TCOD_path_compute(data,ox,oy,dx,dy) != 0; +} + +bool TCODPath::walk(int *x, int *y, bool recalculateWhenNeeded) { + return TCOD_path_walk(data,x,y,recalculateWhenNeeded) != 0; +} + +bool TCODPath::isEmpty() const { + return TCOD_path_is_empty(data) != 0; +} + +void TCODPath::reverse() { + TCOD_path_reverse(data); +} + +int TCODPath::size() const { + return TCOD_path_size(data); +} + +void TCODPath::get(int index, int *x, int *y) const { + return TCOD_path_get(data,index,x,y); +} + +void TCODPath::getOrigin(int *x,int *y) const { + TCOD_path_get_origin(data,x,y); +} + +void TCODPath::getDestination(int *x,int *y) const { + TCOD_path_get_destination(data,x,y); +} + +// ----------------- // +// Dijkstra // +// written by Mingos // +// ----------------- // + +//ctor +TCODDijkstra::TCODDijkstra (TCODMap *map, float diagonalCost) { + data = TCOD_dijkstra_new(map->data,diagonalCost); +} + +//another ctor +TCODDijkstra::TCODDijkstra (int width, int height, const ITCODPathCallback *listener, void *userData, float diagonalCost) { + cppData.listener=listener; + cppData.userData=userData; + data=(void *)TCOD_dijkstra_new_using_function(width, height, TCOD_path_func, (void *)&cppData,diagonalCost); +} + +//dtor +TCODDijkstra::~TCODDijkstra (void) { + TCOD_dijkstra_delete(data); +} + +//compute distances grid +void TCODDijkstra::compute (int rootX, int rootY) { + TCOD_dijkstra_compute(data,rootX,rootY); +} + +//retrieve distance to a given cell +float TCODDijkstra::getDistance (int x, int y) { + return TCOD_dijkstra_get_distance(data,x,y); +} + +//create a path +bool TCODDijkstra::setPath (int toX, int toY) { + return (TCOD_dijkstra_path_set(data,toX,toY) != 0); +} + +void TCODDijkstra::reverse() { + TCOD_dijkstra_reverse(data); +} + +//walk a path +bool TCODDijkstra::walk (int *x, int *y) { + return TCOD_dijkstra_path_walk(data,x,y) != 0; +} + +bool TCODDijkstra::isEmpty() const { + return TCOD_dijkstra_is_empty(data) != 0; +} + +int TCODDijkstra::size() const { + return TCOD_dijkstra_size(data); +} + +void TCODDijkstra::get(int index, int *x, int *y) const { + return TCOD_dijkstra_get(data,index,x,y); +} + diff --git a/tcod/tcod_sys/libtcod/src/path_c.c b/tcod/tcod_sys/libtcod/src/path_c.c new file mode 100644 index 00000000..21e1ade4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/path_c.c @@ -0,0 +1,689 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" +enum { NORTH_WEST,NORTH, NORTH_EAST, WEST,NONE,EAST, SOUTH_WEST,SOUTH,SOUTH_EAST }; +typedef unsigned char dir_t; + +/* convert dir_t to dx,dy */ +static int dirx[]={-1,0,1,-1,0,1,-1,0,1}; +static int diry[]={-1,-1,-1,0,0,0,1,1,1}; +static int invdir[] = {SOUTH_EAST,SOUTH,SOUTH_WEST,EAST,NONE,WEST,NORTH_EAST,NORTH,NORTH_WEST}; + +typedef struct { + int ox,oy; /* coordinates of the creature position */ + int dx,dy; /* coordinates of the creature's destination */ + TCOD_list_t path; /* list of dir_t to follow the path */ + int w,h; /* map size */ + float *grid; /* wxh djikstra distance grid (covered distance) */ + float *heur; /* wxh A* score grid (covered distance + estimated remaining distance) */ + dir_t *prev; /* wxh 'previous' grid : direction to the previous cell */ + float diagonalCost; + TCOD_list_t heap; /* min_heap used in the algorithm. stores the offset in grid/heur (offset=x+y*w) */ + TCOD_map_t map; + TCOD_path_func_t func; + void *user_data; +} TCOD_path_data_t; + +/* small layer on top of TCOD_list_t to implement a binary heap (min_heap) */ +static void heap_sift_down(TCOD_path_data_t *path, TCOD_list_t heap) { + /* sift-down : move the first element of the heap down to its right place */ + int cur=0; + int end = TCOD_list_size(heap)-1; + int child=1; + uintptr *array=(uintptr *)TCOD_list_begin(heap); + while ( child <= end ) { + int toSwap=cur; + uint32 off_cur=array[cur]; + float cur_dist=path->heur[off_cur]; + float swapValue=cur_dist; + uint32 off_child=array[child]; + float child_dist=path->heur[off_child]; + if ( child_dist < cur_dist ) { + toSwap=child; + swapValue=child_dist; + } + if ( child < end ) { + /* get the min between child and child+1 */ + uintptr off_child2=array[child+1]; + float child2_dist=path->heur[off_child2]; + if ( swapValue > child2_dist ) { + toSwap=child+1; + swapValue=child2_dist; + } + } + if ( toSwap != cur ) { + /* get down one level */ + uintptr tmp = array[toSwap]; + array[toSwap]=array[cur]; + array[cur]=tmp; + cur=toSwap; + } else return; + child=cur*2+1; + } +} + +static void heap_sift_up(TCOD_path_data_t *path, TCOD_list_t heap) { + /* sift-up : move the last element of the heap up to its right place */ + int end = TCOD_list_size(heap)-1; + int child=end; + uintptr *array=(uintptr *)TCOD_list_begin(heap); + while ( child > 0 ) { + uintptr off_child=array[child]; + float child_dist=path->heur[off_child]; + int parent = (child-1)/2; + uintptr off_parent=array[parent]; + float parent_dist=path->heur[off_parent]; + if ( parent_dist > child_dist ) { + /* get up one level */ + uintptr tmp = array[child]; + array[child]=array[parent]; + array[parent]=tmp; + child=parent; + } else return; + } +} + +/* add a coordinate pair in the heap so that the heap root always contains the minimum A* score */ +static void heap_add(TCOD_path_data_t *path, TCOD_list_t heap, int x, int y) { + /* append the new value to the end of the heap */ + uintptr off=x+y*path->w; + TCOD_list_push(heap,(void *)off); + /* bubble the value up to its real position */ + heap_sift_up(path,heap); +} + +/* get the coordinate pair with the minimum A* score from the heap */ +static uint32 heap_get(TCOD_path_data_t *path,TCOD_list_t heap) { + /* return the first value of the heap (minimum score) */ + uintptr *array=(uintptr *)TCOD_list_begin(heap); + int end=TCOD_list_size(heap)-1; + uint32 off=(uint32)(array[0]); + /* take the last element and put it at first position (heap root) */ + array[0] = array[end]; + TCOD_list_pop(heap); + /* and bubble it down to its real position */ + heap_sift_down(path,heap); + return off; +} + +/* this is the slow part, when we change the heuristic of a cell already in the heap */ +static void heap_reorder(TCOD_path_data_t *path, uint32 offset) { + uintptr *array=(uintptr *)TCOD_list_begin(path->heap); + uintptr *end=(uintptr *)TCOD_list_end(path->heap); + uintptr *cur=array; + uintptr off_idx=0; + float value; + int idx=0; + int heap_size=TCOD_list_size(path->heap); + /* find the node corresponding to offset ... SLOW !! */ + while (cur != end) { + if (*cur == offset ) break; + cur++;idx++; + } + if ( cur == end ) return; + off_idx=array[idx]; + value=path->heur[off_idx]; + if ( idx > 0 ) { + int parent=(idx-1)/2; + /* compare to its parent */ + uintptr off_parent=array[parent]; + float parent_value=path->heur[off_parent]; + if (value < parent_value) { + /* smaller. bubble it up */ + while ( idx > 0 && value < parent_value ) { + /* swap with parent */ + array[parent]=off_idx; + array[idx] = off_parent; + idx=parent; + if ( idx > 0 ) { + parent=(idx-1)/2; + off_parent=array[parent]; + parent_value=path->heur[off_parent]; + } + } + return; + } + } + /* compare to its sons */ + while ( idx*2+1 < heap_size ) { + int child=idx*2+1; + uintptr off_child=array[child]; + int toSwap=idx; + int child2; + float swapValue=value; + if ( path->heur[off_child] < value ) { + /* swap with son1 ? */ + toSwap=child; + swapValue=path->heur[off_child]; + } + child2 = child+1; + if ( child2 < heap_size ) { + uintptr off_child2=array[child2]; + if ( path->heur[off_child2] < swapValue) { + /* swap with son2 */ + toSwap=child2; + } + } + if ( toSwap != idx ) { + /* bigger. bubble it down */ + uintptr tmp = array[toSwap]; + array[toSwap]=array[idx]; + array[idx] = tmp; + idx=toSwap; + } else return; + } +} + + +/* private functions */ +static void TCOD_path_push_cell(TCOD_path_data_t *path, int x, int y); +static void TCOD_path_get_cell(TCOD_path_data_t *path, int *x, int *y, float *distance); +static void TCOD_path_set_cells(TCOD_path_data_t *path); +static float TCOD_path_walk_cost(TCOD_path_data_t *path, int xFrom, int yFrom, int xTo, int yTo); + +static TCOD_path_data_t *TCOD_path_new_intern(int w, int h) { + TCOD_path_data_t *path=(TCOD_path_data_t *)calloc(sizeof(TCOD_path_data_t),1); + path->w=w; + path->h=h; + path->grid=(float *)calloc(sizeof(float),w*h); + path->heur=(float *)calloc(sizeof(float),w*h); + path->prev=(dir_t *)calloc(sizeof(dir_t),w*h); + if (! path->grid || ! path->heur || ! path->prev ) { + TCOD_fatal("Fatal error : path finding module cannot allocate djikstra grids (size %dx%d)\n",w,h); + exit(1); + } + path->path=TCOD_list_new(); + path->heap=TCOD_list_new(); + return path; +} + +TCOD_path_t TCOD_path_new_using_map(TCOD_map_t map, float diagonalCost) { + TCOD_path_data_t *path; + TCOD_IFNOT(map != NULL) return NULL; + path=TCOD_path_new_intern(TCOD_map_get_width(map),TCOD_map_get_height(map)); + path->map=map; + path->diagonalCost=diagonalCost; + return (TCOD_path_t)path; +} + +TCOD_path_t TCOD_path_new_using_function(int map_width, int map_height, TCOD_path_func_t func, void *user_data, float diagonalCost) { + TCOD_path_data_t *path; + TCOD_IFNOT(func != NULL && map_width > 0 && map_height > 0) return NULL; + path=TCOD_path_new_intern(map_width,map_height); + path->func=func; + path->user_data=user_data; + path->diagonalCost=diagonalCost; + return (TCOD_path_t)path; +} + +bool TCOD_path_compute(TCOD_path_t p, int ox,int oy, int dx, int dy) { + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return false; + path->ox=ox; + path->oy=oy; + path->dx=dx; + path->dy=dy; + TCOD_list_clear(path->path); + TCOD_list_clear(path->heap); + if ( ox == dx && oy == dy ) return true; /* trivial case */ + /* check that origin and destination are inside the map */ + TCOD_IFNOT((unsigned)ox < (unsigned)path->w && (unsigned)oy < (unsigned)path->h) return false; + TCOD_IFNOT((unsigned)dx < (unsigned)path->w && (unsigned)dy < (unsigned)path->h) return false; + /* initialize djikstra grids */ + memset(path->grid,0,sizeof(float)*path->w*path->h); + memset(path->prev,NONE,sizeof(dir_t)*path->w*path->h); + path->heur[ ox + oy * path->w ] = 1.0f; /* anything != 0 */ + TCOD_path_push_cell(path,ox,oy); /* put the origin cell as a bootstrap */ + /* fill the djikstra grid until we reach dx,dy */ + TCOD_path_set_cells(path); + if ( path->grid[dx + dy * path->w] == 0 ) return false; /* no path found */ + /* there is a path. retrieve it */ + do { + /* walk from destination to origin, using the 'prev' array */ + int step=path->prev[ dx + dy * path->w ]; + TCOD_list_push(path->path,(void *)(uintptr)step); + dx -= dirx[step]; + dy -= diry[step]; + } while ( dx != ox || dy != oy ); + return true; +} + +void TCOD_path_reverse(TCOD_path_t p) { + int tmp,i; + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return ; + tmp=path->ox; + path->ox=path->dx; + path->dx=tmp; + tmp=path->oy; + path->oy=path->dy; + path->dy=tmp; + for (i=0; i < TCOD_list_size(path->path); i++) { + int d=(int)(uintptr)TCOD_list_get(path->path,i); + d = invdir[d]; + TCOD_list_set(path->path,(void *)(uintptr)d,i); + } +} + +bool TCOD_path_walk(TCOD_path_t p, int *x, int *y, bool recalculate_when_needed) { + int newx,newy; + float can_walk; + int d; + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return false; + if ( TCOD_path_is_empty(path) ) return false; + d=(int)(uintptr)TCOD_list_pop(path->path); + newx=path->ox + dirx[d]; + newy=path->oy + diry[d]; + /* check if the path is still valid */ + can_walk = TCOD_path_walk_cost(path,path->ox,path->oy,newx,newy); + if ( can_walk == 0.0f ) { + if (! recalculate_when_needed ) return false; /* don't walk */ + /* calculate a new path */ + if (! TCOD_path_compute(path, path->ox,path->oy, path->dx,path->dy) ) return false ; /* cannot find a new path */ + return TCOD_path_walk(p,x,y,true); /* walk along the new path */ + } + if ( x ) *x=newx; + if ( y ) *y=newy; + path->ox=newx; + path->oy=newy; + return true; +} + +bool TCOD_path_is_empty(TCOD_path_t p) { + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return true; + return TCOD_list_is_empty(path->path); +} + +int TCOD_path_size(TCOD_path_t p) { + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return 0; + return TCOD_list_size(path->path); +} + +void TCOD_path_get(TCOD_path_t p, int index, int *x, int *y) { + int pos; + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return; + if ( x ) *x=path->ox; + if ( y ) *y=path->oy; + pos = TCOD_list_size(path->path)-1; + do { + int step=(int)(uintptr)TCOD_list_get(path->path,pos); + if ( x ) *x += dirx[step]; + if ( y ) *y += diry[step]; + pos--;index--; + } while (index >= 0); +} + +void TCOD_path_delete(TCOD_path_t p) { + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return; + if ( path->grid ) free(path->grid); + if ( path->heur ) free(path->heur); + if ( path->prev ) free(path->prev); + if ( path->path ) TCOD_list_delete(path->path); + if ( path->heap ) TCOD_list_delete(path->heap); + free(path); +} + +/* private stuff */ +/* add a new unvisited cells to the cells-to-treat list + * the list is in fact a min_heap. Cell at index i has its sons at 2*i+1 and 2*i+2 + */ +static void TCOD_path_push_cell(TCOD_path_data_t *path, int x, int y) { + heap_add(path,path->heap,x,y); +} + +/* get the best cell from the heap */ +static void TCOD_path_get_cell(TCOD_path_data_t *path, int *x, int *y, float *distance) { + uint32 offset = heap_get(path,path->heap); + *x=(offset % path->w); + *y=(offset / path->w); + *distance=path->grid[offset]; +} +/* fill the grid, starting from the origin until we reach the destination */ +static void TCOD_path_set_cells(TCOD_path_data_t *path) { + while ( path->grid[path->dx + path->dy * path->w ] == 0 && ! TCOD_list_is_empty(path->heap) ) { + + int x,y,i,imax; + float distance; + TCOD_path_get_cell(path,&x,&y,&distance); + imax= ( path->diagonalCost == 0.0f ? 4 : 8) ; + for (i=0; i < imax; i++ ) { + /* convert i to dx,dy */ + static int idirx[]={0,-1,1,0,-1,1,-1,1}; + static int idiry[]={-1,0,0,1,-1,-1,1,1}; + /* convert i to direction */ + static dir_t prevdirs[] = { + NORTH, WEST, EAST, SOUTH, NORTH_WEST, NORTH_EAST,SOUTH_WEST,SOUTH_EAST + }; + /* coordinate of the adjacent cell */ + int cx=x+idirx[i]; + int cy=y+idiry[i]; + if ( cx >= 0 && cy >= 0 && cx < path->w && cy < path->h ) { + float walk_cost = TCOD_path_walk_cost(path,x,y,cx,cy); + if ( walk_cost > 0.0f ) { + /* in of the map and walkable */ + float covered=distance + walk_cost * (i>=4 ? path->diagonalCost : 1.0f); + float previousCovered = path->grid[cx + cy * path->w ]; + if ( previousCovered == 0 ) { + /* put a new cell in the heap */ + int offset=cx + cy * path->w; + /* A* heuristic : remaining distance */ + float remaining=(float)sqrt((cx-path->dx)*(cx-path->dx)+(cy-path->dy)*(cy-path->dy)); + path->grid[ offset ] = covered; + path->heur[ offset ] = covered + remaining; + path->prev[ offset ] = prevdirs[i]; + TCOD_path_push_cell(path,cx,cy); + } else if ( previousCovered > covered ) { + /* we found a better path to a cell already in the heap */ + int offset=cx + cy * path->w; + path->grid[ offset ] = covered; + path->heur[ offset ] -= (previousCovered - covered); /* fix the A* score */ + path->prev[ offset ] = prevdirs[i]; + /* reorder the heap */ + heap_reorder(path,offset); + } + } + } + } + } +} + +/* check if a cell is walkable (from the pathfinder point of view) */ +static float TCOD_path_walk_cost(TCOD_path_data_t *path, int xFrom, int yFrom, int xTo, int yTo) { + if ( path->map ) return TCOD_map_is_walkable(path->map,xTo,yTo) ? 1.0f : 0.0f; + return path->func(xFrom,yFrom,xTo,yTo,path->user_data); +} + +void TCOD_path_get_origin(TCOD_path_t p, int *x, int *y) { + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return; + if ( x ) *x=path->ox; + if ( y ) *y=path->oy; +} + +void TCOD_path_get_destination(TCOD_path_t p, int *x, int *y) { + TCOD_path_data_t *path=(TCOD_path_data_t *)p; + TCOD_IFNOT(p != NULL) return; + if ( x ) *x=path->dx; + if ( y ) *y=path->dy; +} + +/* ------------------------------------------------------- * + * Dijkstra * + * written by Mingos * + * ----------------- * + * A floodfill-like algo that will calculate all distances * + * to all accessible cells (nodes) from a given root node. * + * ------------------------------------------------------- */ + +/* Dijkstra data structure */ +typedef struct { + int diagonal_cost; + int width, height, nodes_max; + TCOD_map_t map; /* a TCODMap with walkability data */ + TCOD_path_func_t func; + void *user_data; + unsigned int * distances; /* distances grid */ + unsigned int * nodes; /* the processed nodes */ + TCOD_list_t path; +} dijkstra_t; + +/* create a Dijkstra object */ +TCOD_dijkstra_t TCOD_dijkstra_new (TCOD_map_t map, float diagonalCost) { + dijkstra_t * data ; + TCOD_IFNOT(map != NULL) return NULL; + data = malloc(sizeof(dijkstra_t)); + data->map = map; + data->func = NULL; + data->user_data=NULL; + data->distances = malloc(TCOD_map_get_nb_cells(data->map)*sizeof(int)); + data->nodes = malloc(TCOD_map_get_nb_cells(data->map)*sizeof(int)); + data->diagonal_cost = (int)((diagonalCost * 100.0f)+0.1f); /* because (int)(1.41f*100.0f) == 140!!! */ + data->width = TCOD_map_get_width(data->map); + data->height = TCOD_map_get_height(data->map); + data->nodes_max = TCOD_map_get_nb_cells(data->map); + data->path = TCOD_list_new(); + return (TCOD_dijkstra_t)data; +} + +TCOD_dijkstra_t TCOD_dijkstra_new_using_function(int map_width, int map_height, TCOD_path_func_t func, void *user_data, float diagonalCost) { + dijkstra_t * data; + TCOD_IFNOT(func != NULL && map_width > 0 && map_height > 0) return NULL; + data = malloc(sizeof(dijkstra_t)); + data->map = NULL; + data->func = func; + data->user_data=user_data; + data->distances = malloc(map_width*map_height*sizeof(int)*4); + data->nodes = malloc(map_width*map_height*sizeof(int)*4); + data->diagonal_cost = (int)((diagonalCost * 100.0f)+0.1f); /* because (int)(1.41f*100.0f) == 140!!! */ + data->width = map_width; + data->height = map_height; + data->nodes_max = map_width*map_height; + data->path = TCOD_list_new(); + return (TCOD_dijkstra_t)data; +} + + +/* compute a Dijkstra grid */ +void TCOD_dijkstra_compute (TCOD_dijkstra_t dijkstra, int root_x, int root_y) { + dijkstra_t * data = (dijkstra_t*)dijkstra; + /* map size data */ + unsigned int mx = data->width; + unsigned int my = data->height; + unsigned int mmax = data->nodes_max; + /* encode the root coords in one integer */ + unsigned int root = (root_y * mx) + root_x; + /* some stuff to walk through the nodes table */ + unsigned int index = 0; /* the index of the first node in queue */ + unsigned int last_index = 1; /* total nb of registered queue indices */ + unsigned int * nodes = data->nodes; /* table of nodes to which the indices above apply */ + /* ok, here's the order of node processing: W, S, E, N, NW, NE, SE, SW */ + static int dx[8] = { -1, 0, 1, 0, -1, 1, 1, -1 }; + static int dy[8] = { 0, -1, 0, 1, -1, -1, 1, 1 }; + /* and distances for each index */ + int dd[8] = { 100, 100, 100, 100, data->diagonal_cost, data->diagonal_cost, data->diagonal_cost, data->diagonal_cost }; + /* if diagonal_cost is 0, disallow diagonal moves */ + int imax = (data->diagonal_cost == 0 ? 4 : 8); + /* aight, now set the distances table and set everything to infinity */ + unsigned int * distances = data->distances; + TCOD_IFNOT(data != NULL) return; + TCOD_IFNOT((unsigned)root_x < (unsigned)mx && (unsigned)root_y < (unsigned)my) return; + memset(distances, 0xFFFFFFFF, mmax*sizeof(int)); + memset(nodes, 0xFFFFFFFF, mmax * sizeof(int)); + /* data for root node is known... */ + distances[root] = 0; + nodes[index] = root; /*set starting note to root */ + /* and the loop */ + do { + if (nodes[index] == 0xFFFFFFFF) { + continue; + } + + /* coordinates of currently processed node */ + unsigned int x = nodes[index] % mx; + unsigned int y = nodes[index] / mx; + + /* check adjacent nodes */ + int i; + for(i=0;imap ) dt += dd[i]; + else { + /* distance given by the user callback */ + userDist=data->func(x,y,tx,ty,data->user_data); + dt += (unsigned int)(userDist*dd[i]); + } + /* ..., encode coordinates, ... */ + new_node = (ty * mx) + tx; + /* and check if the node's eligible for queuing */ + if (distances[new_node] > dt) { + unsigned int j; + /* if not walkable, don't process it */ + if (data->map && !TCOD_map_is_walkable(data->map,tx,ty)) continue; + else if ( data->func && userDist <= 0.0f ) continue; + distances[new_node] = dt; /* set processed node's distance */ + /* place the processed node in the queue before the last queued node with greater distance */ + j = last_index - 1; + while (distances[nodes[j]] >= distances[new_node]) { + /* this ensures that if the node has been queued previously, but with a higher distance, it's removed */ + if (nodes[j] == new_node) { + int k = j; + while ((unsigned)k <= last_index) { + nodes[k] = nodes[k+1]; + k++; + } + last_index--; + } + else nodes[j+1] = nodes[j]; + j--; + } + last_index++; /* increase total indices count */ + nodes[j+1] = new_node; /* and finally put the node where it belongs in the queue */ + } + } + } + } while (mmax > ++index); +} + +/* get distance from source */ +float TCOD_dijkstra_get_distance (TCOD_dijkstra_t dijkstra, int x, int y) { + dijkstra_t * data = (dijkstra_t*)dijkstra; + unsigned int * distances; + TCOD_IFNOT(data != NULL) return -1.0f; + TCOD_IFNOT ((unsigned)x < (unsigned)data->width && (unsigned)y < (unsigned)data->height) return -1.0f; + if (data->distances[(y*data->width)+x] == 0xFFFFFFFF) return -1.0f; + distances = data->distances; + return ((float)distances[(y * data->width) + x] * 0.01f); +} + +unsigned int dijkstra_get_int_distance (dijkstra_t * data, int x, int y) { + unsigned int * distances = data->distances; + return distances[(y * data->width) + x]; +} + +/* create a path */ +bool TCOD_dijkstra_path_set (TCOD_dijkstra_t dijkstra, int x, int y) { + dijkstra_t * data = (dijkstra_t*)dijkstra; + int px = x, py = y; + static int dx[9] = { -1, 0, 1, 0, -1, 1, 1, -1, 0 }; + static int dy[9] = { 0, -1, 0, 1, -1, -1, 1, 1, 0 }; + unsigned int distances[8]; + int lowest_index; + int imax = (data->diagonal_cost == 0 ? 4 : 8); + TCOD_IFNOT(data != NULL) return false; + TCOD_IFNOT((unsigned)x < (unsigned)data->width && (unsigned)y < (unsigned)data->height) return false; + /* check that destination is reachable */ + if ( dijkstra_get_int_distance(data,x,y) == 0xFFFFFFFF ) return false; + TCOD_list_clear(data->path); + do { + unsigned int lowest; + int i; + TCOD_list_push(data->path,(const void*)(uintptr)((py * data->width) + px)); + for(i=0;iwidth && (unsigned)cy < (unsigned)data->height) distances[i] = dijkstra_get_int_distance(data,cx,cy); + else distances[i] = 0xFFFFFFFF; + } + lowest = dijkstra_get_int_distance(data,px,py); + lowest_index = 8; + for(i=0;ipath); + return true; +} + +void TCOD_dijkstra_reverse(TCOD_dijkstra_t dijkstra) { + dijkstra_t * data = (dijkstra_t*)dijkstra; + TCOD_IFNOT(data != NULL) return; + TCOD_list_reverse(data->path); +} + +/* walk the path */ +bool TCOD_dijkstra_path_walk (TCOD_dijkstra_t dijkstra, int *x, int *y) { + dijkstra_t * data = (dijkstra_t*)dijkstra; + TCOD_IFNOT(data != NULL) return false; + if (TCOD_list_is_empty(data->path)) return false; + else { + unsigned int node = (unsigned int)(uintptr)TCOD_list_pop(data->path); + if ( x ) *x = (int)(node % data->width); + if ( y ) *y = (int)(node / data->width); + } + return true; +} + +/* delete a Dijkstra object */ +void TCOD_dijkstra_delete (TCOD_dijkstra_t dijkstra) { + dijkstra_t * data = (dijkstra_t*)dijkstra; + TCOD_IFNOT(data != NULL) return; + if ( data->distances ) free(data->distances); + if ( data->nodes ) free(data->nodes); + if ( data->path ) TCOD_list_delete(data->path); + free(data); +} + +bool TCOD_dijkstra_is_empty(TCOD_dijkstra_t p) { + dijkstra_t * data = (dijkstra_t*)p; + TCOD_IFNOT(data != NULL) return true; + return TCOD_list_is_empty(data->path); +} + +int TCOD_dijkstra_size(TCOD_dijkstra_t p) { + dijkstra_t * data = (dijkstra_t*)p; + TCOD_IFNOT(data != NULL) return 0; + return TCOD_list_size(data->path); +} + +void TCOD_dijkstra_get(TCOD_dijkstra_t p, int index, int *x, int *y) { + dijkstra_t * data = (dijkstra_t*)p; + unsigned int node ; + TCOD_IFNOT(data != NULL) return; + node = (unsigned int)(uintptr)TCOD_list_get(data->path,TCOD_list_size(data->path)-index-1); + if ( x ) *x = (int)(node % data->width); + if ( y ) *y = (int)(node / data->width); +} diff --git a/tcod/tcod_sys/libtcod/src/png/lodepng.c b/tcod/tcod_sys/libtcod/src/png/lodepng.c new file mode 100644 index 00000000..7fa03f91 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/png/lodepng.c @@ -0,0 +1,5921 @@ +/* +LodePNG version 20120729 + +Copyright (c) 2005-2012 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" + +#include +#include + +#ifdef LODEPNG_COMPILE_CPP +#include +#endif /*LODEPNG_COMPILE_CPP*/ + +#define VERSION_STRING "20120729" + +/* +This source file is built up in the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/*The malloc, realloc and free functions defined here with "my" in front of the +name, so that you can easily change them to others related to your platform in +this one location if needed. Everything else in the code calls these.*/ + +static void* mymalloc(size_t size) +{ + return malloc(size); +} + +static void* myrealloc(void* ptr, size_t new_size) +{ + return realloc(ptr, new_size); +} + +static void myfree(void* ptr) +{ + free(ptr); +} + +/* +Declaration of the custom functions used if LODEPNG_COMPILE_ZLIB isn't defined +or LODEPNG_CUSTOM_ZLIB_DECODER or LODEPNG_CUSTOM_ZLIB_ENCODER are enabled. + +In that case, you need to define these yourself (which you can do in one of your +own source files) so that LodePNG can link to it. + +By default, this is not needed. If LODEPNG_COMPILE_ZLIB isn't defined, then only +the two zlib related ones are needed. + +If needed, the functions must act as follows: +*out must be NULL and *outsize must be 0 initially, and after the function is done, +*out must point to the decompressed data, *outsize must be the size of it, and must +be the size of the useful data in bytes, not the alloc size. +*/ +unsigned lodepng_custom_zlib_decompress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +unsigned lodepng_custom_zlib_compress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); +unsigned lodepng_custom_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +unsigned lodepng_custom_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code)\ +{\ + errorvar = code;\ + break;\ +} + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code)\ +{\ + errorvar = code;\ + return code;\ +} + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call)\ +{\ + unsigned error = call;\ + if(error) return error;\ +} + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*dynamic vector of unsigned ints*/ +typedef struct uivector +{ + unsigned* data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void* p) +{ + ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; + myfree(((uivector*)p)->data); + ((uivector*)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector* p, size_t size) +{ + if(size * sizeof(unsigned) > p->allocsize) + { + size_t newsize = size * sizeof(unsigned) * 2; + void* data = myrealloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned*)data; + p->size = size; + } + else return 0; + } + else p->size = size; + return 1; +} + +/*resize and give all new elements the value*/ +static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) +{ + size_t oldsize = p->size, i; + if(!uivector_resize(p, size)) return 0; + for(i = oldsize; i < size; i++) p->data[i] = value; + return 1; +} + +static void uivector_init(uivector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector* p, unsigned c) +{ + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} + +/*copy q to p, returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_copy(uivector* p, const uivector* q) +{ + size_t i; + if(!uivector_resize(p, q->size)) return 0; + for(i = 0; i < q->size; i++) p->data[i] = q->data[i]; + return 1; +} + +static void uivector_swap(uivector* p, uivector* q) +{ + size_t tmp; + unsigned* tmpp; + tmp = p->size; p->size = q->size; q->size = tmp; + tmp = p->allocsize; p->allocsize = q->allocsize; q->allocsize = tmp; + tmpp = p->data; p->data = q->data; q->data = tmpp; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector +{ + unsigned char* data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +static void ucvector_cleanup(void* p) +{ + ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; + myfree(((ucvector*)p)->data); + ((ucvector*)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector* p, size_t size) +{ + if(size * sizeof(unsigned char) > p->allocsize) + { + size_t newsize = size * sizeof(unsigned char) * 2; + void* data = myrealloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned char*)data; + p->size = size; + } + else return 0; /*error: not enough memory*/ + } + else p->size = size; + return 1; +} + +#ifdef LODEPNG_COMPILE_DECODER +#ifdef LODEPNG_COMPILE_PNG +/*resize and give all new elements the value*/ +static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value) +{ + size_t oldsize = p->size, i; + if(!ucvector_resize(p, size)) return 0; + for(i = oldsize; i < size; i++) p->data[i] = value; + return 1; +} +#endif /*LODEPNG_COMPILE_PNG*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + +static void ucvector_init(ucvector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +#ifdef LODEPNG_COMPILE_ZLIB +/*you can both convert from vector to buffer&size and vica versa. If you use +init_buffer to take over a buffer and size, it is not needed to use cleanup*/ +static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) +{ + p->data = buffer; + p->allocsize = p->size = size; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_push_back(ucvector* p, unsigned char c) +{ + if(!ucvector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned string_resize(char** out, size_t size) +{ + char* data = (char*)myrealloc(*out, size + 1); + if(data) + { + data[size] = 0; /*null termination char*/ + *out = data; + } + return data != 0; +} + +/*init a {char*, size_t} pair for use as string*/ +static void string_init(char** out) +{ + *out = NULL; + string_resize(out, 0); +} + +/*free the above pair again*/ +static void string_cleanup(char** out) +{ + myfree(*out); + *out = NULL; +} + +static void string_set(char** out, const char* in) +{ + size_t insize = strlen(in), i = 0; + if(string_resize(out, insize)) + { + for(i = 0; i < insize; i++) + { + (*out)[i] = in[i]; + } + } +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_read32bitInt(const unsigned char* buffer) +{ + return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; +} + +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) +{ + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value ) & 0xff); +} + +#ifdef LODEPNG_COMPILE_ENCODER +static void lodepng_add32bitInt(ucvector* buffer, unsigned value) +{ + ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ + lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) +{ + FILE* file; + long size; + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + + file = fopen(filename, "rb"); + if(!file) return 78; + + /*get filesize:*/ + fseek(file , 0 , SEEK_END); + size = ftell(file); + rewind(file); + + /*read contents of the file into the vector*/ + *outsize = 0; + *out = (unsigned char*)mymalloc((size_t)size); + if(size && (*out)) (*outsize) = fread(*out, 1, (size_t)size, file); + + fclose(file); + if(!(*out) && size) return 83; /*the above malloc failed*/ + return 0; +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) +{ + FILE* file; + file = fopen(filename, "wb" ); + if(!file) return 79; + fwrite((char*)buffer , 1 , buffersize, file); + fclose(file); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*TODO: this ignores potential out of memory errors*/ +static void addBitToStream(size_t* bitpointer, ucvector* bitstream, unsigned char bit) +{ + /*add a new byte at the end*/ + if((*bitpointer) % 8 == 0) ucvector_push_back(bitstream, (unsigned char)0); + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ + (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7)); + (*bitpointer)++; +} + +static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); +} + +static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) + +static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); + (*bitpointer)++; + return result; +} + +static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0, i; + for(i = 0; i < nbits; i++) + { + result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; + (*bitpointer)++; + } + return result; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258}; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +/*the order in which "code length alphabet code lengths" are stored, out of this +the huffman tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree +{ + unsigned* tree2d; + unsigned* tree1d; + unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ +} HuffmanTree; + +/*function used for debug purposes to draw the tree in ascii art with C++*/ +/*#include +static void HuffmanTree_draw(HuffmanTree* tree) +{ + std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; + for(size_t i = 0; i < tree->tree1d.size; i++) + { + if(tree->lengths.data[i]) + std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; + } + std::cout << std::endl; +}*/ + +static void HuffmanTree_init(HuffmanTree* tree) +{ + tree->tree2d = 0; + tree->tree1d = 0; + tree->lengths = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree* tree) +{ + myfree(tree->tree2d); + myfree(tree->tree1d); + myfree(tree->lengths); +} + +/*the tree representation used by the decoder. return value is error*/ +static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) +{ + unsigned nodefilled = 0; /*up to which node it is filled*/ + unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ + unsigned n, i; + + tree->tree2d = (unsigned*)mymalloc(tree->numcodes * 2 * sizeof(unsigned)); + if(!tree->tree2d) return 83; /*alloc fail*/ + + /* + convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means + uninited, a value >= numcodes is an address to another bit, a value < numcodes + is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as + many columns as codes - 1. + A good huffmann tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + Here, the internal nodes are stored (what their 0 and 1 option point to). + There is only memory for such good tree currently, if there are more nodes + (due to too long length codes), error 55 will happen + */ + for(n = 0; n < tree->numcodes * 2; n++) + { + tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ + } + + for(n = 0; n < tree->numcodes; n++) /*the codes*/ + { + for(i = 0; i < tree->lengths[n]; i++) /*the bits for this code*/ + { + unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); + if(treepos > tree->numcodes - 2) return 55; /*oversubscribed, see comment in lodepng_error_text*/ + if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ + { + if(i + 1 == tree->lengths[n]) /*last bit*/ + { + tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ + treepos = 0; + } + else + { + /*put address of the next step in here, first that address has to be found of course + (it's just nodefilled + 1)...*/ + nodefilled++; + /*addresses encoded with numcodes added to it*/ + tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; + treepos = nodefilled; + } + } + else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; + } + } + + for(n = 0; n < tree->numcodes * 2; n++) + { + if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) +{ + uivector blcount; + uivector nextcode; + unsigned bits, n, error = 0; + + uivector_init(&blcount); + uivector_init(&nextcode); + + tree->tree1d = (unsigned*)mymalloc(tree->numcodes * sizeof(unsigned)); + if(!tree->tree1d) error = 83; /*alloc fail*/ + + if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) + || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) + error = 83; /*alloc fail*/ + + if(!error) + { + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; bits++) + { + nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; + } + /*step 3: generate all the codes*/ + for(n = 0; n < tree->numcodes; n++) + { + if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; + } + } + + uivector_cleanup(&blcount); + uivector_cleanup(&nextcode); + + if(!error) return HuffmanTree_make2DTree(tree); + else return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i; + tree->lengths = (unsigned*)mymalloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i < numcodes; i++) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/* +A coin, this is the terminology used for the package-merge algorithm and the +coin collector's problem. This is used to generate the huffman tree. +A coin can be multiple coins (when they're merged) +*/ +typedef struct Coin +{ + uivector symbols; + float weight; /*the sum of all weights in this coin*/ +} Coin; + +static void coin_init(Coin* c) +{ + uivector_init(&c->symbols); +} + +/*argument c is void* so that this dtor can be given as function pointer to the vector resize function*/ +static void coin_cleanup(void* c) +{ + uivector_cleanup(&((Coin*)c)->symbols); +} + +static void coin_copy(Coin* c1, const Coin* c2) +{ + c1->weight = c2->weight; + uivector_copy(&c1->symbols, &c2->symbols); +} + +static void add_coins(Coin* c1, const Coin* c2) +{ + size_t i; + for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]); + c1->weight += c2->weight; +} + +static void init_coins(Coin* coins, size_t num) +{ + size_t i; + for(i = 0; i < num; i++) coin_init(&coins[i]); +} + +static void cleanup_coins(Coin* coins, size_t num) +{ + size_t i; + for(i = 0; i < num; i++) coin_cleanup(&coins[i]); +} + +/* +This uses a simple combsort to sort the data. This function is not critical for +overall encoding speed and the data amount isn't that large. +*/ +static void sort_coins(Coin* data, size_t amount) +{ + size_t gap = amount; + unsigned char swapped = 0; + while((gap > 1) || swapped) + { + size_t i; + gap = (gap * 10) / 13; /*shrink factor 1.3*/ + if(gap == 9 || gap == 10) gap = 11; /*combsort11*/ + if(gap < 1) gap = 1; + swapped = 0; + for(i = 0; i < amount - gap; i++) + { + size_t j = i + gap; + if(data[j].weight < data[i].weight) + { + float temp = data[j].weight; data[j].weight = data[i].weight; data[i].weight = temp; + uivector_swap(&data[i].symbols, &data[j].symbols); + swapped = 1; + } + } + } +} + +static unsigned append_symbol_coins(Coin* coins, const unsigned* frequencies, unsigned numcodes, size_t sum) +{ + unsigned i; + unsigned j = 0; /*index of present symbols*/ + for(i = 0; i < numcodes; i++) + { + if(frequencies[i] != 0) /*only include symbols that are present*/ + { + coins[j].weight = frequencies[i] / (float)sum; + uivector_push_back(&coins[j].symbols, i); + j++; + } + } + return 0; +} + +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i, j; + size_t sum = 0, numpresent = 0; + unsigned error = 0; + Coin* coins; /*the coins of the currently calculated row*/ + Coin* prev_row; /*the previous row of coins*/ + unsigned numcoins; + unsigned coinmem; + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + + for(i = 0; i < numcodes; i++) + { + if(frequencies[i] > 0) + { + numpresent++; + sum += frequencies[i]; + } + } + + for(i = 0; i < numcodes; i++) lengths[i] = 0; + + /*there are no symbols at all, in that case add one symbol of value 0 to the tree (see RFC 1951 section 3.2.7) */ + if(numpresent == 0) + { + lengths[0] = 1; + } + /*the package merge algorithm gives wrong results if there's only one symbol + (theoretically 0 bits would then suffice, but we need a proper symbol for zlib)*/ + else if(numpresent == 1) + { + for(i = 0; i < numcodes; i++) if(frequencies[i]) lengths[i] = 1; + } + else + { + /*Package-Merge algorithm represented by coin collector's problem + For every symbol, maxbitlen coins will be created*/ + + coinmem = numpresent * 2; /*max amount of coins needed with the current algo*/ + coins = (Coin*)mymalloc(sizeof(Coin) * coinmem); + prev_row = (Coin*)mymalloc(sizeof(Coin) * coinmem); + if(!coins || !prev_row) return 83; /*alloc fail*/ + init_coins(coins, coinmem); + init_coins(prev_row, coinmem); + + /*first row, lowest denominator*/ + error = append_symbol_coins(coins, frequencies, numcodes, sum); + numcoins = numpresent; + sort_coins(coins, numcoins); + if(!error) + { + unsigned numprev = 0; + for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/ + { + unsigned tempnum; + Coin* tempcoins; + /*swap prev_row and coins, and their amounts*/ + tempcoins = prev_row; prev_row = coins; coins = tempcoins; + tempnum = numprev; numprev = numcoins; numcoins = tempnum; + + cleanup_coins(coins, numcoins); + init_coins(coins, numcoins); + + numcoins = 0; + + /*fill in the merged coins of the previous row*/ + for(i = 0; i + 1 < numprev; i += 2) + { + /*merge prev_row[i] and prev_row[i + 1] into new coin*/ + Coin* coin = &coins[numcoins++]; + coin_copy(coin, &prev_row[i]); + add_coins(coin, &prev_row[i + 1]); + } + /*fill in all the original symbols again*/ + if(j < maxbitlen) + { + error = append_symbol_coins(coins + numcoins, frequencies, numcodes, sum); + numcoins += numpresent; + } + sort_coins(coins, numcoins); + } + } + + if(!error) + { + /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/ + for(i = 0; i < numpresent - 1; i++) + { + Coin* coin = &coins[i]; + for(j = 0; j < coin->symbols.size; j++) lengths[coin->symbols.data[j]]++; + } + } + + cleanup_coins(coins, coinmem); + myfree(coins); + cleanup_coins(prev_row, coinmem); + myfree(prev_row); + } + + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->lengths = (unsigned*)myrealloc(tree->lengths, numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + /*initialize all lengths to 0*/ + memset(tree->lengths, 0, numcodes * sizeof(unsigned)); + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} + +static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) +{ + return tree->tree1d[index]; +} + +static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) +{ + return tree->lengths[index]; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)mymalloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; i++) bitlen[i] = 8; + for(i = 144; i <= 255; i++) bitlen[i] = 9; + for(i = 256; i <= 279; i++) bitlen[i] = 7; + for(i = 280; i <= 287; i++) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + myfree(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)mymalloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + myfree(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code, or (unsigned)(-1) if error happened +inbitlength is the length of the complete buffer, in bits (so its byte length times 8) +*/ +static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, + const HuffmanTree* codetree, size_t inbitlength) +{ + unsigned treepos = 0, ct; + for(;;) + { + if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ + /* + decode the symbol from the tree. The "readBitFromStream" code is inlined in + the expression below because this is the biggest bottleneck while decoding + */ + ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; + (*bp)++; + if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ + else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ + + if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) +{ + /*TODO: check for out of memory errors*/ + generateFixedLitLenTree(tree_ll); + generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, + const unsigned char* in, size_t* bp, size_t inlength) +{ + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + size_t inbitlength = inlength * 8; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned* bitlen_ll = 0; /*lit,len code lengths*/ + unsigned* bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned* bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if((*bp) >> 3 >= inlength - 2) return 49; /*error: the bit pointer is or will go past the memory*/ + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBitsFromStream(bp, in, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBitsFromStream(bp, in, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBitsFromStream(bp, in, 4) + 4; + + HuffmanTree_init(&tree_cl); + + while(!error) + { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + + bitlen_cl = (unsigned*)mymalloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); + + for(i = 0; i < NUM_CODE_LENGTH_CODES; i++) + { + if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); + else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned*)mymalloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned*)mymalloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i < NUM_DEFLATE_CODE_SYMBOLS; i++) bitlen_ll[i] = 0; + for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen_d[i] = 0; + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) + { + unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); + if(code <= 15) /*a length code*/ + { + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + i++; + } + else if(code == 16) /*repeat previous*/ + { + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + if (i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + replength += readBitsFromStream(bp, in, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; n++) + { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + i++; + } + } + else if(code == 17) /*repeat "0" 3-10 times*/ + { + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + + replength += readBitsFromStream(bp, in, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; n++) + { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + i++; + } + } + else if(code == 18) /*repeat "0" 11-138 times*/ + { + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + + replength += readBitsFromStream(bp, in, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; n++) + { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + i++; + } + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + if(code == (unsigned)(-1)) + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inbitlength ? 10 : 11; + } + else error = 16; /*unexisting code, this can never happen*/ + break; + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + myfree(bitlen_cl); + myfree(bitlen_ll); + myfree(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree*/ +static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, + size_t* pos, size_t inlength, unsigned btype) +{ + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + size_t inbitlength = inlength * 8; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); + else if(btype == 2) + { + error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); + } + + while(!error) /*decode all symbols until end reached, breaks at end code*/ + { + /*code_ll is literal, length or end code*/ + unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); + if(code_ll <= 255) /*literal symbol*/ + { + if((*pos) >= out->size) + { + /*reserve more room at once*/ + if(!ucvector_resize(out, ((*pos) + 1) * 2)) ERROR_BREAK(83 /*alloc fail*/); + } + out->data[(*pos)] = (unsigned char)(code_ll); + (*pos)++; + } + else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ + { + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, forward, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + length += readBitsFromStream(bp, in, numextrabits_l); + + /*part 3: get distance code*/ + code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); + if(code_d > 29) + { + if(code_ll == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inlength * 8 ? 10 : 11; + } + else error = 18; /*error: invalid distance code (30-31 are never used)*/ + break; + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + + distance += readBitsFromStream(bp, in, numextrabits_d); + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = (*pos); + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + if((*pos) + length >= out->size) + { + /*reserve more room at once*/ + if(!ucvector_resize(out, ((*pos) + length) * 2)) ERROR_BREAK(83 /*alloc fail*/); + } + + for(forward = 0; forward < length; forward++) + { + out->data[(*pos)] = out->data[backward]; + (*pos)++; + backward++; + if(backward >= start) backward = start - distance; + } + } + else if(code_ll == 256) + { + break; /*end code, break the loop*/ + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inlength * 8 ? 10 : 11; + break; + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) +{ + /*go to first boundary of byte*/ + size_t p; + unsigned LEN, NLEN, n, error = 0; + while(((*bp) & 0x7) != 0) (*bp)++; + p = (*bp) / 8; /*byte position*/ + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/ + LEN = in[p] + 256 * in[p + 1]; p += 2; + NLEN = in[p] + 256 * in[p + 1]; p += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ + + if((*pos) + LEN >= out->size) + { + if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ + } + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ + for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++]; + + (*bp) = p * 8; + + return error; +} + +static unsigned lodepng_inflatev(ucvector* out, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ + size_t bp = 0; + unsigned BFINAL = 0; + size_t pos = 0; /*byte position in the out buffer*/ + + unsigned error = 0; + + (void)settings; + + while(!BFINAL) + { + unsigned BTYPE; + if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ + BFINAL = readBitFromStream(&bp, in); + BTYPE = 1 * readBitFromStream(&bp, in); + BTYPE += 2 * readBitFromStream(&bp, in); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ + else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ + + if(error) return error; + } + + /*Only now we know the true size of out, resize it to that*/ + if(!ucvector_resize(out, pos)) error = 83; /*alloc fail*/ + + return error; +} + +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ +#if LODEPNG_CUSTOM_ZLIB_DECODER == 2 + if(settings->custom_decoder) + { + return lodepng_custom_inflate(out, outsize, in, insize, settings); + } + else + { +#endif /*LODEPNG_CUSTOM_ZLIB_DECODER == 2*/ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +#if LODEPNG_CUSTOM_ZLIB_DECODER == 2 + } +#endif /*LODEPNG_CUSTOM_ZLIB_DECODER == 2*/ +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*bitlen is the size in bits of the code*/ +static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) +{ + addBitsToStreamReversed(bp, compressed, code, bitlen); +} + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) +{ + /*linear search implementation*/ + /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1; + return array_size - 1;*/ + + /*binary search implementation (not that much faster) (precondition: array_size > 0)*/ + size_t left = 1; + size_t right = array_size - 1; + while(left <= right) + { + size_t mid = (left + right) / 2; + if(array[mid] <= value) left = mid + 1; /*the value to find is more to the right*/ + else if(array[mid - 1] > value) right = mid - 1; /*the value to find is more to the left*/ + else return mid - 1; + } + return array_size - 1; +} + +static void addLengthDistance(uivector* values, size_t length, size_t distance) +{ + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); + uivector_push_back(values, extra_length); + uivector_push_back(values, dist_code); + uivector_push_back(values, extra_distance); +} + +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_NUM_CHARACTERS = 3; +static const unsigned HASH_SHIFT = 2; +/* +The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer +sequences to generate a hash value from the stream bytes. Setting it to 3 +gives exactly the same compression as the brute force method, since deflate's +run length encoding starts with lengths of 3. Setting it to higher values, +like 6, can make the encoding faster (not always though!), but will cause the +encoding to miss any length between 3 and this value, so that the compression +may be worse (but this can vary too depending on the image, sometimes it is +even a bit better instead). +The HASH_NUM_VALUES is the amount of unique possible hash values that +combinations of bytes can give, the higher it is the more memory is needed, but +if it's too low the advantage of hashing is gone. +*/ + +typedef struct Hash +{ + int* head; /*hash value to head circular pos*/ + int* val; /*circular pos to hash value*/ + /*circular pos to prev circular pos*/ + unsigned short* chain; + unsigned short* zeros; +} Hash; + +static unsigned hash_init(Hash* hash, unsigned windowsize) +{ + unsigned i; + hash->head = (int*)mymalloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int*)mymalloc(sizeof(int) * windowsize); + hash->chain = (unsigned short*)mymalloc(sizeof(unsigned short) * windowsize); + hash->zeros = (unsigned short*)mymalloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->val || !hash->chain || !hash->zeros) return 83; /*alloc fail*/ + + /*initialize hash table*/ + for(i = 0; i < HASH_NUM_VALUES; i++) hash->head[i] = -1; + for(i = 0; i < windowsize; i++) hash->val[i] = -1; + for(i = 0; i < windowsize; i++) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash* hash) +{ + myfree(hash->head); + myfree(hash->val); + myfree(hash->chain); + myfree(hash->zeros); +} + +static unsigned getHash(const unsigned char* data, size_t size, size_t pos) +{ + unsigned result = 0; + size_t amount, i; + if(pos >= size) return 0; + amount = HASH_NUM_CHARACTERS; + if(pos + amount >= size) amount = size - pos; + for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT)); + return result % HASH_NUM_VALUES; +} + +static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) +{ + const unsigned char* start = data + pos; + const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while (data != end && *data == 0) data++; + return data - start; +} + +static void updateHashChain(Hash* hash, + size_t pos, int hashval, unsigned windowsize) +{ + unsigned wpos = pos % windowsize; + hash->val[wpos] = hashval; + if(hash->head[hashval] != -1) + { + hash->chain[wpos] = hash->head[hashval]; + } + hash->head[hashval] = wpos; +} + +/*Enable to use lazy instead of greedy matching. It looks one byte further +to see if that one gives a longer distance. This gives slightly better compression, at the cost +of a speed loss.*/ +#define LAZY_MATCHING + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector* out, Hash* hash, + const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize) +{ + unsigned short numzeros = 0; + int usezeros = windowsize >= 8192; /*for small window size, the 'max chain length' optimization does a better job*/ + unsigned pos, i, error = 0; + + if(!error) + { + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; +#ifdef LAZY_MATCHING + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; +#endif /*LAZY_MATCHING*/ + unsigned hashval; + unsigned current_offset, current_length; + const unsigned char *lastptr, *foreptr, *backptr; + unsigned short hashpos, prevpos; + + for(pos = inpos; pos < insize; pos++) + { + size_t wpos = pos % windowsize; /*position for in 'circular' hash buffers*/ + + hashval = getHash(in, insize, pos); + updateHashChain(hash, pos, hashval, windowsize); + + if(usezeros && hashval == 0) + { + numzeros = countZeros(in, insize, pos); + hash->zeros[wpos] = numzeros; + } + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + prevpos = hash->head[hashval]; + hashpos = hash->chain[prevpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + if(hash->val[wpos] == (int)hashval) + { + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; + for(;;) + { + /*stop when went completely around the circular buffer*/ + if(prevpos < wpos && hashpos > prevpos && hashpos <= wpos) break; + if(prevpos > wpos && (hashpos <= wpos || hashpos > prevpos)) break; + if(maxchainlength-- == 0) break; + + current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize; + if(current_offset > 0) + { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(usezeros && hashval == 0 && hash->val[hashpos] == 0 /*hashval[hashpos] may be out of date*/) + { + unsigned short skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + /* multiple checks at once per array bounds check */ + while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ + { + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) + { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain)*/ + if(current_length == MAX_SUPPORTED_DEFLATE_LENGTH) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + prevpos = hashpos; + hashpos = hash->chain[hashpos]; + } + } + +#ifdef LAZY_MATCHING + if(!lazy && length >= 3 && length < MAX_SUPPORTED_DEFLATE_LENGTH) + { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; + } + if(lazy) + { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) + { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + pos--; + } + } +#endif /*LAZY_MATCHING*/ + + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + + /**encode it as length/distance pair or literal value**/ + if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ + { + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + if(length == 3 && offset > 2048) + { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos + 0])) ERROR_BREAK(83 /*alloc fail*/); + if(!uivector_push_back(out, in[pos + 1])) ERROR_BREAK(83 /*alloc fail*/); + if(!uivector_push_back(out, in[pos + 2])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + addLengthDistance(out, length, offset); + } + for(i = 1; i < length; i++) + { + pos++; + hashval = getHash(in, insize, pos); + updateHashChain(hash, pos, hashval, windowsize); + if(usezeros && hashval == 0) + { + hash->zeros[pos % windowsize] = countZeros(in, insize, pos); + } + } + } + + } /*end of the loop through each character of input*/ + } /*end of "if(!error)"*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) +{ + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; + unsigned datapos = 0; + for(i = 0; i < numdeflateblocks; i++) + { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); + ucvector_push_back(out, firstbyte); + + LEN = 65535; + if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + ucvector_push_back(out, (unsigned char)(LEN % 256)); + ucvector_push_back(out, (unsigned char)(LEN / 256)); + ucvector_push_back(out, (unsigned char)(NLEN % 256)); + ucvector_push_back(out, (unsigned char)(NLEN / 256)); + + /*Decompressed data*/ + for(j = 0; j < 65535 && datapos < datasize; j++) + { + ucvector_push_back(out, data[datapos++]); + } + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, + const HuffmanTree* tree_ll, const HuffmanTree* tree_d) +{ + size_t i = 0; + for(i = 0; i < lz77_encoded->size; i++) + { + unsigned val = lz77_encoded->data[i]; + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); + if(val > 256) /*for a length code, 3 more things have to be added*/ + { + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), + HuffmanTree_getLength(tree_d, distance_code)); + addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, int final) +{ + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lenghts used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + uivector frequencies_ll; /*frequency of lit,len codes*/ + uivector frequencies_d; /*frequency of dist codes*/ + uivector frequencies_cl; /*frequency of code length codes*/ + uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ + uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ + /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl + (these are written as is in the file, it would be crazy to compress these using yet another huffman + tree that needs to be represented by yet another set of code lengths)*/ + uivector bitlen_cl; + size_t datasize = dataend - datapos; + + /* + Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t numcodes_ll, numcodes_d, i; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + uivector_init(&frequencies_ll); + uivector_init(&frequencies_d); + uivector_init(&frequencies_cl); + uivector_init(&bitlen_lld); + uivector_init(&bitlen_lld_e); + uivector_init(&bitlen_cl); + + /*This while loop is never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) + { + if(settings->use_lz77) + { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize); /*LZ77 encoded*/ + if(error) break; + } + else + { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); + if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i < lz77_encoded.size; i++) + { + unsigned symbol = lz77_encoded.data[i]; + frequencies_ll.data[symbol]++; + if(symbol > 256) + { + unsigned dist = lz77_encoded.data[i + 2]; + frequencies_d.data[dist]++; + i += 3; + } + } + frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, frequencies_ll.size, 15); + if(error) break; + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, frequencies_d.size, 15); + if(error) break; + + numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; + numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; + /*store the code lengths of both generated trees in bitlen_lld*/ + for(i = 0; i < numcodes_ll; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); + for(i = 0; i < numcodes_d; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i < (unsigned)bitlen_lld.size; i++) + { + unsigned j = 0; /*amount of repititions*/ + while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) j++; + + if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ + { + j++; /*include the first zero*/ + if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ + { + uivector_push_back(&bitlen_lld_e, 17); + uivector_push_back(&bitlen_lld_e, j - 3); + } + else /*repeat code 18 supports max 138 zeroes*/ + { + if(j > 138) j = 138; + uivector_push_back(&bitlen_lld_e, 18); + uivector_push_back(&bitlen_lld_e, j - 11); + } + i += (j - 1); + } + else if(j >= 3) /*repeat code for value other than zero*/ + { + size_t k; + unsigned num = j / 6, rest = j % 6; + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + for(k = 0; k < num; k++) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, 6 - 3); + } + if(rest >= 3) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, rest - 3); + } + else j -= rest; + i += j; + } + else /*too short to benefit from repeat code*/ + { + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + + if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i < bitlen_lld_e.size; i++) + { + frequencies_cl.data[bitlen_lld_e.data[i]]++; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e.data[i] >= 16) i++; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, frequencies_cl.size, 7); + if(error) break; + + if(!uivector_resize(&bitlen_cl, NUM_CODE_LENGTH_CODES)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i < NUM_CODE_LENGTH_CODES; i++) + { + /*lenghts of code length tree is in the order as specified by deflate*/ + bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); + } + while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) + { + /*remove zeros at the end, but minimum size must be 4*/ + if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); + } + if(error) break; + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ + addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)bitlen_cl.size - 4; + addBitsToStream(bp, out, HLIT, 5); + addBitsToStream(bp, out, HDIST, 5); + addBitsToStream(bp, out, HCLEN, 4); + + /*write the code lenghts of the code length alphabet*/ + for(i = 0; i < HCLEN + 4; i++) addBitsToStream(bp, out, bitlen_cl.data[i], 3); + + /*write the lenghts of the lit/len AND the dist alphabet*/ + for(i = 0; i < bitlen_lld_e.size; i++) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), + HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); + /*extra bits of repeat codes*/ + if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); + else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); + else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); + + /*write the end code*/ + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + uivector_cleanup(&frequencies_ll); + uivector_cleanup(&frequencies_d); + uivector_cleanup(&frequencies_cl); + uivector_cleanup(&bitlen_lld_e); + uivector_cleanup(&bitlen_lld); + uivector_cleanup(&bitlen_cl); + + return error; +} + +static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, int final) +{ + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + generateFixedLitLenTree(&tree_ll); + generateFixedDistanceTree(&tree_d); + + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 1); /*first bit of BTYPE*/ + addBitToStream(bp, out, 0); /*second bit of BTYPE*/ + + if(settings->use_lz77) /*LZ77 encoded*/ + { + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize); + if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } + else /*no LZ77, but still will be Huffman compressed*/ + { + for(i = datapos; i < dataend; i++) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); + } + } + /*add END code*/ + if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ +#if LODEPNG_CUSTOM_ZLIB_ENCODER == 2 + if(settings->custom_encoder) + { + unsigned char** out2 = &out->data; + size_t* outsize = &out->size; + + unsigned error = lodepng_custom_deflate(out2, outsize, in, insize, settings); + + if(!error) ucvector_init_buffer(out, *out2, *outsize); + return error; + } + else + { +#endif /*LODEPNG_CUSTOM_ZLIB_ENCODER == 2*/ + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + size_t bp = 0; /*the bit pointer*/ + Hash hash; + + if(settings->btype > 2) return 61; + + if(settings->btype == 0) return deflateNoCompression(out, in, insize); + + if(settings->btype == 1) blocksize = insize; + else /*if(settings->btype == 2)*/ + { + blocksize = insize / 8 + 8; + if(blocksize < 65535) blocksize = 65535; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + if(error) return error; + + for(i = 0; i < numdeflateblocks && !error; i++) + { + int final = i == numdeflateblocks - 1; + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); + } + + hash_cleanup(&hash); + + return error; +#if LODEPNG_CUSTOM_ZLIB_ENCODER == 2 + } +#endif /*LODEPNG_CUSTOM_ZLIB_ENCODER == 2*/ +} + +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) +{ + unsigned s1 = adler & 0xffff; + unsigned s2 = (adler >> 16) & 0xffff; + + while(len > 0) + { + /*at least 5550 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5550 ? 5550 : len; + len -= amount; + while(amount > 0) + { + s1 = (s1 + *data++); + s2 = (s2 + s1); + amount--; + } + s1 %= 65521; + s2 %= 65521; + } + + return (s2 << 16) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char* data, unsigned len) +{ + return update_adler32(1L, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ +#if LODEPNG_CUSTOM_ZLIB_DECODER == 1 + if(settings->custom_decoder) + { + return lodepng_custom_zlib_decompress(out, outsize, in, insize, settings); + } + else + { +#endif /*LODEPNG_CUSTOM_ZLIB_DECODER == 1*/ + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) + { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) + { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) + { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = lodepng_inflate(out, outsize, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) + { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(*out, (unsigned)(*outsize)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +#if LODEPNG_CUSTOM_ZLIB_DECODER == 1 + } +#endif /*LODEPNG_CUSTOM_ZLIB_DECODER == 1*/ +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ +#if LODEPNG_CUSTOM_ZLIB_ENCODER == 1 + if(settings->custom_encoder) + { + return lodepng_custom_zlib_compress(out, outsize, in, insize, settings); + } + else + { +#endif /*LODEPNG_CUSTOM_ZLIB_ENCODER == 1*/ + /*initially, *out must be NULL and outsize 0, if you just give some random *out + that's pointing to a non allocated buffer, this'll crash*/ + ucvector deflatedata, outv; + size_t i; + unsigned error; + + unsigned ADLER32; + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + /*ucvector-controlled version of the output buffer, for dynamic array*/ + ucvector_init_buffer(&outv, *out, *outsize); + + ucvector_push_back(&outv, (unsigned char)(CMFFLG / 256)); + ucvector_push_back(&outv, (unsigned char)(CMFFLG % 256)); + + ucvector_init(&deflatedata); + error = lodepng_deflatev(&deflatedata, in, insize, settings); + + if(!error) + { + ADLER32 = adler32(in, (unsigned)insize); + for(i = 0; i < deflatedata.size; i++) ucvector_push_back(&outv, deflatedata.data[i]); + ucvector_cleanup(&deflatedata); + lodepng_add32bitInt(&outv, ADLER32); + } + + *out = outv.data; + *outsize = outv.size; + + return error; +#if LODEPNG_CUSTOM_ZLIB_ENCODER == 1 + } +#endif /*LODEPNG_CUSTOM_ZLIB_ENCODER == 1*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + return lodepng_custom_zlib_decompress(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + return lodepng_custom_zlib_compress(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings* settings) +{ + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; +#if LODEPNG_CUSTOM_ZLIB_ENCODER == 0 + settings->custom_encoder = 0; +#else + settings->custom_encoder = 1; +#endif +} + +#if LODEPNG_CUSTOM_ZLIB_ENCODER == 0 +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 0}; +#else +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 1}; +#endif + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) +{ + settings->ignore_adler32 = 0; +#if LODEPNG_CUSTOM_ZLIB_DECODER == 0 + settings->custom_decoder = 0; +#else + settings->custom_decoder = 1; +#endif +} + +#if LODEPNG_CUSTOM_ZLIB_DECODER == 0 +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0}; +#else +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 1}; +#endif + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned Crc32_crc_table_computed = 0; +static unsigned Crc32_crc_table[256]; + +/*Make the table for a fast CRC.*/ +static void Crc32_make_crc_table(void) +{ + unsigned c, k, n; + for(n = 0; n < 256; n++) + { + c = n; + for(k = 0; k < 8; k++) + { + if(c & 1) c = 0xedb88320L ^ (c >> 1); + else c = c >> 1; + } + Crc32_crc_table[n] = c; + } + Crc32_crc_table_computed = 1; +} + +/*Update a running CRC with the bytes buf[0..len-1]--the CRC should be +initialized to all 1's, and the transmitted value is the 1's complement of the +final running CRC (see the crc() routine below).*/ +static unsigned Crc32_update_crc(const unsigned char* buf, unsigned crc, size_t len) +{ + unsigned c = crc; + size_t n; + + if(!Crc32_crc_table_computed) Crc32_make_crc_table(); + for(n = 0; n < len; n++) + { + c = Crc32_crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c; +} + +/*Return the CRC of the bytes buf[0..len-1].*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len) +{ + return Crc32_update_crc(buf, 0xffffffffL, len) ^ 0xffffffffL; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing single bits and bytes from/to stream for LodePNG / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + (*bitpointer)++; + return result; +} + +static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0; + size_t i; + for(i = nbits - 1; i < nbits; i--) + { + result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i; + } + return result; +} + +#ifdef LODEPNG_COMPILE_DECODER +static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream must be 0 for this to work*/ + if(bit) + { + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ + bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); + } + (*bitpointer)++; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); + else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); + (*bitpointer)++; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char* chunk) +{ + return lodepng_read32bitInt(&chunk[0]); +} + +void lodepng_chunk_type(char type[5], const unsigned char* chunk) +{ + unsigned i; + for(i = 0; i < 4; i++) type[i] = chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) +{ + if(strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) +{ + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char* chunk) +{ + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) +{ + return((chunk[7] & 32) != 0); +} + +unsigned char* lodepng_chunk_data(unsigned char* chunk) +{ + return &chunk[8]; +} + +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) +{ + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char* lodepng_chunk_next(unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) +{ + unsigned i; + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + unsigned char *chunk_start, *new_buffer; + size_t new_length = (*outlength) + total_chunk_length; + if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ + + new_buffer = (unsigned char*)myrealloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i]; + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data) +{ + unsigned i; + unsigned char *chunk, *new_buffer; + size_t new_length = (*outlength) + length + 12; + if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ + new_buffer = (unsigned char*)myrealloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk = &(*out)[(*outlength) - length - 12]; + + /*1: length*/ + lodepng_set32bitInt(chunk, (unsigned)length); + + /*2: chunk name (4 letters)*/ + chunk[4] = type[0]; + chunk[5] = type[1]; + chunk[6] = type[2]; + chunk[7] = type[3]; + + /*3: the data*/ + for(i = 0; i < length; i++) chunk[8 + i] = data[i]; + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types and such / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*return type is a LodePNG error code*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ +{ + switch(colortype) + { + case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ + case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ + case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ + case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ + case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ + default: return 31; + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) +{ + switch(colortype) + { + case 0: return 1; /*grey*/ + case 2: return 3; /*RGB*/ + case 3: return 1; /*palette*/ + case 4: return 2; /*grey + alpha*/ + case 6: return 4; /*RGBA*/ + } + return 0; /*unexisting color type*/ +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) +{ + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode* info) +{ + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +void lodepng_color_mode_cleanup(LodePNGColorMode* info) +{ + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) +{ + size_t i; + lodepng_color_mode_cleanup(dest); + *dest = *source; + if(source->palette) + { + dest->palette = (unsigned char*)mymalloc(source->palettesize * 4); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i]; + } + return 0; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) +{ + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) + { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i < a->palettesize * 4; i++) + { + if(a->palette[i] != b->palette[i]) return 0; + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode* info) +{ + if(info->palette) myfree(info->palette); + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + unsigned char* data; + /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with + the max of 256 colors, it'll have the exact alloc size*/ + if(!(info->palettesize & (info->palettesize - 1))) /*if palettesize is 0 or a power of two*/ + { + /*allocated data must be at least 4* palettesize (for 4 color bytes)*/ + size_t alloc_size = info->palettesize == 0 ? 4 : info->palettesize * 4 * 2; + data = (unsigned char*)myrealloc(info->palette, alloc_size); + if(!data) return 83; /*alloc fail*/ + else info->palette = data; + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + info->palettesize++; + return 0; +} + +unsigned lodepng_get_bpp(const LodePNGColorMode* info) +{ + /*calculate bits per pixel out of colortype and bitdepth*/ + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode* info) +{ + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) +{ + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) +{ + size_t i; + for(i = 0; i < info->palettesize; i++) + { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) +{ + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + return (w * h * lodepng_get_bpp(color) + 7) / 8; +} + +size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + return (w * h * lodepng_get_bpp_lct(colortype, bitdepth) + 7) / 8; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i < 3; i++) info->unknown_chunks_data[i] = 0; + for(i = 0; i < 3; i++) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i < 3; i++) myfree(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) +{ + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i < 3; i++) + { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char*)mymalloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; j++) + { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo* info) +{ + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i < info->text_num; i++) + { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + myfree(info->text_keys); + myfree(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->text_keys = 0; + dest->text_strings = 0; + dest->text_num = 0; + for(i = 0; i < source->text_num; i++) + { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +void lodepng_clear_text(LodePNGInfo* info) +{ + LodePNGText_cleanup(info); +} + +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) +{ + char** new_keys = (char**)(myrealloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); + char** new_strings = (char**)(myrealloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); + if(!new_keys || !new_strings) + { + myfree(new_keys); + myfree(new_strings); + return 83; /*alloc fail*/ + } + + info->text_num++; + info->text_keys = new_keys; + info->text_strings = new_strings; + + string_init(&info->text_keys[info->text_num - 1]); + string_set(&info->text_keys[info->text_num - 1], key); + + string_init(&info->text_strings[info->text_num - 1]); + string_set(&info->text_strings[info->text_num - 1], str); + + return 0; +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo* info) +{ + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i < info->itext_num; i++) + { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + myfree(info->itext_keys); + myfree(info->itext_langtags); + myfree(info->itext_transkeys); + myfree(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->itext_keys = 0; + dest->itext_langtags = 0; + dest->itext_transkeys = 0; + dest->itext_strings = 0; + dest->itext_num = 0; + for(i = 0; i < source->itext_num; i++) + { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo* info) +{ + LodePNGIText_cleanup(info); +} + +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str) +{ + char** new_keys = (char**)(myrealloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); + char** new_langtags = (char**)(myrealloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); + char** new_transkeys = (char**)(myrealloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); + char** new_strings = (char**)(myrealloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) + { + myfree(new_keys); + myfree(new_langtags); + myfree(new_transkeys); + myfree(new_strings); + return 83; /*alloc fail*/ + } + + info->itext_num++; + info->itext_keys = new_keys; + info->itext_langtags = new_langtags; + info->itext_transkeys = new_transkeys; + info->itext_strings = new_strings; + + string_init(&info->itext_keys[info->itext_num - 1]); + string_set(&info->itext_keys[info->itext_num - 1], key); + + string_init(&info->itext_langtags[info->itext_num - 1]); + string_set(&info->itext_langtags[info->itext_num - 1], langtag); + + string_init(&info->itext_transkeys[info->itext_num - 1]); + string_set(&info->itext_transkeys[info->itext_num - 1], transkey); + + string_init(&info->itext_strings[info->itext_num - 1]); + string_set(&info->itext_strings[info->itext_num - 1], str); + + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo* info) +{ + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo* info) +{ + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + lodepng_info_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b) +{ + LodePNGInfo temp = *a; + *a = *b; + *b = temp; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4, in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) +{ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = index % (8 / bits); + in &= (1 << bits) - 1; /*filter out any other bits of the input value*/ + in = in << (bits * (8 / bits - p - 1)); + if(p == 0) out[index * bits / 8] = in; + else out[index * bits / 8] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's a bit like an octree for RGB bits, except that a node has 256 +children and there is one level of the tree per color channel. This may use more memory +than an octree, but this is only used to count up to 256 so it's good enough. +*/ +struct ColorTree +{ + ColorTree* next; /*null, or array of 256 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the 4th level*/ +}; + +static void color_tree_make_next(ColorTree* tree); + +/*next: whether to create the next array or not*/ +static void color_tree_init(ColorTree* tree, int next) +{ + if(next) color_tree_make_next(tree); + else tree->next = 0; + tree->index = -1; +} + +static void color_tree_make_next(ColorTree* tree) +{ + int i; + tree->next = (ColorTree*)mymalloc(256 * sizeof(ColorTree)); + for(i = 0; i < 256; i++) color_tree_init(&tree->next[i], 0); +} + +static void color_tree_cleanup(ColorTree* tree) +{ + if(tree->next) + { + int i; + for(i = 0; i < 256; i++) color_tree_cleanup(&tree->next[i]); + myfree(tree->next); + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + tree = &tree->next[r]; + if(tree->next == 0) return -1; + tree = &tree->next[g]; + if(tree->next == 0) return -1; + tree = &tree->next[b]; + if(tree->next == 0) return -1; + tree = &tree->next[a]; + + return tree->index; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ +static void color_tree_add(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a, int index) +{ + tree = &tree->next[r]; + if(tree->next == 0) color_tree_make_next(tree); + tree = &tree->next[g]; + if(tree->next == 0) color_tree_make_next(tree); + tree = &tree->next[b]; + if(tree->next == 0) color_tree_make_next(tree); + tree = &tree->next[a]; + + tree->index = index; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(mode->colortype == LCT_GREY) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) out[i] = grey; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; + else + { + /*take the most significant bits of grey*/ + grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); + addColorBits(out, i, mode->bitdepth, grey); + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } + else + { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } + else if(mode->colortype == LCT_PALETTE) + { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, index); + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) + { + out[i * 2 + 0] = grey; + out[i * 2 + 1] = a; + } + else if(mode->bitdepth == 16) + { + out[i * 4 + 0] = out[i * 4 + 1] = grey; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } + else + { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static unsigned rgba16ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) +{ + if(mode->bitdepth != 16) return 85; /*must be 16 for this function*/ + if(mode->colortype == LCT_GREY) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 2 + 0] = (grey >> 8) & 255; + out[i * 2 + 1] = grey & 255; + } + else if(mode->colortype == LCT_RGB) + { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 4 + 0] = (grey >> 8) & 255; + out[i * 4 + 1] = grey & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } + else if(mode->colortype == LCT_RGBA) + { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } + + return 0; /*no error*/ +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) +{ + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } + else if(mode->bitdepth == 16) + { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } + else + { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else + { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + if(index >= mode->palettesize) return 47; /*index out of palette*/ + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } + else + { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + *r = in[i * 4 + 0]; *g = in[i * 4 + 1]; *b = in[i * 4 + 2]; *a = in[i * 4 + 3]; + } + else + { + *r = in[i * 8 + 0]; *g = in[i * 8 + 2]; *b = in[i * 8 + 4]; *a = in[i * 8 + 6]; + } + } + + return 0; /*no error*/ +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) +{ + if(mode->bitdepth != 16) return 85; /*error: this function only supports 16-bit input*/ + + if(mode->colortype == LCT_GREY) + { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_RGB) + { + *r = 256 * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256 * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256 * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + *r = *g = *b = 256 * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256 * in[i * 4 + 2] + in[i * 4 + 3]; + } + else if(mode->colortype == LCT_RGBA) + { + *r = 256 * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256 * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256 * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256 * in[i * 8 + 6] + in[i * 8 + 7]; + } + else return 85; /*error: this function only supports 16-bit input*/ + + return 0; /*no error*/ +} + +/* +converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code +the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type +(lodepng_get_bpp) for < 8 bpp images, there may _not_ be padding bits at the end of scanlines. +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + LodePNGColorMode* mode_out, LodePNGColorMode* mode_in, + unsigned w, unsigned h) +{ + unsigned error = 0; + size_t i; + ColorTree tree; + + if(lodepng_color_mode_equal(mode_out, mode_in)) + { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + for(i = 0; i < numbytes; i++) out[i] = in[i]; + return error; + } + + if(mode_out->colortype == LCT_PALETTE) + { + size_t palsize = 1 << mode_out->bitdepth; + if(mode_out->palettesize < palsize) palsize = mode_out->palettesize; + color_tree_init(&tree, 1); + for(i = 0; i < palsize; i++) + { + unsigned char* p = &mode_out->palette[i * 4]; + color_tree_add(&tree, p[0], p[1], p[2], p[3], i); + } + } + + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) + { + size_t numpixels = w * h; + for(i = 0; i < numpixels; i++) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if(error) return error; + error = rgba16ToPixel(out, i, mode_out, r, g, b, a); + if(error) return error; + } + } + else + { + size_t numpixels = w * h; + for(i = 0; i < numpixels; i++) + { + unsigned char r = 0, g = 0, b = 0, a = 0; + error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + if(error) return error; + error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); + if(error) return error; + } + } + + if(mode_out->colortype == LCT_PALETTE) + { + color_tree_cleanup(&tree); + } + + return error; +} + +#ifdef LODEPNG_COMPILE_ENCODER + +typedef struct ColorProfile +{ + unsigned char sixteenbit; /*needs more than 8 bits per channel*/ + unsigned char sixteenbit_done; + + + unsigned char colored; /*not greyscale*/ + unsigned char colored_done; + + unsigned char key; /*a color key is required, or more*/ + unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ + unsigned short key_g; + unsigned short key_b; + unsigned char alpha; /*alpha channel, or alpha palette, required*/ + unsigned char alpha_done; + + unsigned numcolors; + ColorTree tree; /*for listing the counted colors, up to 256*/ + unsigned char* palette; /*size 1024. Remember up to the first 256 RGBA colors*/ + unsigned maxnumcolors; /*if more than that amount counted*/ + unsigned char numcolors_done; + + unsigned greybits; /*amount of bits required for greyscale (1, 2, 4, 8). Does not take 16 bit into account.*/ + unsigned char greybits_done; + +} ColorProfile; + +static void color_profile_init(ColorProfile* profile, LodePNGColorMode* mode) +{ + profile->sixteenbit = 0; + profile->sixteenbit_done = mode->bitdepth == 16 ? 0 : 1; + + profile->colored = 0; + profile->colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; + + profile->key = 0; + profile->alpha = 0; + profile->alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; + + profile->numcolors = 0; + color_tree_init(&profile->tree, 1); + profile->palette = (unsigned char*)mymalloc(1024); + profile->maxnumcolors = 257; + if(lodepng_get_bpp(mode) <= 8) + { + int bpp = lodepng_get_bpp(mode); + profile->maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); + } + profile->numcolors_done = 0; + + profile->greybits = 1; + profile->greybits_done = lodepng_get_bpp(mode) == 1 ? 1 : 0; +} + +static void color_profile_cleanup(ColorProfile* profile) +{ + color_tree_cleanup(&profile->tree); + myfree(profile->palette); +} + +/*function used for debug purposes with C++*/ +/*void printColorProfile(ColorProfile* p) +{ + std::cout << "sixteenbit: " << (int)p->sixteenbit << std::endl; + std::cout << "sixteenbit_done: " << (int)p->sixteenbit_done << std::endl; + std::cout << "colored: " << (int)p->colored << std::endl; + std::cout << "colored_done: " << (int)p->colored_done << std::endl; + std::cout << "key: " << (int)p->key << std::endl; + std::cout << "key_r: " << (int)p->key_r << std::endl; + std::cout << "key_g: " << (int)p->key_g << std::endl; + std::cout << "key_b: " << (int)p->key_b << std::endl; + std::cout << "alpha: " << (int)p->alpha << std::endl; + std::cout << "alpha_done: " << (int)p->alpha_done << std::endl; + std::cout << "numcolors: " << (int)p->numcolors << std::endl; + std::cout << "maxnumcolors: " << (int)p->maxnumcolors << std::endl; + std::cout << "numcolors_done: " << (int)p->numcolors_done << std::endl; + std::cout << "greybits: " << (int)p->greybits << std::endl; + std::cout << "greybits_done: " << (int)p->greybits_done << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +unsigned getValueRequiredBits(unsigned char value) +{ + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*profile must already have been inited with mode. +It's ok to set some parameters of profile to done already.*/ +static unsigned get_color_profile(ColorProfile* profile, + const unsigned char* in, size_t numpixels, + LodePNGColorMode* mode) +{ + unsigned error = 0; + size_t i; + + if(mode->bitdepth == 16) + { + for(i = 0; i < numpixels; i++) + { + unsigned short r, g, b, a; + error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if(error) break; + + /*a color is considered good for 8-bit if the first byte and the second byte are equal, + (so if it's divisible through 257), NOT necessarily if the second byte is 0*/ + if(!profile->sixteenbit_done + && (((r & 255) != ((r >> 8) & 255)) + || ((g & 255) != ((g >> 8) & 255)) + || ((b & 255) != ((b >> 8) & 255)))) + { + profile->sixteenbit = 1; + profile->sixteenbit_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore at 16-bit*/ + profile->numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + } + + if(!profile->colored_done && (r != g || r != b)) + { + profile->colored = 1; + profile->colored_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + + if(!profile->alpha_done && a != 255) + { + if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) + { + if(!profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + } + else + { + profile->alpha = 1; + profile->alpha_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + } + + if(!profile->greybits_done) + { + /*assuming 8-bit r, this test does not care about 16-bit*/ + unsigned bits = getValueRequiredBits(r); + if(bits > profile->greybits) profile->greybits = bits; + if(profile->greybits >= 8) profile->greybits_done = 1; + } + + if(!profile->numcolors_done) + { + /*assuming 8-bit rgba, this test does not care about 16-bit*/ + if(!color_tree_has(&profile->tree, r, g, b, a)) + { + color_tree_add(&profile->tree, r, g, b, a, profile->numcolors); + if(profile->numcolors < 256) + { + unsigned char* p = profile->palette; + unsigned i = profile->numcolors; + p[i * 4 + 0] = r; + p[i * 4 + 1] = g; + p[i * 4 + 2] = b; + p[i * 4 + 3] = a; + } + profile->numcolors++; + if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; + } + } + + if(profile->alpha_done && profile->numcolors_done + && profile->colored_done && profile->sixteenbit_done && profile->greybits_done) + { + break; + } + }; + } + else + { + for(i = 0; i < numpixels; i++) + { + unsigned char r, g, b, a; + error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode); + if(error) break; + + if(!profile->colored_done && (r != g || r != b)) + { + profile->colored = 1; + profile->colored_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + + if(!profile->alpha_done && a != 255) + { + if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) + { + if(!profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + } + else + { + profile->alpha = 1; + profile->alpha_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + } + + if(!profile->greybits_done) + { + unsigned bits = getValueRequiredBits(r); + if(bits > profile->greybits) profile->greybits = bits; + if(profile->greybits >= 8) profile->greybits_done = 1; + } + + if(!profile->numcolors_done) + { + if(!color_tree_has(&profile->tree, r, g, b, a)) + { + + color_tree_add(&profile->tree, r, g, b, a, profile->numcolors); + if(profile->numcolors < 256) + { + unsigned char* p = profile->palette; + unsigned i = profile->numcolors; + p[i * 4 + 0] = r; + p[i * 4 + 1] = g; + p[i * 4 + 2] = b; + p[i * 4 + 3] = a; + } + profile->numcolors++; + if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; + } + } + + if(profile->alpha_done && profile->numcolors_done && profile->colored_done && profile->greybits_done) + { + break; + } + }; + } + + /*make the profile's key always 16-bit for consistency*/ + if(mode->bitdepth < 16) + { + /*repeat each byte twice*/ + profile->key_r *= 257; + profile->key_g *= 257; + profile->key_b *= 257; + } + + return error; +} + +/*updates values of mode with a potentially smaller color model. mode_out should +contain the user chosen color model, but will be overwritten with the new chosen one.*/ +static unsigned doAutoChooseColor(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, LodePNGColorMode* mode_in, + LodePNGAutoConvert auto_convert) +{ + ColorProfile profile; + unsigned error = 0; + + if(auto_convert == LAC_ALPHA) + { + if(mode_out->colortype != LCT_RGBA && mode_out->colortype != LCT_GREY_ALPHA) return 0; + } + + color_profile_init(&profile, mode_in); + if(auto_convert == LAC_ALPHA) + { + profile.colored_done = 1; + profile.greybits_done = 1; + profile.numcolors_done = 1; + profile.sixteenbit_done = 1; + } + error = get_color_profile(&profile, image, w * h, mode_in); + + if(!error && auto_convert == LAC_ALPHA) + { + if(!profile.alpha) + { + mode_out->colortype = (mode_out->colortype == LCT_RGBA ? LCT_RGB : LCT_GREY); + } + } + else if(!error && auto_convert != LAC_ALPHA) + { + mode_out->key_defined = 0; + + if(profile.sixteenbit) + { + mode_out->bitdepth = 16; + if(profile.alpha) + { + mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; + } + else + { + mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY; + if(profile.key) + { + mode_out->key_defined = 1; + mode_out->key_r = profile.key_r; + mode_out->key_g = profile.key_g; + mode_out->key_b = profile.key_b; + } + } + } + else /*less than 16 bits per channel*/ + { + /*don't add palette overhead if image hasn't got a lot of pixels*/ + unsigned n = profile.numcolors; + int palette_ok = n <= 256 && (n * 2 < w * h); + unsigned palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + int grey_ok = !profile.colored && !profile.alpha; /*grey without alpha, with potentially low bits*/ + if(palette_ok || grey_ok) + { + if(!palette_ok || (grey_ok && profile.greybits <= palettebits)) + { + mode_out->colortype = LCT_GREY; + mode_out->bitdepth = profile.greybits; + if(profile.key) + { + unsigned keyval = profile.key_r; + keyval &= (profile.greybits - 1); /*same subgroup of bits repeated, so taking right bits is fine*/ + mode_out->key_defined = 1; + mode_out->key_r = keyval; + mode_out->key_g = keyval; + mode_out->key_b = keyval; + } + } + else + { + /*fill in the palette*/ + unsigned i; + unsigned char* p = profile.palette; + for(i = 0; i < profile.numcolors; i++) + { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + } + } + else /*8-bit per channel*/ + { + mode_out->bitdepth = 8; + if(profile.alpha) + { + mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; + } + else + { + mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY /*LCT_GREY normally won't occur, already done earlier*/; + if(profile.key) + { + mode_out->key_defined = 1; + mode_out->key_r = profile.key_r % 256; + mode_out->key_g = profile.key_g % 256; + mode_out->key_b = profile.key_b % 256; + } + } + } + } + } + + color_profile_cleanup(&profile); + + if(mode_out->colortype == LCT_PALETTE && mode_in->palettesize == mode_out->palettesize) + { + /*In this case keep the palette order of the input, so that the user can choose an optimal one*/ + size_t i; + for(i = 0; i < mode_in->palettesize * 4; i++) + { + mode_out->palette[i] = mode_in->palette[i]; + } + } + + if(auto_convert == LAC_AUTO_NO_NIBBLES && mode_out->bitdepth < 8) + { + /*palette can keep its small amount of colors, as long as no indices use it*/ + mode_out->bitdepth = 8; + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/* +Paeth predicter, used by PNG filter type 4 +The parameters are of type short, but should come from unsigned chars, the shorts +are only needed to make the paeth calculation correct. +*/ +static unsigned char paethPredictor(short a, short b, short c) +{ + short pa = abs(b - c); + short pb = abs(a - c); + short pc = abs(a + b - c - c); + + if(pc < pa && pc < pb) return (unsigned char)c; + else if(pb < pa) return (unsigned char)b; + else return (unsigned char)a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) +{ + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i < 7; i++) + { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i < 7; i++) + { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, + const unsigned char* in, size_t insize) +{ + LodePNGInfo* info = &state->info_png; + if(insize == 0 || in == 0) + { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 29) + { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) + { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R') + { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + *w = lodepng_read32bitInt(&in[16]); + *h = lodepng_read32bitInt(&in[20]); + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + if(!state->decoder.ignore_crc) + { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) + { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + return state->error; +} + +static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, + size_t bytewidth, unsigned char filterType, size_t length) +{ + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) + { + case 0: + for(i = 0; i < length; i++) recon[i] = scanline[i]; + break; + case 1: + for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; + for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth]; + break; + case 2: + if(precon) + { + for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i]; + } + else + { + for(i = 0; i < length; i++) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) + { + for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2; + for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2); + } + else + { + for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; + for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2; + } + break; + case 4: + if(precon) + { + for(i = 0; i < bytewidth; i++) + { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + for(i = bytewidth; i < length; i++) + { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } + else + { + for(i = 0; i < bytewidth; i++) + { + recon[i] = scanline[i]; + } + for(i = bytewidth; i < length; i++) + { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[i - bytewidth]); + } + } + break; + default: return 36; /*error: unexisting filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char* prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + size_t linebytes = (w * bpp + 7) / 8; + + for(y = 0; y < h; y++) + { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + /*Note: this function works on image buffers WITHOUT padding bits at end of scanlines + with non-multiple-of-8 bit amounts, only between reduced images is padding + out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation + (because that's likely a little bit faster)*/ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; b++) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; b++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ + setBitOfReversedStream0(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; y++) + { + size_t x; + for(x = 0; x < olinebits; x++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, + unsigned w, unsigned h, const LodePNGInfo* info_png) +{ + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) + { + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); + } + /*we can immediatly filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i < 7; i++) + { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) + { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7) / 8) * 8, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + unsigned char IEND = 0; + const unsigned char* chunk; + size_t i; + ucvector idat; /*the data from idat chunks*/ + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + /*provide some proper output values if error will happen*/ + *out = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + ucvector_init(&idat); + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) + { + unsigned chunkLength; + const unsigned char* data; /*the data in the chunk*/ + + /*error: size of the in buffer too small to contain next chunk*/ + if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30); + + /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63); + + if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) + { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + } + + data = lodepng_chunk_data_const(chunk); + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) + { + size_t oldsize = idat.size; + if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/); + for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i]; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*IEND chunk*/ + else if(lodepng_chunk_type_equals(chunk, "IEND")) + { + IEND = 1; + } + /*palette chunk (PLTE)*/ + else if(lodepng_chunk_type_equals(chunk, "PLTE")) + { + unsigned pos = 0; + if(state->info_png.color.palette) myfree(state->info_png.color.palette); + state->info_png.color.palettesize = chunkLength / 3; + state->info_png.color.palette = (unsigned char*)mymalloc(4 * state->info_png.color.palettesize); + if(!state->info_png.color.palette && state->info_png.color.palettesize) + { + state->info_png.color.palettesize = 0; + CERROR_BREAK(state->error, 83); /*alloc fail*/ + } + if(state->info_png.color.palettesize > 256) CERROR_BREAK(state->error, 38); /*error: palette too big*/ + + for(i = 0; i < state->info_png.color.palettesize; i++) + { + state->info_png.color.palette[4 * i + 0] = data[pos++]; /*R*/ + state->info_png.color.palette[4 * i + 1] = data[pos++]; /*G*/ + state->info_png.color.palette[4 * i + 2] = data[pos++]; /*B*/ + state->info_png.color.palette[4 * i + 3] = 255; /*alpha*/ + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*palette transparency chunk (tRNS)*/ + else if(lodepng_chunk_type_equals(chunk, "tRNS")) + { + if(state->info_png.color.colortype == LCT_PALETTE) + { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > state->info_png.color.palettesize) CERROR_BREAK(state->error, 38); + + for(i = 0; i < chunkLength; i++) state->info_png.color.palette[4 * i + 3] = data[i]; + } + else if(state->info_png.color.colortype == LCT_GREY) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) CERROR_BREAK(state->error, 30); + + state->info_png.color.key_defined = 1; + state->info_png.color.key_r = state->info_png.color.key_g + = state->info_png.color.key_b = 256 * data[0] + data[1]; + } + else if(state->info_png.color.colortype == LCT_RGB) + { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) CERROR_BREAK(state->error, 41); + + state->info_png.color.key_defined = 1; + state->info_png.color.key_r = 256 * data[0] + data[1]; + state->info_png.color.key_g = 256 * data[2] + data[3]; + state->info_png.color.key_b = 256 * data[4] + data[5]; + } + else CERROR_BREAK(state->error, 42); /*error: tRNS chunk not allowed for other color models*/ + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + else if(lodepng_chunk_type_equals(chunk, "bKGD")) + { + if(state->info_png.color.colortype == LCT_PALETTE) + { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) CERROR_BREAK(state->error, 43); + + state->info_png.background_defined = 1; + state->info_png.background_r = state->info_png.background_g = state->info_png.background_b = data[0]; + } + else if(state->info_png.color.colortype == LCT_GREY || state->info_png.color.colortype == LCT_GREY_ALPHA) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) CERROR_BREAK(state->error, 44); + + state->info_png.background_defined = 1; + state->info_png.background_r = state->info_png.background_g = state->info_png.background_b + = 256 * data[0] + data[1]; + } + else if(state->info_png.color.colortype == LCT_RGB || state->info_png.color.colortype == LCT_RGBA) + { + /*error: this chunk must be 6 bytes for greyscale image*/ + if(chunkLength != 6) CERROR_BREAK(state->error, 45); + + state->info_png.background_defined = 1; + state->info_png.background_r = 256 * data[0] + data[1]; + state->info_png.background_g = 256 * data[2] + data[3]; + state->info_png.background_b = 256 * data[4] + data[5]; + } + } + /*text chunk (tEXt)*/ + else if(lodepng_chunk_type_equals(chunk, "tEXt")) + { + if(state->decoder.read_text_chunks) + { + char *key = 0, *str = 0; + + while(!state->error) /*not really a while loop, only used to break on error*/ + { + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) length++; + /*error, end reached, no null terminator?*/ + if(length + 1 >= chunkLength) CERROR_BREAK(state->error, 75); + + key = (char*)mymalloc(length + 1); + if(!key) CERROR_BREAK(state->error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i < length; i++) key[i] = data[i]; + + string2_begin = length + 1; + /*error, end reached, no null terminator?*/ + if(string2_begin > chunkLength) CERROR_BREAK(state->error, 75); + + length = chunkLength - string2_begin; + str = (char*)mymalloc(length + 1); + if(!str) CERROR_BREAK(state->error, 83); /*alloc fail*/ + + str[length] = 0; + for(i = 0; i < length; i++) str[i] = data[string2_begin + i]; + + state->error = lodepng_add_text(&state->info_png, key, str); + + break; + } + + myfree(key); + myfree(str); + } + } + /*compressed text chunk (zTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "zTXt")) + { + if(state->decoder.read_text_chunks) + { + unsigned length, string2_begin; + char *key = 0; + ucvector decoded; + + ucvector_init(&decoded); + + while(!state->error) /*not really a while loop, only used to break on error*/ + { + for(length = 0; length < chunkLength && data[length] != 0; length++) ; + if(length + 2 >= chunkLength) CERROR_BREAK(state->error, 75); /*no null termination, corrupt?*/ + + key = (char*)mymalloc(length + 1); + if(!key) CERROR_BREAK(state->error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i < length; i++) key[i] = data[i]; + + if(data[length + 1] != 0) CERROR_BREAK(state->error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(state->error, 75); /*no null termination, corrupt?*/ + + length = chunkLength - string2_begin; + state->error = lodepng_zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[string2_begin]), + length, &state->decoder.zlibsettings); + if(state->error) break; + ucvector_push_back(&decoded, 0); + + state->error = lodepng_add_text(&state->info_png, key, (char*)decoded.data); + + break; + } + + myfree(key); + ucvector_cleanup(&decoded); + if(state->error) break; + } + } + /*international text chunk (iTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "iTXt")) + { + if(state->decoder.read_text_chunks) + { + unsigned length, begin, compressed; + char *key = 0, *langtag = 0, *transkey = 0; + ucvector decoded; + ucvector_init(&decoded); + + while(!state->error) /*not really a while loop, only used to break on error*/ + { + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(state->error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; length++) ; + if(length + 2 >= chunkLength) CERROR_BREAK(state->error, 75); /*no null termination char found*/ + + key = (char*)mymalloc(length + 1); + if(!key) CERROR_BREAK(state->error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i < length; i++) key[i] = data[i]; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(state->error, 72); /*the 0 byte indicating compression must be 0*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; i++) length++; + if(begin + length + 1 >= chunkLength) CERROR_BREAK(state->error, 75); /*no null termination char found*/ + + langtag = (char*)mymalloc(length + 1); + if(!langtag) CERROR_BREAK(state->error, 83); /*alloc fail*/ + + langtag[length] = 0; + for(i = 0; i < length; i++) langtag[i] = data[begin + i]; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; i++) length++; + if(begin + length + 1 >= chunkLength) CERROR_BREAK(state->error, 75); /*no null termination, corrupt?*/ + + transkey = (char*)mymalloc(length + 1); + if(!transkey) CERROR_BREAK(state->error, 83); /*alloc fail*/ + + transkey[length] = 0; + for(i = 0; i < length; i++) transkey[i] = data[begin + i]; + + /*read the actual text*/ + begin += length + 1; + if(begin > chunkLength) CERROR_BREAK(state->error, 75); /*no null termination, corrupt?*/ + + length = chunkLength - begin; + + if(compressed) + { + state->error = lodepng_zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[begin]), + length, &state->decoder.zlibsettings); + if(state->error) break; + if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; + ucvector_push_back(&decoded, 0); + } + else + { + if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(state->error, 83 /*alloc fail*/); + + decoded.data[length] = 0; + for(i = 0; i < length; i++) decoded.data[i] = data[begin + i]; + } + + state->error = lodepng_add_itext(&state->info_png, key, langtag, transkey, (char*)decoded.data); + + break; + } + + myfree(key); + myfree(langtag); + myfree(transkey); + ucvector_cleanup(&decoded); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) + { + if(chunkLength != 7) CERROR_BREAK(state->error, 73); /*invalid tIME chunk size*/ + + state->info_png.time_defined = 1; + state->info_png.time.year = 256 * data[0] + data[+ 1]; + state->info_png.time.month = data[2]; + state->info_png.time.day = data[3]; + state->info_png.time.hour = data[4]; + state->info_png.time.minute = data[5]; + state->info_png.time.second = data[6]; + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) + { + if(chunkLength != 9) CERROR_BREAK(state->error, 74); /*invalid pHYs chunk size*/ + + state->info_png.phys_defined = 1; + state->info_png.phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3]; + state->info_png.phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7]; + state->info_png.phys_unit = data[8]; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + else /*it's not an implemented chunk type, so ignore it: skip over the data*/ + { + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69); + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) + { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ + { + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk); + } + + if(!state->error) + { + ucvector scanlines; + ucvector_init(&scanlines); + + /*maximum final image length is already reserved in the vector's length - this is not really necessary*/ + if(!ucvector_resize(&scanlines, lodepng_get_raw_size(*w, *h, &state->info_png.color) + *h)) + { + state->error = 83; /*alloc fail*/ + } + if(!state->error) + { + /*decompress with the Zlib decompressor*/ + state->error = lodepng_zlib_decompress(&scanlines.data, &scanlines.size, idat.data, + idat.size, &state->decoder.zlibsettings); + } + + if(!state->error) + { + ucvector outv; + ucvector_init(&outv); + if(!ucvector_resizev(&outv, + lodepng_get_raw_size(*w, *h, &state->info_png.color), 0)) state->error = 83; /*alloc fail*/ + if(!state->error) state->error = postProcessScanlines(outv.data, scanlines.data, *w, *h, &state->info_png); + *out = outv.data; + } + ucvector_cleanup(&scanlines); + } + + ucvector_cleanup(&idat); +} + +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + *out = 0; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) + { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) + { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } + else + { + /*color conversion needed; sort of copy of the data*/ + unsigned char* data = *out; + size_t outsize; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) + { + return 56; /*unsupported color mode conversion*/ + } + + outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); + *out = (unsigned char*)mymalloc(outsize); + if(!(*out)) + { + state->error = 83; /*alloc fail*/ + } + else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h); + myfree(data); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + myfree(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) +{ + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState* state) +{ +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState* state) +{ + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) +{ + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*chunkName must be string of 4 characters*/ +static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) +{ + CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); + out->allocsize = out->size; /*fix the allocsize again*/ + return 0; +} + +static void writeSignature(ucvector* out) +{ + /*8 bytes PNG signature, aka the magic bytes*/ + ucvector_push_back(out, 137); + ucvector_push_back(out, 80); + ucvector_push_back(out, 78); + ucvector_push_back(out, 71); + ucvector_push_back(out, 13); + ucvector_push_back(out, 10); + ucvector_push_back(out, 26); + ucvector_push_back(out, 10); +} + +static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) +{ + unsigned error = 0; + ucvector header; + ucvector_init(&header); + + lodepng_add32bitInt(&header, w); /*width*/ + lodepng_add32bitInt(&header, h); /*height*/ + ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ + ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ + ucvector_push_back(&header, 0); /*compression method*/ + ucvector_push_back(&header, 0); /*filter method*/ + ucvector_push_back(&header, interlace_method); /*interlace method*/ + + error = addChunk(out, "IHDR", header.data, header.size); + ucvector_cleanup(&header); + + return error; +} + +static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector PLTE; + ucvector_init(&PLTE); + for(i = 0; i < info->palettesize * 4; i++) + { + /*add all channels except alpha channel*/ + if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); + } + error = addChunk(out, "PLTE", PLTE.data, PLTE.size); + ucvector_cleanup(&PLTE); + + return error; +} + +static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector tRNS; + ucvector_init(&tRNS); + if(info->colortype == LCT_PALETTE) + { + size_t amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i > 0; i--) + { + if(info->palette[4 * (i - 1) + 3] == 255) amount--; + else break; + } + /*add only alpha channel*/ + for(i = 0; i < amount; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); + } + else if(info->colortype == LCT_GREY) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); + } + } + else if(info->colortype == LCT_RGB) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g % 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b % 256)); + } + } + + error = addChunk(out, "tRNS", tRNS.data, tRNS.size); + ucvector_cleanup(&tRNS); + + return error; +} + +static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, + LodePNGCompressSettings* zlibsettings) +{ + ucvector zlibdata; + unsigned error = 0; + + /*compress with the Zlib compressor*/ + ucvector_init(&zlibdata); + error = lodepng_zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); + if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); + ucvector_cleanup(&zlibdata); + + return error; +} + +static unsigned addChunk_IEND(ucvector* out) +{ + unsigned error = 0; + error = addChunk(out, "IEND", 0, 0); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) +{ + unsigned error = 0; + size_t i; + ucvector text; + ucvector_init(&text); + for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]); + ucvector_push_back(&text, 0); + for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]); + error = addChunk(out, "tEXt", text.data, text.size); + ucvector_cleanup(&text); + + return error; +} + +static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, + LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data, compressed; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + ucvector_init(&compressed); + for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); + ucvector_push_back(&data, 0); /*0 termination char*/ + ucvector_push_back(&data, 0); /*compression method: 0*/ + + error = lodepng_zlib_compress(&compressed.data, &compressed.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]); + error = addChunk(out, "zTXt", data.data, data.size); + } + + ucvector_cleanup(&compressed); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, + const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + + for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ + ucvector_push_back(&data, 0); /*compression method*/ + for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + + if(compressed) + { + ucvector compressed_data; + ucvector_init(&compressed_data); + error = lodepng_zlib_compress(&compressed_data.data, &compressed_data.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]); + } + ucvector_cleanup(&compressed_data); + } + else /*not compressed*/ + { + for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]); + } + + if(!error) error = addChunk(out, "iTXt", data.data, data.size); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector bKGD; + ucvector_init(&bKGD); + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g % 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b % 256)); + } + else if(info->color.colortype == LCT_PALETTE) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); /*palette index*/ + } + + error = addChunk(out, "bKGD", bKGD.data, bKGD.size); + ucvector_cleanup(&bKGD); + + return error; +} + +static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) +{ + unsigned error = 0; + unsigned char* data = (unsigned char*)mymalloc(7); + if(!data) return 83; /*alloc fail*/ + data[0] = (unsigned char)(time->year / 256); + data[1] = (unsigned char)(time->year % 256); + data[2] = time->month; + data[3] = time->day; + data[4] = time->hour; + data[5] = time->minute; + data[6] = time->second; + error = addChunk(out, "tIME", data, 7); + myfree(data); + return error; +} + +static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector data; + ucvector_init(&data); + + lodepng_add32bitInt(&data, info->phys_x); + lodepng_add32bitInt(&data, info->phys_y); + ucvector_push_back(&data, info->phys_unit); + + error = addChunk(out, "pHYs", data.data, data.size); + ucvector_cleanup(&data); + + return error; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, + size_t length, size_t bytewidth, unsigned char filterType) +{ + size_t i; + switch(filterType) + { + case 0: /*None*/ + for(i = 0; i < length; i++) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + if(prevline) + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; + } + else + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; + } + break; + case 2: /*Up*/ + if(prevline) + { + for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; + } + else + { + for(i = 0; i < length; i++) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); + } + else + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; + } + break; + case 4: /*Paeth*/ + if(prevline) + { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; i++) + { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } + else + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: return; /*unexisting filter type given*/ + } +} + +static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) +{ + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(info); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = (w * bpp + 7) / 8; + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + const unsigned char* prevline = 0; + unsigned x, y; + unsigned error = 0; + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_HEURISTIC. Parts of it are used for filter strategies + LFS_MINSUM and LFS_ZERO. + */ + int heuristic_zero = info->colortype == LCT_PALETTE || info->bitdepth < 8; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if((!heuristic_zero && settings->filter_strategy == LFS_HEURISTIC)|| + settings->filter_strategy == LFS_MINSUM) + { + /*adaptive filtering*/ + size_t sum[5]; + ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type, bestType = 0; + + for(type = 0; type < 5; type++) ucvector_init(&attempt[type]); + + for(type = 0; type < 5; type++) + { + if(!ucvector_resize(&attempt[type], linebytes)) ERROR_BREAK(83 /*alloc fail*/); + } + + if(!error) + { + for(y = 0; y < h; y++) + { + /*try the 5 filter types*/ + for(type = 0; type < 5; type++) + { + filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + sum[type] = 0; + /*note that not all pixels are checked to speed this up while still having probably the best choice*/ + for(x = 0; x < attempt[type].size; x+=3) + { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + if(type == 0) sum[type] += (unsigned char)(attempt[type].data[x]); + else + { + signed char s = (signed char)(attempt[type].data[x]); + sum[type] += s < 0 ? -s : s; + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + } + } + + for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + } + else if((heuristic_zero && settings->filter_strategy == LFS_HEURISTIC)|| + settings->filter_strategy == LFS_ZERO) + { + for(y = 0; y < h; y++) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + const unsigned TYPE = 0; + out[outindex] = TYPE; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, TYPE); + prevline = &in[inindex]; + } + } + else if(settings->filter_strategy == LFS_PREDEFINED) + { + for(y = 0; y < h; y++) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else /*LFS_BRUTE_FORCE*/ + { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char* dummy; + LodePNGCompressSettings zlibsettings = settings->zlibsettings; + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_encoder = 0; + for(type = 0; type < 5; type++) + { + ucvector_init(&attempt[type]); + ucvector_resize(&attempt[type], linebytes); /*todo: give error if resize failed*/ + } + for(y = 0; y < h; y++) /*try the 5 filter types*/ + { + for(type = 0; type < 5; type++) + { + unsigned testsize = attempt[type].size; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + lodepng_zlib_compress(&dummy, &size[type], attempt[type].data, testsize, &zlibsettings); + myfree(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) + { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + } + for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + } + + return error; +} + +static void addPaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y < h; y++) + { + size_t x; + for(x = 0; x < ilinebits; x++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0); + } +} + +static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + /*Note: this function works on image buffers WITHOUT padding bits at end of scanlines with non-multiple-of-8 + bit amounts, only between reduced images is padding*/ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; b++) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; b++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, + unsigned w, unsigned h, + const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) +{ + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) + { + *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)mymalloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) + { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + ucvector padded; + ucvector_init(&padded); + if(!ucvector_resize(&padded, h * ((w * bpp + 7) / 8))) error = 83; /*alloc fail*/ + if(!error) + { + addPaddingBits(padded.data, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); + error = filter(*out, padded.data, w, h, &info_png->color, settings); + } + ucvector_cleanup(&padded); + } + else + { + /*we can immediatly filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned char* adam7 = (unsigned char*)mymalloc((h * w * bpp + 7) / 8); + if(!adam7 && ((h * w * bpp + 7) / 8)) error = 83; /*alloc fail*/ + + while(!error) /*not a real while loop, used to break out to cleanup to avoid a goto*/ + { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)mymalloc(*outsize); + if(!(*out) && (*outsize)) ERROR_BREAK(83 /*alloc fail*/); + + Adam7_interlace(adam7, in, w, h, bpp); + + for(i = 0; i < 7; i++) + { + if(bpp < 8) + { + ucvector padded; + ucvector_init(&padded); + if(!ucvector_resize(&padded, h * ((w * bpp + 7) / 8))) error = 83; /*alloc fail*/ + if(!error) + { + addPaddingBits(&padded.data[padded_passstart[i]], &adam7[passstart[i]], + ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], &padded.data[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + ucvector_cleanup(&padded); + } + else + { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + } + + break; + } + + myfree(adam7); + } + + return error; +} + +/* +palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... +returns 0 if the palette is opaque, +returns 1 if the palette has a single color with alpha 0 ==> color key +returns 2 if the palette is semi-translucent. +*/ +static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) +{ + size_t i, key = 0; + unsigned r, g, b; /*the value of the color with alpha 0, so long as color keying is possible*/ + for(i = 0; i < palettesize; i++) + { + if(!key && palette[4 * i + 3] == 0) + { + r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; + key = 1; + i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ + } + else if(palette[4 * i + 3] != 255) return 2; + /*when key, no opaque RGB may have key's RGB*/ + else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; + } + return key; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) +{ + unsigned char* inchunk = data; + while((size_t)(inchunk - data) < datasize) + { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk); + } + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state) +{ + LodePNGInfo info; + ucvector outv; + unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + lodepng_info_init(&info); + lodepng_info_copy(&info, &state->info_png); + + if((info.color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (info.color.palettesize == 0 || info.color.palettesize > 256)) + { + state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ + return state->error; + } + + if(state->encoder.auto_convert != LAC_NO) + { + state->error = doAutoChooseColor(&info.color, image, w, h, &state->info_raw, + state->encoder.auto_convert); + } + if(state->error) return state->error; + + if(state->encoder.zlibsettings.windowsize > 32768) + { + CERROR_RETURN_ERROR(state->error, 60); /*error: windowsize larger than allowed*/ + } + if(state->encoder.zlibsettings.btype > 2) + { + CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/ + } + if(state->info_png.interlace_method > 1) + { + CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/ + } + /*error: unexisting color type given*/ + if((state->error = checkColorValidity(info.color.colortype, info.color.bitdepth))) return state->error; + /*error: unexisting color type given*/ + if((state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth))) return state->error; + + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) + { + unsigned char* converted; + size_t size = (w * h * lodepng_get_bpp(&info.color) + 7) / 8; + + converted = (unsigned char*)mymalloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) + { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); + } + if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + myfree(converted); + } + else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + + ucvector_init(&outv); + while(!state->error) /*while only executed once, to break on error*/ + { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + writeSignature(&outv); + /*IHDR*/ + addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) + { + addChunk_PLTE(&outv, &info.color); + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) + { + addChunk_PLTE(&outv, &info.color); + } + /*tRNS*/ + if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) + { + addChunk_tRNS(&outv, &info.color); + } + if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) + { + addChunk_tRNS(&outv, &info.color); + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) addChunk_bKGD(&outv, &info); + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) addChunk_pHYs(&outv, &info); + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) addChunk_tIME(&outv, &info.time); + /*tEXt and/or zTXt*/ + for(i = 0; i < info.text_num; i++) + { + if(strlen(info.text_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.text_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + if(state->encoder.text_compression) + addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + else + addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) + { + unsigned alread_added_id_text = 0; + for(i = 0; i < info.text_num; i++) + { + if(!strcmp(info.text_keys[i], "LodePNG")) + { + alread_added_id_text = 1; + break; + } + } + if(alread_added_id_text == 0) + addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + } + /*iTXt*/ + for(i = 0; i < info.itext_num; i++) + { + if(strlen(info.itext_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.itext_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + addChunk_iTXt(&outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IEND*/ + addChunk_IEND(&outv); + + break; /*this isn't really a while loop; no error happened so break out now!*/ + } + + lodepng_info_cleanup(&info); + myfree(data); + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + myfree(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) +{ + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_strategy = LFS_HEURISTIC; + settings->auto_convert = LAC_AUTO; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char* lodepng_error_text(unsigned code) +{ + switch(code) + { + case 0: return "no error, everything went ok"; + case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: return "problem while processing dynamic deflate block"; + case 14: return "problem while processing dynamic deflate block"; + case 15: return "problem while processing dynamic deflate block"; + case 16: return "unexisting code while processing dynamic deflate block"; + case 17: return "end of out buffer memory reached while inflating"; + case 18: return "invalid distance code while inflating"; + case 19: return "end of out buffer memory reached while inflating"; + case 20: return "invalid deflate block BTYPE encountered while decoding"; + case 21: return "NLEN is not ones complement of LEN in a deflate block"; + + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: return "end of out buffer memory reached while inflating"; + + case 23: return "end of in buffer memory reached while inflating"; + case 24: return "invalid FCHECK in zlib header"; + case 25: return "invalid compression method in zlib header"; + case 26: return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: return "first chunk is not the header chunk"; + case 30: return "chunk length too large, chunk broken off at end of file"; + case 31: return "illegal PNG color type or bpp"; + case 32: return "illegal PNG compression method"; + case 33: return "illegal PNG filter method"; + case 34: return "illegal PNG interlace method"; + case 35: return "chunk length of a chunk is too large or the chunk too small"; + case 36: return "illegal PNG filter type encountered"; + case 37: return "illegal bit depth for this color type given"; + case 38: return "the palette is too big"; /*more than 256 colors*/ + case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette"; + case 40: return "tRNS chunk has wrong size for greyscale image"; + case 41: return "tRNS chunk has wrong size for RGB image"; + case 42: return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: return "bKGD chunk has wrong size for palette image"; + case 44: return "bKGD chunk has wrong size for greyscale image"; + case 45: return "bKGD chunk has wrong size for RGB image"; + /*Is the palette too small?*/ + case 46: return "a value in indexed image is larger than the palette size (bitdepth = 8)"; + /*Is the palette too small?*/ + case 47: return "a value in indexed image is larger than the palette size (bitdepth < 8)"; + /*the input data is empty, maybe a PNG file doesn't exist or is in the wrong path*/ + case 48: return "empty input or file doesn't exist"; + case 49: return "jumped past memory while generating dynamic huffman tree"; + case 50: return "jumped past memory while generating dynamic huffman tree"; + case 51: return "jumped past memory while inflating huffman block"; + case 52: return "jumped past memory while inflating"; + case 53: return "size of zlib data too small"; + case 54: return "repeat symbol in tree while there was no value symbol yet"; + + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: return "jumped past tree while generating huffman tree"; + + case 56: return "given output image colortype or bitdepth not supported for color conversion"; + case 57: return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: return "requested color conversion not supported"; + case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ + case 62: return "conversion from color to greyscale not supported"; + case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; + case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: return "invalid tIME chunk size"; + case 74: return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: return "no null termination char found while decoding text chunk"; + case 76: return "iTXt chunk too short to contain required bytes"; + case 77: return "integer overflow in buffer size"; + case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: return "failed to open file for writing"; + case 80: return "tried creating a tree of 0 symbols"; + case 81: return "lazy matching at pos 0 is impossible"; + case 82: return "color conversion to palette requested while a color isn't in palette"; + case 83: return "memory allocation failed"; + case 84: return "given image too small to contain all pixels to be encoded"; + case 85: return "internal color conversion bug"; + case 86: return "impossible offset in lz77 encoding (internal bug)"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ + +#ifdef LODEPNG_COMPILE_DISK +void load_file(std::vector& buffer, const std::string& filename) +{ + std::ifstream file(filename.c_str(), std::ios::in|std::ios::binary|std::ios::ate); + + /*get filesize*/ + std::streamsize size = 0; + if(file.seekg(0, std::ios::end).good()) size = file.tellg(); + if(file.seekg(0, std::ios::beg).good()) size -= file.tellg(); + + /*read contents of the file into the vector*/ + buffer.resize(size_t(size)); + if(size > 0) file.read((char*)(&buffer[0]), size); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +void save_file(const std::vector& buffer, const std::string& filename) +{ + std::ofstream file(filename.c_str(), std::ios::out|std::ios::binary); + file.write(buffer.empty() ? 0 : (char*)&buffer[0], std::streamsize(buffer.size())); +} +#endif //LODEPNG_COMPILE_DISK + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = lodepng_zlib_decompress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + myfree(buffer); + } + return error; +} + +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings) +{ + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif //LODEPNG_COMPILE_DECODER + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = lodepng_zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + myfree(buffer); + } + return error; +} + +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings) +{ + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif //LODEPNG_COMPILE_ENCODER +#endif //LODEPNG_COMPILE_ZLIB + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() +{ + lodepng_state_init(this); +} + +State::State(const State& other) +{ + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() +{ + lodepng_state_cleanup(this); +} + +State& State::operator=(const State& other) +{ + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) + { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + myfree(buffer); + } + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) +{ + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize) +{ + unsigned char* buffer; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) + { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + myfree(buffer); + } + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in) +{ + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + load_file(buffer, filename); + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif //LODEPNG_COMPILE_DECODER +#endif //LODEPNG_COMPILE_DISK + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + myfree(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + myfree(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state) +{ + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_ENCODER +#endif //LODEPNG_COMPILE_PNG +} //namespace lodepng +#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/tcod/tcod_sys/libtcod/src/png/lodepng.h b/tcod/tcod_sys/libtcod/src/png/lodepng.h new file mode 100644 index 00000000..938c89cf --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/png/lodepng.h @@ -0,0 +1,1633 @@ +/* +LodePNG version 20120729 + +Copyright (c) 2005-2012 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#include /*for size_t*/ + +#ifdef __cplusplus +#include +#include +#endif /*__cplusplus*/ + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc. +*/ +/*deflate&zlib. If disabled, you need to define two zlib functions, see documtation of LODEPNG_CUSTOM_ZLIB_... below*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB +#define LODEPNG_COMPILE_ZLIB +#endif +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG +#define LODEPNG_COMPILE_PNG +#endif +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER +#define LODEPNG_COMPILE_DECODER +#endif +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER +#define LODEPNG_COMPILE_ENCODER +#endif +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK +#define LODEPNG_COMPILE_DISK +#endif +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS +#define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT +#define LODEPNG_COMPILE_ERROR_TEXT +#endif +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus +#ifndef LODEPNG_NO_COMPILE_CPP +#define LODEPNG_COMPILE_CPP +#endif +#endif + +/* +custom zlib decoder (if LODEPNG_COMPILE_ZLIB is disabled, this is ignored, always treated as "1"): +0: not custom, use LodePNG's zlib decoder +1: allow using custom zlib decoder with a setting +--> you must then provide following function in your source files that LodePNG will link to: + unsigned lodepng_custom_inflate(unsigned char**, size_t*, const unsigned char*, size_t, + const LodePNGDecompressSettings*) +2: allow using custom deflate decoder with a setting +--> you must then provide following function in your source files that LodePNG will link to: + unsigned lodepng_custom_zlib_decompress(unsigned char**, size_t*, const unsigned char*, size_t, + const LodePNGDecompressSettings*) +*/ +#ifndef LODEPNG_OVERRIDE_CUSTOM_ZLIB_DECODER +#define LODEPNG_CUSTOM_ZLIB_DECODER 0 +#else +#define LODEPNG_CUSTOM_ZLIB_DECODER LODEPNG_OVERRIDE_CUSTOM_ZLIB_DECODER +#endif + +/* +custom zlib encoder (if LODEPNG_COMPILE_ZLIB is disabled, this is ignored, always treated as "1"): +0: not custom, use LodePNG's zlib encoder +1: allow using custom zlib encoder with a setting +--> you must then provide following function in your source files that LodePNG will link to: + unsigned lodepng_custom_deflate(unsigned char**, size_t*, const unsigned char*, size_t, + const LodePNGCompressSettings*) +2: allow using custom deflate encoder with a setting +--> you must then provide following function in your source files that LodePNG will link to: + unsigned lodepng_custom_zlib_compress(unsigned char**, size_t*, const unsigned char*, size_t, + const LodePNGCompressSettings*) +*/ +#ifndef LODEPNG_OVERRIDE_CUSTOM_ZLIB_ENCODER +#define LODEPNG_CUSTOM_ZLIB_ENCODER 0 +#else +#define LODEPNG_CUSTOM_ZLIB_ENCODER LODEPNG_OVERRIDE_CUSTOM_ZLIB_ENCODER +#endif + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw).*/ +typedef enum LodePNGColorType +{ + LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ + LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned lodepng_encode_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector.*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::string& filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_DECODER + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector.*/ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_ENCODER +} //namespace lodepng +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/*Returns an English description of the numerical error code.*/ +const char* lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct LodePNGDecompressSettings +{ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + unsigned custom_decoder; /*use custom decoder if LODEPNG_CUSTOM_ZLIB_DECODER and LODEPNG_COMPILE_ZLIB are enabled*/ +} LodePNGDecompressSettings; + +extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct LodePNGCompressSettings /*deflate = compress*/ +{ + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*the maximum is 32768, higher gives more compression but is slower. Typical value: 2048.*/ + unsigned custom_encoder; /*use custom encoder if LODEPNG_CUSTOM_ZLIB_DECODER and LODEPNG_COMPILE_ZLIB are enabled*/ +} LodePNGCompressSettings; + +extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct LodePNGColorMode +{ + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use + lodepng_palette_clear, then for each color use lodepng_palette_add. + If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. + + When decoding, by default you can ignore this palette, since LodePNG already + fills the palette colors in the pixels of the raw RGBA output. + + The palette is only supported for color type 3. + */ + unsigned char* palette; /*palette in RGBARGBA... order*/ + size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For greyscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/greyscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode* info); +void lodepng_color_mode_cleanup(LodePNGColorMode* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); + +void lodepng_palette_clear(LodePNGColorMode* info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode* info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode* info); +/*is it a greyscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode* info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct LodePNGTime +{ + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct LodePNGInfo +{ + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + suggested background color chunk (bKGD) + This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit. + + For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding + the encoder writes the red one. For palette PNGs: When decoding, the RGB value + will be stored, not a palette index. But when encoding, specify the index of + the palette in background_r, the other two are then ignored. + + The decoder does not use this background color to edit the color of pixels. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + A keyword is minimum 1 character and maximum 79 characters long. It's + discouraged to use a single line length longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char** text_strings; /*the actual text*/ + + /* + international text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys". + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + unknown chunks + There are 3 buffers, one for each position in the PNG where unknown chunks can appear + each buffer contains all unknown chunks for that position consecutively + The 3 buffers are the unknown chunks between certain critical chunks: + 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char* unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo* info); +void lodepng_info_cleanup(LodePNGInfo* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ + +void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp) +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + LodePNGColorMode* mode_out, LodePNGColorMode* mode_in, + unsigned w, unsigned h); + + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct LodePNGDecoderSettings +{ + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + unsigned ignore_crc; /*ignore CRC checksums*/ + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum LodePNGFilterStrategy +{ + LFS_HEURISTIC, /*official PNG heuristic*/ + LFS_ZERO, /*every filter at zero*/ + LFS_MINSUM, /*like the official PNG heuristic, but use minimal sum always, including palette and low bitdepth images*/ + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + This gives better compression, at the cost of being super slow. Experimental! + If you enable this, also set zlibsettings.windowsize to 32768 and choose an + optimal color mode for the PNG image for best compression. Default: 0 (false). + */ + LFS_BRUTE_FORCE, + LFS_PREDEFINED /*use predefined_filters buffer: you specify the filter type for each scanline*/ +} LodePNGFilterStrategy; + +/*automatically use color type with less bits per pixel if losslessly possible. Default: LAC_AUTO*/ +typedef enum LodePNGAutoConvert +{ + LAC_NO, /*use color type user requested*/ + LAC_ALPHA, /*use color type user requested, but if only opaque pixels and RGBA or grey+alpha, use RGB or grey*/ + LAC_AUTO, /*use PNG color type that can losslessly represent the uncompressed image the smallest possible*/ + /* + like AUTO, but do not choose 1, 2 or 4 bit per pixel types. + sometimes a PNG image compresses worse if less than 8 bits per pixels. + */ + LAC_AUTO_NO_NIBBLES +} LodePNGAutoConvert; + + +/*Settings for the encoder.*/ +typedef struct LodePNGEncoderSettings +{ + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + LodePNGAutoConvert auto_convert; /*how to automatically choose output PNG color type, if at all*/ + + LodePNGFilterStrategy filter_strategy; + + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it.*/ + unsigned char* predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is _always_ created.*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct LodePNGState +{ +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +#ifdef LODEPNG_COMPILE_CPP + //For the lodepng::State subclass. + virtual ~LodePNGState(){} +#endif +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState* state); +void lodepng_state_cleanup(LodePNGState* state); +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the header chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +PNG standard chunk naming conventions: +First byte: uppercase = critical, lowercase = ancillary +Second byte: uppercase = public, lowercase = private +Third byte: must be uppercase +Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/ +unsigned lodepng_chunk_length(const unsigned char* chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char* chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char* chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char* lodepng_chunk_data(unsigned char* chunk); +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char* chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char* chunk); + +/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/ +unsigned char* lodepng_chunk_next(unsigned char* chunk); +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returne error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into buffer. The function allocates the out buffer, and +after usage you should free it. +out: output parameter, contains pointer to loaded buffer. +outsize: output parameter, size of the allocated out buffer +filename: the path to the file to load +return value: error code (0 means ok) +*/ +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); + +/* +Save a file from buffer to disk. Warning, if it exists, this function overwrites +the file without warning! +buffer: the buffer to write +buffersize: size of the buffer to write +filename: the path to the file to save to +return value: error code (0 means ok) +*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +//The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState +{ + public: + State(); + State(const State& other); + virtual ~State(); + State& operator=(const State& other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +//Same as other lodepng::decode, but using a State for more settings and information. +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +//Same as other lodepng::encode, but using a State for more settings and information. +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into an std::vector. If the vector is empty, then either +the file doesn't exist or is an empty file. +*/ +void load_file(std::vector& buffer, const std::string& filename); + +/* +Save the binary data in an std::vector to a file on disk. The file is overwritten +without warning. +*/ +void save_file(const std::vector& buffer, const std::string& filename); +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_PNG + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +//Zlib-decompress an unsigned char buffer +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); + +//Zlib-decompress an std::vector +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); +#endif //LODEPNG_COMPILE_DECODER + +#ifdef LODEPNG_COMPILE_ENCODER +//Zlib-compress an unsigned char buffer +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); + +//Zlib-compress an std::vector +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); +#endif //LODEPNG_COMPILE_ENCODER +#endif //LODEPNG_COMPILE_ZLIB +} //namespace lodepng +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with vareous compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) +[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +*/ + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. changes + 12. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color model, translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported (generated/interpreted) by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + +1.2. features not supported +--------------------------- + +The following features are _not_ supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The following public chunks are not supported but treated as unknown chunks by LodePNG + cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT + Some of these are not supported on purpose: LodePNG wants to provide the RGB values + stored in the pixels, not values modified by system dependent gamma or color models. + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to greyscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, greyscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to greyscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: greyscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: greyscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters of the simple function of LodePNG you're using. + +If, when encoding, you use another color type than the default in the input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters of the simplefunction of LodePNG you're +using. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to LAC_NONE, and specify the color type you want in the LodePNGInfo of the +encoder. + +If you do any of the above, LodePNG may need to do a color conversion, which +follows the rules below, and may sometimes not be allowed. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +Non supported color conversions: +-color to greyscale: no error is thrown, but the result will look ugly because +only the red channel is taken +-anything, to palette when that palette does not have that color in it: in this +case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any grey or grey+alpha, to grey or grey+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done: +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +LAC_NO. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, +not the first bit of a new byte. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outlength. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distionction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.0 on Linux. + +*) Mingw + +The Mingw compiler (a port of gcc) for Windows is fully supported by LodePNG. + +*) Visual Studio 2005 and Visual C++ 2005 Express Edition + +Versions 20070604 up to 20080107 have been tested on VS2005 and work. Visual +studio may give warnings about 'fopen' being deprecated. A multiplatform library +can't support the proposed Visual Studio alternative however. + +If you're using LodePNG in VS2005 and don't want to see the deprecated warnings, +put this on top of lodepng.h before the inclusions: +#define _CRT_SECURE_NO_DEPRECATE + +Visual Studio may want "stdafx.h" files to be included in each source file. That +is not standard C++ and will not be added to the stock LodePNG. Try to find a +setting to disable it for this source file. + +*) Visual Studio 6.0 + +LodePNG support for Visual Studio 6.0 is not guaranteed because VS6 doesn't +follow the C++ standard correctly. + +*) Comeau C/C++ + +Vesion 20070107 compiles without problems on the Comeau C/C++ Online Test Drive +at http://www.comeaucomputing.com/tryitout in both C90 and C++ mode. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with the gcc and LLVM for Macintosh, both +for C and C++. + +*) Other Compilers + +If you encounter problems on other compilers, feel free to let me know and I may +try to fix it if the compiler is modern standards complient. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) +{ + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) +{ + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + + +11. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrinked the implementation code. Made new samples. +*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011 (!): changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also vareous fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +12. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2012 Lode Vandevenne +*/ diff --git a/tcod/tcod_sys/libtcod/src/sys.cpp b/tcod/tcod_sys/libtcod/src/sys.cpp new file mode 100644 index 00000000..cbd30a5b --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/sys.cpp @@ -0,0 +1,229 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" +#include +#include + +void TCODSystem::saveScreenshot(const char *filename) { + TCOD_sys_save_screenshot(filename); +} + +void TCODSystem::sleepMilli(uint32 milliseconds) { + TCOD_sys_sleep_milli(milliseconds); +} + +uint32 TCODSystem::getElapsedMilli() { + return TCOD_sys_elapsed_milli(); +} + +float TCODSystem::getElapsedSeconds() { + return TCOD_sys_elapsed_seconds(); +} + +void TCODSystem::forceFullscreenResolution(int width, int height) { + TCOD_sys_force_fullscreen_resolution(width,height); +} + +void TCODSystem::setRenderer(TCOD_renderer_t renderer) { + TCOD_sys_set_renderer(renderer); +} +TCOD_event_t TCODSystem::waitForEvent(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse, bool flush) { + return TCOD_sys_wait_for_event(eventMask,key,mouse,flush); +} + +TCOD_event_t TCODSystem::checkForEvent(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse) { + return TCOD_sys_check_for_event(eventMask,key,mouse); +} + +TCOD_renderer_t TCODSystem::getRenderer() { + return TCOD_sys_get_renderer(); +} + +void TCODSystem::setFps(int val) { + TCOD_sys_set_fps(val); +} + +int TCODSystem::getFps() { + return TCOD_sys_get_fps(); +} + +float TCODSystem::getLastFrameLength() { + return TCOD_sys_get_last_frame_length(); +} + +void TCODSystem::getCurrentResolution(int *w, int *h) { + TCOD_sys_get_current_resolution(w,h); +} + +void TCODSystem::getFullscreenOffsets(int *offx, int *offy) { + TCOD_sys_get_fullscreen_offsets(offx,offy); +} + +void TCODSystem::updateChar(int asciiCode, int fontx, int fonty,const TCODImage *img,int x,int y) { + TCOD_sys_update_char(asciiCode,fontx,fonty,img->data,x,y); +} + +void TCODSystem::getCharSize(int *w, int *h) { + TCOD_sys_get_char_size(w,h); +} + +// filesystem stuff +bool TCODSystem::createDirectory(const char *path) { + return TCOD_sys_create_directory(path) != 0; +} + +bool TCODSystem::deleteFile(const char *path) { + return TCOD_sys_delete_file(path) != 0; +} + +bool TCODSystem::deleteDirectory(const char *path) { + return TCOD_sys_delete_directory(path) != 0; +} + +bool TCODSystem::isDirectory(const char *path) { + return TCOD_sys_is_directory(path) != 0; +} + +TCOD_list_t TCODSystem::getDirectoryContent(const char *path, const char *pattern) { + return TCOD_sys_get_directory_content(path,pattern); +} + +bool TCODSystem::fileExists(const char * filename, ...) { + FILE * in; + bool ret = false; + char f[1024]; + va_list ap; + va_start(ap,filename); + vsprintf(f,filename,ap); + va_end(ap); + in = fopen(f,"rb"); + if (in != NULL) { + ret = true; + fclose(in); + } + return ret; +} + +bool TCODSystem::readFile(const char *filename, unsigned char **buf, size_t *size) { + return TCOD_sys_read_file(filename,buf,size) != 0; +} + +bool TCODSystem::writeFile(const char *filename, unsigned char *buf, uint32 size) { + return TCOD_sys_write_file(filename,buf,size) != 0; +} + +// clipboard stuff +void TCODSystem::setClipboard(const char *value) { + TCOD_sys_clipboard_set(value); +} + +char *TCODSystem::getClipboard() { + return TCOD_sys_clipboard_get(); +} + + +// thread stuff +int TCODSystem::getNumCores() { + return TCOD_sys_get_num_cores(); +} + +TCOD_thread_t TCODSystem::newThread(int (*func)(void *), void *data) { + return TCOD_thread_new(func,data); +} + +void TCODSystem::deleteThread(TCOD_thread_t th) { + TCOD_thread_delete(th); +} + +void TCODSystem::waitThread(TCOD_thread_t th) { + TCOD_thread_wait(th); +} + +// mutex +TCOD_mutex_t TCODSystem::newMutex() { + return TCOD_mutex_new(); +} + +void TCODSystem::mutexIn(TCOD_mutex_t mut) { + TCOD_mutex_in(mut); +} + +void TCODSystem::mutexOut(TCOD_mutex_t mut) { + TCOD_mutex_out(mut); +} + +void TCODSystem::deleteMutex(TCOD_mutex_t mut) { + TCOD_mutex_delete(mut); +} + +// semaphore +TCOD_semaphore_t TCODSystem::newSemaphore(int initVal) { + return TCOD_semaphore_new(initVal); +} + +void TCODSystem::lockSemaphore(TCOD_semaphore_t sem) { + TCOD_semaphore_lock(sem); +} + +void TCODSystem::unlockSemaphore(TCOD_semaphore_t sem) { + TCOD_semaphore_unlock(sem); +} + +void TCODSystem::deleteSemaphore( TCOD_semaphore_t sem) { + TCOD_semaphore_delete(sem); +} + +// condition +TCOD_cond_t TCODSystem::newCondition() { + return TCOD_condition_new(); +} + +void TCODSystem::signalCondition(TCOD_cond_t cond) { + TCOD_condition_signal(cond); +} + +void TCODSystem::broadcastCondition(TCOD_cond_t cond) { + TCOD_condition_broadcast(cond); +} + +void TCODSystem::waitCondition(TCOD_cond_t cond, TCOD_mutex_t mut) { + TCOD_condition_wait(cond, mut); +} + +void TCODSystem::deleteCondition( TCOD_cond_t cond) { + TCOD_condition_delete(cond); +} + +// custom post-renderer +static ITCODSDLRenderer *renderer=NULL; +extern "C" void TCOD_CRenderer(void *sdl_surface) { + if ( renderer ) renderer->render(sdl_surface); +} +void TCODSystem::registerSDLRenderer(ITCODSDLRenderer *renderer) { + ::renderer = renderer; + TCOD_sys_register_SDL_renderer(TCOD_CRenderer); +} diff --git a/tcod/tcod_sys/libtcod/src/sys_c.c b/tcod/tcod_sys/libtcod/src/sys_c.c new file mode 100644 index 00000000..7af98b9c --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/sys_c.c @@ -0,0 +1,692 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include + +#if defined (__linux) && ! defined (__ANDROID__) || defined (__FreeBSD__) +/* X11 stuff for clipboard support */ +#include +#include +#elif defined (__APPLE__) && defined (__MACH__) +#include +#endif +#include "libtcod.h" +#include "libtcod_int.h" +#ifdef TCOD_WINDOWS +#include +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#if defined(TCOD_WINDOWS) +char *strcasestr (const char *haystack, const char *needle) { + const char *p, *startn = 0, *np = 0; + + for (p = haystack; *p; p++) { + if (np) { + if (toupper(*p) == toupper(*np)) { + if (!*++np) + return (char *)startn; + } else + np = 0; + } else if (toupper(*p) == toupper(*needle)) { + np = needle + 1; + startn = p; + } + } + + return 0; +} +#endif + +void TCOD_sys_get_fullscreen_offsets(int *offx, int *offy) { + if ( offx ) *offx = TCOD_ctx.fullscreen_offsetx; + if ( offy ) *offy = TCOD_ctx.fullscreen_offsety; +} + +bool TCOD_sys_create_directory(const char *path) { +#ifdef TCOD_WINDOWS + return (CreateDirectory(path,NULL) != 0 || GetLastError() == ERROR_ALREADY_EXISTS); +#else + return mkdir(path,0755) == 0 || errno == EEXIST; +#endif +} + +bool TCOD_sys_delete_file(const char *path) { +#ifdef TCOD_WINDOWS + return DeleteFile(path) != 0; +#else + return unlink(path) == 0 || errno == ENOENT; +#endif +} + +bool TCOD_sys_delete_directory(const char *path) { +#ifdef TCOD_WINDOWS + return RemoveDirectory(path) != 0; +#else + return rmdir(path) == 0 || errno == ENOENT; +#endif +} + + +bool TCOD_sys_is_directory(const char *path) { +#ifdef TCOD_WINDOWS + DWORD type=GetFileAttributes(path); + return ( type & FILE_ATTRIBUTE_DIRECTORY) != 0 ; +#else + DIR *d=opendir(path); + if ( d ) { closedir(d); return true; } + return false; +#endif +} + + +static bool filename_match(const char *name, const char *pattern) { + char *ptr; + if ( pattern == NULL || pattern[0] == 0 ) return true; + ptr=strchr(pattern,'*'); + if ( ! ptr ) return strcmp(name,pattern) == 0; + if ( ptr != name && strncmp(name,pattern, ptr - pattern) != 0 ) return false; + return strcmp( name + strlen(name) - strlen(ptr+1), ptr+1) == 0; +} + +TCOD_list_t TCOD_sys_get_directory_content(const char *path, const char *pattern) { + TCOD_list_t list=TCOD_list_new(); +#ifdef TCOD_WINDOWS + WIN32_FIND_DATA FileData; + HANDLE hList; + char dname[ 512 ]; + sprintf(dname, "%s\\*",path); + hList = FindFirstFile(dname, &FileData); + if (hList == INVALID_HANDLE_VALUE) + { + return list; + } + do + { + if ( ! (strcmp(FileData.cFileName,".") == 0 || strcmp(FileData.cFileName,"..") == 0 ) ) + { + if ( filename_match(FileData.cFileName,pattern) ) + TCOD_list_push(list,TCOD_strdup(FileData.cFileName)); + } + + } while ( FindNextFile(hList, &FileData) ); + FindClose(hList); +#else + DIR *dir = opendir(path); + struct dirent *dirent = NULL; + if ( ! dir ) return list; + while ( ( dirent = readdir(dir) ) ) + { + if ( ! (strcmp(dirent->d_name,".") == 0 || strcmp(dirent->d_name,"..") == 0 ) ) + { + if ( filename_match(dirent->d_name,pattern) ) + TCOD_list_push(list,strdup(dirent->d_name)); + } + } + closedir(dir); +#endif + return list; +} + +/* thread stuff */ +#ifdef TCOD_WINDOWS +/* Helper function to count set bits in the processor mask. */ +static DWORD CountSetBits(ULONG_PTR bitMask) +{ + DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1; + DWORD bitSetCount = 0; + ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT; + DWORD i; + + for (i = 0; i <= LSHIFT; ++i) + { + bitSetCount += ((bitMask & bitTest)?1:0); + bitTest/=2; + } + + return bitSetCount; +} +#endif + +int TCOD_sys_get_num_cores() { +#ifdef TCOD_WINDOWS + /* what a crap !!! works only on xp sp3 & vista */ + typedef enum _PROCESSOR_CACHE_TYPE { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace + } PROCESSOR_CACHE_TYPE; + + typedef struct _CACHE_DESCRIPTOR { + BYTE Level; + BYTE Associativity; + WORD LineSize; + DWORD Size; + PROCESSOR_CACHE_TYPE Type; + } CACHE_DESCRIPTOR; + typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage + } LOGICAL_PROCESSOR_RELATIONSHIP; + + typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { + ULONG_PTR ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + union { + struct { + BYTE Flags; + } ProcessorCore; + struct { + DWORD NodeNumber; + } NumaNode; + CACHE_DESCRIPTOR Cache; + ULONGLONG Reserved[2]; + }; + } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, + *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; + typedef BOOL (WINAPI *LPFN_GLPI)( + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, + PDWORD); + + LPFN_GLPI glpi; + BOOL done = FALSE; + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL; + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL; + DWORD returnLength = 0; + DWORD logicalProcessorCount = 0; + DWORD byteOffset = 0; + + glpi = (LPFN_GLPI) GetProcAddress( + GetModuleHandle(TEXT("kernel32")), + "GetLogicalProcessorInformation"); + if (! glpi) { + return 1; + } + + while (!done) { + DWORD rc = glpi(buffer, &returnLength); + + if (FALSE == rc) + { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + if (buffer) + free(buffer); + + buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc( + returnLength); + + if (NULL == buffer) { + return 1; + } + } else { + return 1; + } + } else { + done = TRUE; + } + } + + ptr = buffer; + + while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) { + switch (ptr->Relationship) { + case RelationProcessorCore: + /* A hyperthreaded core supplies more than one logical processor. */ + logicalProcessorCount += CountSetBits(ptr->ProcessorMask); + break; + default: break; + } + byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); + ptr++; + } + + free(buffer); + + return logicalProcessorCount; +#else + return sysconf(_SC_NPROCESSORS_ONLN); +#endif +} + +TCOD_thread_t TCOD_thread_new(int (*func)(void *), void *data) +{ +#ifdef TCOD_WINDOWS + HANDLE ret = CreateThread(NULL,0,(DWORD (WINAPI *)( LPVOID ))func,data,0,NULL); + return (TCOD_thread_t)ret; +#else + pthread_t id; + int iret; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); + iret =pthread_create(&id,&attr,(void *(*)(void *))func,data); + if ( iret != 0 ) id=0; + return (TCOD_thread_t)id; +#endif +} + +void TCOD_thread_delete(TCOD_thread_t th) +{ +#ifdef TCOD_WINDOWS + CloseHandle((HANDLE)th); +#endif +} + +void TCOD_thread_wait(TCOD_thread_t th) { +#ifdef TCOD_WINDOWS + WaitForSingleObject((HANDLE)th,INFINITE); +#else + pthread_t id=(pthread_t)th; + pthread_join(id,NULL); +#endif +} + +TCOD_mutex_t TCOD_mutex_new() +{ +#ifdef TCOD_WINDOWS + CRITICAL_SECTION *cs = (CRITICAL_SECTION *)calloc(sizeof(CRITICAL_SECTION),1); + InitializeCriticalSection(cs); + return (TCOD_mutex_t)cs; +#else + static pthread_mutex_t tmp=PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_t *mut = (pthread_mutex_t *)calloc(sizeof(pthread_mutex_t),1); + *mut = tmp; + return (TCOD_mutex_t)mut; +#endif +} + +void TCOD_mutex_in(TCOD_mutex_t mut) +{ +#ifdef TCOD_WINDOWS + EnterCriticalSection((CRITICAL_SECTION *)mut); +#else + pthread_mutex_lock((pthread_mutex_t *)mut); +#endif +} + +void TCOD_mutex_out(TCOD_mutex_t mut) +{ +#ifdef TCOD_WINDOWS + LeaveCriticalSection((CRITICAL_SECTION *)mut); +#else + pthread_mutex_unlock((pthread_mutex_t *)mut); +#endif +} + +void TCOD_mutex_delete(TCOD_mutex_t mut) +{ +#ifdef TCOD_WINDOWS + DeleteCriticalSection((CRITICAL_SECTION *)mut); + free(mut); +#else + pthread_mutex_destroy((pthread_mutex_t *)mut); + free(mut); +#endif +} + +TCOD_semaphore_t TCOD_semaphore_new(int initVal) +{ +#ifdef TCOD_WINDOWS + HANDLE ret = CreateSemaphore(NULL,initVal,255,NULL); + return (TCOD_semaphore_t)ret; +#else + sem_t *ret = (sem_t *)calloc(sizeof(sem_t),1); + if ( ret ) sem_init(ret,0,initVal); + return (TCOD_semaphore_t) ret; +#endif +} + +void TCOD_semaphore_lock(TCOD_semaphore_t sem) +{ +#ifdef TCOD_WINDOWS + WaitForSingleObject((HANDLE)sem,INFINITE); +#else + if ( sem ) sem_wait((sem_t *)sem); +#endif +} + +void TCOD_semaphore_unlock(TCOD_semaphore_t sem) +{ +#ifdef TCOD_WINDOWS + ReleaseSemaphore((HANDLE)sem,1,NULL); +#else + if ( sem ) sem_post((sem_t *)sem); +#endif +} + +void TCOD_semaphore_delete( TCOD_semaphore_t sem) +{ +#ifdef TCOD_WINDOWS + CloseHandle((HANDLE)sem); +#else + if ( sem ) + { + sem_destroy((sem_t *)sem); + free (sem); + } +#endif +} + +#ifdef TCOD_WINDOWS +/* poor win32 api has no thread conditions */ +typedef struct { + int nbSignals; + int nbWaiting; + TCOD_mutex_t mutex; + TCOD_semaphore_t waiting; + TCOD_semaphore_t waitDone; +} cond_t; +#endif + +TCOD_cond_t TCOD_condition_new() { +#ifdef TCOD_WINDOWS + cond_t *ret = (cond_t *)calloc(sizeof(cond_t),1); + ret->mutex = TCOD_mutex_new(); + ret->waiting = TCOD_semaphore_new(0); + ret->waitDone = TCOD_semaphore_new(0); + return (TCOD_cond_t)ret; +#else + pthread_cond_t *ret = (pthread_cond_t *)calloc(sizeof(pthread_cond_t),1); + if ( ret ) pthread_cond_init(ret,NULL); + return (TCOD_cond_t) ret; +#endif +} + +void TCOD_condition_signal(TCOD_cond_t pcond) { +#ifdef TCOD_WINDOWS + cond_t *cond=(cond_t *)pcond; + if ( cond ) { + TCOD_mutex_in(cond->mutex); + if ( cond->nbWaiting > cond->nbSignals ) { + cond->nbSignals++; + TCOD_semaphore_unlock(cond->waiting); + TCOD_mutex_out(cond->mutex); + TCOD_semaphore_lock(cond->waitDone); + } else { + TCOD_mutex_out(cond->mutex); + } + } +#else + if ( pcond ) { + pthread_cond_signal((pthread_cond_t *)pcond); + } +#endif +} + +void TCOD_condition_broadcast(TCOD_cond_t pcond) { +#ifdef TCOD_WINDOWS + cond_t *cond=(cond_t *)pcond; + if ( cond ) { + TCOD_mutex_in(cond->mutex); + if ( cond->nbWaiting > cond->nbSignals ) { + int nbUnlock=cond->nbWaiting-cond->nbSignals; + int i; + cond->nbSignals=cond->nbWaiting; + for (i=nbUnlock; i > 0; i--) { + TCOD_semaphore_unlock(cond->waiting); + } + TCOD_mutex_out(cond->mutex); + for (i=nbUnlock; i > 0; i--) { + TCOD_semaphore_lock(cond->waitDone); + } + } else { + TCOD_mutex_out(cond->mutex); + } + } +#else + if ( pcond ) { + pthread_cond_broadcast((pthread_cond_t *)pcond); + } +#endif +} + +void TCOD_condition_wait(TCOD_cond_t pcond, TCOD_mutex_t mut) { +#ifdef TCOD_WINDOWS + cond_t *cond=(cond_t *)pcond; + if ( cond ) { + TCOD_mutex_in(cond->mutex); + cond->nbWaiting++; + TCOD_mutex_out(cond->mutex); + TCOD_mutex_out(mut); + TCOD_semaphore_lock(cond->waiting); + TCOD_mutex_in(cond->mutex); + if ( cond->nbSignals > 0 ) { + TCOD_semaphore_unlock(cond->waitDone); + cond->nbSignals--; + } + cond->nbWaiting--; + TCOD_mutex_out(cond->mutex); + } +#else + if ( pcond && mut ) { + pthread_cond_wait((pthread_cond_t *)pcond, (pthread_mutex_t *)mut); + } +#endif +} + +void TCOD_condition_delete( TCOD_cond_t pcond) { +#ifdef TCOD_WINDOWS + cond_t *cond=(cond_t *)pcond; + if ( cond ) { + TCOD_mutex_delete(cond->mutex); + TCOD_semaphore_delete(cond->waiting); + TCOD_semaphore_delete(cond->waitDone); + free(cond); + } +#else + if ( pcond ) { + pthread_cond_destroy((pthread_cond_t *)pcond); + free (pcond); + } +#endif +} + +/*clipboard stuff */ +#ifdef TCOD_WINDOWS +void TCOD_sys_clipboard_set(const char *value) +{ + HGLOBAL clipbuffer; + char * buffer; + if (!OpenClipboard(0) || ! value) return; + EmptyClipboard(); + clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(value)+1); + buffer = (char*)GlobalLock(clipbuffer); + strcpy(buffer, value); + GlobalUnlock(clipbuffer); + SetClipboardData(CF_TEXT, clipbuffer); + CloseClipboard(); +} + +char *TCOD_sys_clipboard_get() +{ + char * buffer = NULL; + HANDLE hData; + if (!OpenClipboard(NULL)) return 0; + hData = GetClipboardData( CF_TEXT ); + buffer = (char*)GlobalLock( hData ); + GlobalUnlock( hData ); + CloseClipboard(); + return buffer; +} +#elif defined(TCOD_MACOSX) +void TCOD_sys_clipboard_set(const char *value) +{ + PasteboardRef clipboard; + if (PasteboardCreate(kPasteboardClipboard, &clipboard) != noErr) return; + if (PasteboardClear(clipboard) != noErr) { + CFRelease(clipboard); + return; + } + size_t len = strlen(value); + CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, + (const UInt8 *)value, + len, kCFAllocatorNull); + if (data == NULL) { + CFRelease(clipboard); + return; + } + OSStatus err; + err = PasteboardPutItemFlavor(clipboard, NULL, kUTTypePlainText, data, 0); + CFRelease(clipboard); + CFRelease(data); +} + +char clipboardText[256]; + +char *TCOD_sys_clipboard_get() +{ + PasteboardSyncFlags syncFlags; + ItemCount itemCount; + PasteboardRef clipboard; + UInt32 itemIndex; + if (PasteboardCreate(kPasteboardClipboard, &clipboard) != noErr) return NULL; + syncFlags = PasteboardSynchronize(clipboard); + if (PasteboardGetItemCount(clipboard, &itemCount) != noErr) return NULL; + if (itemCount == 0) return NULL; + for(itemIndex = 1; itemIndex <= itemCount; itemIndex++) { + PasteboardItemID itemID; + CFArrayRef flavorTypeArray; + CFIndex flavorCount; + CFIndex flavorIndex; + if (PasteboardGetItemIdentifier(clipboard, itemIndex, &itemID ) != noErr) return NULL; + if (PasteboardCopyItemFlavors(clipboard, itemID, &flavorTypeArray) != noErr) return NULL; + flavorCount = CFArrayGetCount(flavorTypeArray); + for(flavorIndex = 0; flavorIndex < flavorCount; flavorIndex++) { + CFStringRef flavorType; + CFDataRef flavorData; + CFIndex flavorDataSize; + flavorType = (CFStringRef)CFArrayGetValueAtIndex(flavorTypeArray, flavorIndex); + if (UTTypeConformsTo(flavorType, CFSTR("public.plain-text"))) { + if (PasteboardCopyItemFlavorData(clipboard, itemID, flavorType, &flavorData) != noErr) { + CFRelease(flavorData); + return NULL; + } + flavorDataSize = CFDataGetLength( flavorData ); + flavorDataSize = (flavorDataSize<254) ? flavorDataSize : 254; + short dataIndex; + for(dataIndex = 0; dataIndex <= flavorDataSize; dataIndex++) { + clipboardText[dataIndex] = *(CFDataGetBytePtr(flavorData) + dataIndex); + } + clipboardText[flavorDataSize] = '\0'; + clipboardText[flavorDataSize+1] = '\n'; + CFRelease (flavorData); + } + } + } + return clipboardText; +} +#elif defined(TCOD_HAIKU) || defined(__ANDROID__) +/* TODO */ +void TCOD_sys_clipboard_set(const char *value) +{ +} +char *TCOD_sys_clipboard_get() +{ + return ""; +} +#else +static Display *dpy=NULL; +void TCOD_sys_clipboard_set(const char *value) +{ + if ( ! value ) return; + if (!dpy ) dpy = XOpenDisplay(NULL); + XStoreBytes(dpy,value,strlen(value)+1); + /* doesn't seem to work without this... */ + int len; + char *xbuf = XFetchBytes(dpy,&len); + XFree(xbuf); +} + +char *TCOD_sys_clipboard_get() +{ + int len; + if (!dpy ) dpy = XOpenDisplay(NULL); + char *xbuf = XFetchBytes(dpy,&len); + if (! xbuf ) return NULL; + char *ret=strdup(xbuf); + XFree(xbuf); + return ret; +} +#endif + + +/* library initialization function */ +#ifdef TCOD_WINDOWS +BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD reason, LPVOID reserved) { + switch (reason ) { + /* case DLL_PROCESS_ATTACH : TCOD_sys_startup(); break; -- not safe, locks up in SDL2/RegisterClass call */ + default : break; + } + return TRUE; +} +#else +/* JBR03202012 Presumably there was a reason for this being if !MACOSOX, but it works fine for me + #ifndef TCOD_MACOSX */ + void __attribute__ ((constructor)) DllMain() { + /* TCOD_sys_startup(); */ + } +/* #endif */ +#endif + +/* dynamic library support */ +#ifdef TCOD_WINDOWS +TCOD_library_t TCOD_load_library(const char *path) { + return (TCOD_library_t)LoadLibrary(path); +} +void * TCOD_get_function_address(TCOD_library_t library, const char *function_name) { + return (void *)GetProcAddress((HMODULE)library,function_name); +} +void TCOD_close_library(TCOD_library_t library) { + FreeLibrary((HMODULE)library); +} +#else +TCOD_library_t TCOD_load_library(const char *path) { + void *l=dlopen(path,RTLD_LAZY); + return (TCOD_library_t)l; +} +void * TCOD_get_function_address(TCOD_library_t library, const char *function_name) { + return dlsym(library,(char *)function_name); +} +void TCOD_close_library(TCOD_library_t library) { + dlclose(library); +} +#endif diff --git a/tcod/tcod_sys/libtcod/src/sys_opengl_c.c b/tcod/tcod_sys/libtcod/src/sys_opengl_c.c new file mode 100644 index 00000000..df180b10 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/sys_opengl_c.c @@ -0,0 +1,661 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * This renderer is mostly copied and pasted from Antagonist's SkyFire GLSL roguelike engine + */ + +#include "libtcod.h" +#include "libtcod_int.h" +#ifndef NO_OPENGL +#include +#include + +#define CHECKGL( GLcall ) \ + GLcall; \ + if(!_CheckGL_Error( #GLcall, __FILE__, __LINE__)) \ + return false; + +#ifdef NDEBUG +#define DBGCHECKGL(GLcall) GLcall +#else +#define DBGCHECKGL CHECKGL +#endif + +typedef enum +{ + Character, + ForeCol, + BackCol, + ConsoleDataEnumSize +} ConsoleDataEnum; +/* JBR04152012 - Made Character a 4 byte value here to support extended characters like other renderers. + Seems like it should be possible to make it a two byte value using GL_UNSIGNED_SHORT_5_6_5_REV in updateTex, + but I can't seem to get the math right in the shader code, it always loses precision somewhere, + resulting in incorrect characters. */ +const int ConsoleDataAlignment[3] = {4, 3, 3 }; + +static const char *TCOD_con_vertex_shader = +#ifndef NDEBUG +"#version 110\n" +#endif +"uniform vec2 termsize; " + +"void main(void) " +"{ " + +" gl_Position = gl_Vertex; " + +" gl_TexCoord[0] = gl_MultiTexCoord0; " +" gl_TexCoord[0].x = gl_TexCoord[0].x*termsize.x; " +" gl_TexCoord[0].y = gl_TexCoord[0].y*termsize.y; " +"} " +; + +static const char *TCOD_con_pixel_shader = +#ifndef NDEBUG +"#version 110\n" +#endif +"uniform sampler2D font; " +"uniform sampler2D term; " +"uniform sampler2D termfcol; " +"uniform sampler2D termbcol; " + +"uniform float fontw; " +"uniform vec2 fontcoef; " +"uniform vec2 termsize; " +"uniform vec2 termcoef; " + +"void main(void) " +"{ " +" vec2 rawCoord = gl_TexCoord[0].xy; " /* varying from [0, termsize) in x and y */ +" vec2 conPos = floor(rawCoord); " /* console integer position */ +" vec2 pixPos = fract(rawCoord); " /* pixel offset within console position */ +" pixPos = vec2(pixPos.x*fontcoef.x,pixPos.y*fontcoef.y); " /* Correct pixel offset for font tex location */ + +" vec2 address = vec2(conPos.x*termcoef.x,conPos.y*termcoef.y); " +" address=address+vec2(0.001, 0.001); " +" vec4 charvec = texture2D(term,address);" +" float inchar = (charvec.r * 256.0) + (charvec.g * 256.0 * 256.0);" /* character */ +" vec4 tcharfcol = texture2D(termfcol, address); " /* front color */ +" vec4 tcharbcol = texture2D(termbcol, address); " /* back color */ + +" vec4 tchar = vec4(mod(floor(inchar),floor(fontw)),floor(inchar/fontw), 0.0, 0.0); " /* 1D index to 2D index map for character */ + +" gl_FragColor = texture2D(font, vec2((tchar.x*fontcoef.x),(tchar.y*fontcoef.y))+pixPos.xy); " /* magic func: finds pixel value in font file */ +" gl_FragColor=gl_FragColor.a*tcharfcol+(1.0-gl_FragColor.a)*tcharbcol; " /* Coloring stage */ +"} " +; + +bool _CheckGL_Error(const char* GLcall, const char* file, const int line) +{ + GLenum errCode; + if((errCode = glGetError())!=GL_NO_ERROR) + { + printf("OPENGL ERROR #%i: in file %s on line %i\n",errCode,file, line); + printf("OPENGL Call: %s\n",GLcall); + return false; + } + return true; +} + +/* called before creating window */ +void TCOD_opengl_init_attributes() { + static bool first=true; + if ( first ) { + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8); + SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32 ); + /* ATI driver bug : enabling this might result in red screen */ + /* SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); */ + first=false; + } +} + +/* console size (power of 2 and cells) */ +static int POTconwidth, POTconheight, conwidth, conheight; +/* programs and shaders handles */ +static GLhandleARB conProgram, conVertShader, conFragShader; +/* font texture handle */ +static GLuint font_tex; +/* font power of 2 size and pixels */ +static int POTfontwidth,POTfontheight, fontwidth,fontheight; +/* console data */ +static GLuint Tex[ConsoleDataEnumSize]; +static unsigned char *data[ConsoleDataEnumSize]; +static bool dirty[ConsoleDataEnumSize]; + +/* extension function pointers */ +static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB=0; +static PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB=0; +static PFNGLSHADERSOURCEARBPROC glShaderSourceARB=0; +static PFNGLCOMPILESHADERARBPROC glCompileShaderARB=0; +static PFNGLGETINFOLOGARBPROC glGetInfoLogARB=0; +static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB=0; +static PFNGLATTACHOBJECTARBPROC glAttachObjectARB=0; +static PFNGLLINKPROGRAMARBPROC glLinkProgramARB=0; +static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB=0; +static PFNGLUNIFORM2FARBPROC glUniform2fARB=0; +static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB=0; +static PFNGLUNIFORM1FARBPROC glUniform1fARB=0; +static PFNGLUNIFORM1IARBPROC glUniform1iARB=0; +#ifdef TCOD_WINDOWS +static PFNGLACTIVETEXTUREPROC glActiveTexture=0; +#endif + +/* call after creating window */ +bool TCOD_opengl_init_state(int conw, int conh, void *font) { + SDL_Surface *font_surf=(SDL_Surface *)font; + + /* convert font for opengl */ + Uint32 rmask, gmask, bmask, amask; + SDL_Surface *temp; + SDL_Surface *temp_alpha; + + /* check opengl extensions */ + if ( TCOD_ctx.renderer == TCOD_RENDERER_GLSL ) { + bool hasShader = false; + const char *glexts=(const char *)glGetString(GL_EXTENSIONS); + if (glexts ) { + hasShader = (strstr(glexts,"GL_ARB_shader_objects") != NULL); + } + if (! hasShader ) { + TCOD_LOG(("Missing GL_ARB_shader_objects extension. Falling back to fixed pipeline...\n")); + TCOD_ctx.renderer = TCOD_RENDERER_OPENGL; + } + } + + /* set extensions functions pointers */ + glCreateShaderObjectARB=(PFNGLCREATESHADEROBJECTARBPROC)SDL_GL_GetProcAddress("glCreateShaderObjectARB"); + glGetObjectParameterivARB=(PFNGLGETOBJECTPARAMETERIVARBPROC)SDL_GL_GetProcAddress("glGetObjectParameterivARB"); + glShaderSourceARB=(PFNGLSHADERSOURCEARBPROC)SDL_GL_GetProcAddress("glShaderSourceARB"); + glCompileShaderARB=(PFNGLCOMPILESHADERARBPROC)SDL_GL_GetProcAddress("glCompileShaderARB"); + glGetInfoLogARB=(PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB"); + glCreateProgramObjectARB=(PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB"); + glAttachObjectARB=(PFNGLATTACHOBJECTARBPROC)SDL_GL_GetProcAddress("glAttachObjectARB"); + glLinkProgramARB=(PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB"); + glUseProgramObjectARB=(PFNGLUSEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glUseProgramObjectARB"); + glUniform2fARB=(PFNGLUNIFORM2FARBPROC)SDL_GL_GetProcAddress("glUniform2fARB"); + glGetUniformLocationARB=(PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB"); + glUniform1fARB=(PFNGLUNIFORM1FARBPROC)SDL_GL_GetProcAddress("glUniform1fARB"); + glUniform1iARB=(PFNGLUNIFORM1IARBPROC)SDL_GL_GetProcAddress("glUniform1iARB"); +#ifdef TCOD_WINDOWS + glActiveTexture=(PFNGLACTIVETEXTUREPROC)SDL_GL_GetProcAddress("glActiveTexture"); +#endif + + /* set opengl state */ + glEnable(GL_TEXTURE_2D); + glClearColor(1.0f, 1.0f, 0.0f, 0.0f); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glClear( GL_COLOR_BUFFER_BIT ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + if ( TCOD_ctx.renderer == TCOD_RENDERER_GLSL ) { + glOrtho(0, conw, 0, conh, -1.0f, 1.0f); + glDisable (GL_BLEND); + } else { + glOrtho(0, conw, conh, 0.0f, -1.0f, 1.0f); + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); +/*#ifdef TCOD_WINDOWS */ + if ( ! TCOD_ctx.fullscreen ) { + /* turn vsync off in windowed mode */ + typedef bool (APIENTRY *PFNWGLSWAPINTERVALFARPROC)(int); + PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0; + + wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)SDL_GL_GetProcAddress("wglSwapIntervalEXT"); + + if (wglSwapIntervalEXT) wglSwapIntervalEXT(0); + } +/*#endif */ + + /* compute pot size */ + conwidth=conw; + conheight=conh; + POTconwidth=POTconheight=1; + while ( POTconwidth < conw ) POTconwidth *= 2; + while ( POTconheight < conh ) POTconheight *= 2; + + + #if SDL_BYTEORDER == SDL_BIG_ENDIAN + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; + #else + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0xff000000; + #endif + + fontwidth=font_surf->w; + fontheight=font_surf->h; + POTfontwidth=POTfontheight=1; + while ( POTfontwidth < fontwidth ) POTfontwidth *= 2; + while ( POTfontheight < fontheight ) POTfontheight *= 2; + + SDL_SetColorKey(font_surf, SDL_SRCCOLORKEY, SDL_MapRGB(font_surf->format, 0, 0, 0)); + temp_alpha = SDL_DisplayFormatAlpha(font_surf); + SDL_SetAlpha(temp_alpha, 0, SDL_ALPHA_TRANSPARENT); + + temp = SDL_CreateRGBSurface(SDL_SWSURFACE, POTfontwidth, POTfontheight, 32, bmask, gmask, rmask, amask); /*BGRA */ + + SDL_BlitSurface(temp_alpha, NULL, temp, NULL); + SDL_FreeSurface(temp_alpha); + + CHECKGL(glGenTextures(1, &font_tex)); + CHECKGL(glBindTexture(GL_TEXTURE_2D, font_tex)); + SDL_LockSurface(temp); + + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + + CHECKGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, temp->pixels)); + SDL_UnlockSurface(temp); + SDL_FreeSurface(temp); + return true; +} + +static GLhandleARB loadShader(const char *txt, GLuint type) { + int success; + int infologLength = 0; + int charsWritten = 0; + char *infoLog; + GLhandleARB v = glCreateShaderObjectARB(type); + glShaderSourceARB(v, 1, &txt, 0); + glCompileShaderARB(v); + + glGetObjectParameterivARB(v, GL_COMPILE_STATUS, &success); + if(success!=GL_TRUE) + { + /* something went wrong */ + glGetObjectParameterivARB(v, GL_INFO_LOG_LENGTH,&infologLength); + if(infologLength>0) + { + infoLog = (char *)malloc(infologLength); + glGetInfoLogARB(v, infologLength, &charsWritten, infoLog); + printf("GLSL ERROR : %s\n",infoLog); + free(infoLog); + } + return 0; + } + + return v; +} + +static bool loadProgram(const char *vertShaderCode, const char *fragShaderCode, + GLhandleARB *vertShader, GLhandleARB *fragShader, GLhandleARB *prog) { + /* Create and load Program and Shaders */ + int success; + *prog = DBGCHECKGL(glCreateProgramObjectARB()); + + *vertShader = loadShader(vertShaderCode, GL_VERTEX_SHADER); + if ( *vertShader == 0 ) return false; + glAttachObjectARB(*prog, *vertShader); + + *fragShader = loadShader(fragShaderCode, GL_FRAGMENT_SHADER); + if ( *fragShader == 0 ) return false; + glAttachObjectARB(*prog, *fragShader); + + glLinkProgramARB(*prog); + + glGetObjectParameterivARB(*prog, GL_LINK_STATUS, &success); + if(success!=GL_TRUE) + { + /* something went wrong */ + int infologLength = 0; + int charsWritten = 0; + char *infoLog; + glGetObjectParameterivARB(*prog, GL_INFO_LOG_LENGTH,&infologLength); + if (infologLength > 0) + { + infoLog = (char *)malloc(infologLength); + glGetInfoLogARB(*prog, infologLength, &charsWritten, infoLog); + printf("OPENGL ERROR: Program link Error"); + printf("%s\n",infoLog); + free(infoLog); + } + return false; + } + return true; +} + +bool TCOD_opengl_init_shaders() { + int i; + TCOD_color_t *fCol; + if ( TCOD_ctx.renderer == TCOD_RENDERER_GLSL ) { + if (! loadProgram(TCOD_con_vertex_shader, TCOD_con_pixel_shader, &conVertShader, &conFragShader, &conProgram ) ) return false; + } + /* Host side data init */ + for(i = 0; i< ConsoleDataEnumSize; i++) + { + data[i] = (unsigned char *)calloc(conwidth*conheight,ConsoleDataAlignment[i]); + dirty[i]=true; + } + /* Initialize ForeCol to 255, 255, 255, 255 */ + fCol = (TCOD_color_t *)data[ForeCol]; + for( i = 0; i < conwidth*conheight; i++) + { + fCol[i].r=255; + fCol[i].g=255; + fCol[i].b=255; + } + + /* Generate Textures */ + glGenTextures(3, Tex); + + /* Character Texture */ + CHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[Character])); + + CHECKGL(glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST )); + CHECKGL(glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST )); + + CHECKGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, POTconwidth, POTconheight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0)); + + + /* ForeCol Texture */ + CHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[ForeCol])); + + CHECKGL(glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST )); + CHECKGL(glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST )); + + CHECKGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, POTconwidth, POTconheight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0)); + + /* BackCol Texture */ + CHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[BackCol])); + + CHECKGL(glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST )); + CHECKGL(glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST )); + + CHECKGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, POTconwidth, POTconheight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0)); + + CHECKGL(glBindTexture(GL_TEXTURE_2D, 0)); + + return true; +} + +static bool updateTex(ConsoleDataEnum dataType) { + GLenum Type=0; + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[dataType])); + + switch(ConsoleDataAlignment[dataType]) + { + case 1: + Type = GL_RED; + break; + /*case 2: + Type = GL_RG; + break; */ + case 3: + Type = GL_RGB; + break; + case 4: + Type = GL_RGBA; + break; + } + /*glPixelStorei(GL_UNPACK_ALIGNMENT, 1); */ + DBGCHECKGL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, conwidth, conheight, Type, GL_UNSIGNED_BYTE, data[dataType])); + + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D,0)); + return true; +} + +static void updateChar(ConsoleDataEnum dataType, int BufferPos, unsigned char *c, int length, int offset) { + int i; + dirty[dataType] = true; /* Set dirty so Texture gets updated next frame */ + + for(i = 0; icf == -1 ) c->cf = TCOD_ctx.ascii_to_tcod[c->c]; + if ( track_changes ) { + changed=false; + if ( c->dirt || ascii_updated[ c->c ] || c->back.r != oc->back.r || c->back.g != oc->back.g + || c->back.b != oc->back.b || c->fore.r != oc->fore.r + || c->fore.g != oc->fore.g || c->fore.b != oc->fore.b + || c->c != oc->c || c->cf != oc->cf) { + changed=true; + } + } + c->dirt=0; + if ( changed ) { + TCOD_opengl_putchar_ex(x,y,c->cf,c->fore,c->back); + } + c++;oc++; + } + } + + /* check if any of the textures have changed since they were last uploaded */ + for( i = 0; i< ConsoleDataEnumSize; i++) + { + if(dirty[i]) + { + updateTex((ConsoleDataEnum)i); + dirty[i] = false; + } + } + if ( TCOD_ctx.renderer == TCOD_RENDERER_OPENGL ) { + /* fixed pipeline for video cards without pixel shader support */ + /* draw the background as a single quad */ + float texw=(float)conwidth/POTconwidth; + float texh=(float)conheight/POTconheight; + float fonw=(float)fontwidth/(TCOD_ctx.fontNbCharHoriz*POTfontwidth); + float fonh=(float)fontheight/(TCOD_ctx.fontNbCharVertic*POTfontheight); + char_t *c; + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[BackCol])); + DBGCHECKGL(glBegin(GL_QUADS); + glColor3f(1.0,1.0,1.0); + glTexCoord2f( 0.0, 0.0 ); + glVertex2i( 0, 0); + glTexCoord2f( 0.0, texh); + glVertex2i( 0, conheight ); + glTexCoord2f( texw, texh ); + glVertex2i( conwidth, conheight); + glTexCoord2f( texw, 0.0 ); + glVertex2i( conwidth, 0 ); + glEnd()); + /* draw the characters (one quad per cell) */ + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, font_tex)); + + c=console_buffer; + for (y=0;yc != ' ' ) { + TCOD_color_t f=c->fore; + TCOD_color_t b=c->back; + /* only draw character if foreground color != background color */ + if ( f.r != b.r || f.g != b.g || f.b != b.b ) { + int srcx,srcy,destx,desty; + destx=x;/* *TCOD_font_width; */ + desty=y;/* *TCOD_font_height; */ + if ( TCOD_ctx.fullscreen ) { + destx+=TCOD_ctx.fullscreen_offsetx/TCOD_ctx.font_width; + desty+=TCOD_ctx.fullscreen_offsety/TCOD_ctx.font_height; + } + /* draw foreground */ + ascii=c->cf; + srcx = (ascii%TCOD_ctx.fontNbCharHoriz); + srcy = (ascii/TCOD_ctx.fontNbCharHoriz); + glBegin( GL_QUADS ); + glColor3f((GLfloat)(f.r/255.0), (GLfloat)(f.g/255.0), (GLfloat)(f.b/255.0)); + glTexCoord2f( srcx*fonw, srcy*fonh ); + glVertex2i( destx, desty); + glTexCoord2f( srcx*fonw, (srcy+1)*fonh ); + glVertex2i( destx, desty+1 ); + glTexCoord2f( (srcx+1)*fonw, (srcy+1)*fonh ); + glVertex2i( destx+1, desty+1 ); + glTexCoord2f( (srcx+1)*fonw, srcy*fonh ); + glVertex2i( destx+1, desty ); + glEnd(); + } + } + c++; + } + } + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, 0)); + } else { + /* actual rendering */ + DBGCHECKGL(glUseProgramObjectARB(conProgram)); + + /* Technically all these glUniform calls can be moved to SFConsole() when the shader is loaded */ + /* None of these change */ + /* The Textures still need to bind to the same # Activetexture throughout though */ + DBGCHECKGL(glUniform2fARB(glGetUniformLocationARB(conProgram,"termsize"), (float) conwidth, (float) conheight)); + DBGCHECKGL(glUniform2fARB(glGetUniformLocationARB(conProgram,"termcoef"), 1.0f/POTconwidth, 1.0f/POTconheight)); + DBGCHECKGL(glUniform1fARB(glGetUniformLocationARB(conProgram,"fontw"), (float)TCOD_ctx.fontNbCharHoriz)); + DBGCHECKGL(glUniform2fARB(glGetUniformLocationARB(conProgram,"fontcoef"), (float)(fontwidth)/(POTfontwidth*TCOD_ctx.fontNbCharHoriz), (float)(fontheight)/(POTfontheight*TCOD_ctx.fontNbCharVertic))); + + + DBGCHECKGL(glActiveTexture(GL_TEXTURE0)); + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, font_tex)); + DBGCHECKGL(glUniform1iARB(glGetUniformLocationARB(conProgram,"font"),0)); + + DBGCHECKGL(glActiveTexture(GL_TEXTURE1)); + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[Character])); + DBGCHECKGL(glUniform1iARB(glGetUniformLocationARB(conProgram,"term"),1)); + + DBGCHECKGL(glActiveTexture(GL_TEXTURE2)); + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[ForeCol])); + DBGCHECKGL(glUniform1iARB(glGetUniformLocationARB(conProgram,"termfcol"),2)); + + DBGCHECKGL(glActiveTexture(GL_TEXTURE3)); + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, Tex[BackCol])); + DBGCHECKGL(glUniform1iARB(glGetUniformLocationARB(conProgram,"termbcol"),3)); + + /* DBGCHECKGL(shader->Validate()); */ + + DBGCHECKGL(glBegin(GL_QUADS); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-1.0f,-1.0f,0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(1.0f,-1.0f,0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(1.0f,1.0f, 0.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-1.0f,1.0f,0.0f); + glEnd()); + + DBGCHECKGL(glBindTexture(GL_TEXTURE_2D, 0)); + + DBGCHECKGL(glUseProgramObjectARB(0)); + } + /* fading overlay */ + if ( fade != 255 ) { + int x=0,y=0; + if ( TCOD_ctx.fullscreen ) { + x=TCOD_ctx.fullscreen_offsetx/TCOD_ctx.font_width; + y=TCOD_ctx.fullscreen_offsety/TCOD_ctx.font_height; + } + glBegin( GL_QUADS ); + glColor4f(TCOD_ctx.fading_color.r/255.0f,TCOD_ctx.fading_color.g/255.0f,TCOD_ctx.fading_color.b/255.0f,1.0f-fade/255.0f); + glVertex2i( x, y); + glVertex2i( x, y+conheight ); + glVertex2i( x+conwidth, y+conheight ); + glVertex2i( x+conwidth, y); + glEnd(); + } + return true; +} + +void TCOD_opengl_swap() { + SDL_GL_SwapBuffers(); +} + +void * TCOD_opengl_get_screen() { + SDL_Surface *surf; + int pixw,pixh,offx=0,offy=0,x,y; + Uint32 mask,nmask; + + /* allocate a pixel buffer */ + pixw=TCOD_ctx.root->w * TCOD_ctx.font_width; + pixh=TCOD_ctx.root->h * TCOD_ctx.font_height; + surf=TCOD_sys_get_surface(pixw,pixh,false); + if ( TCOD_ctx.fullscreen ) { + offx=TCOD_ctx.fullscreen_offsetx; + offy=TCOD_ctx.fullscreen_offsety; + } + + /* get pixel data from opengl */ + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glReadPixels(offx,offy,pixw,pixh, GL_RGB, GL_UNSIGNED_BYTE, surf->pixels); + glPopClientAttrib(); + + /* vertical flip (opengl has lower-left origin, SDL upper left) */ + mask=surf->format->Rmask|surf->format->Gmask|surf->format->Bmask; + nmask=~mask; + for (x=0; x < surf->w; x++) { + for (y=0; y < surf->h/2; y++) { + int offsrc=x*3+y*surf->pitch; + int offdst=x*3+(surf->h-1-y)*surf->pitch; + Uint32 *pixsrc = (Uint32 *)(((Uint8 *)surf->pixels)+offsrc); + Uint32 *pixdst = (Uint32 *)(((Uint8 *)surf->pixels)+offdst); + Uint32 tmp = *pixsrc; + *pixsrc = ((*pixsrc) & nmask) | ((*pixdst) & mask); + *pixdst = ((*pixdst) & nmask) | (tmp & mask); + } + } + + return (void *)surf; +} + +#endif + diff --git a/tcod/tcod_sys/libtcod/src/sys_sdl_c.c b/tcod/tcod_sys/libtcod/src/sys_sdl_c.c new file mode 100644 index 00000000..c0965127 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/sys_sdl_c.c @@ -0,0 +1,2312 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#if defined (__HAIKU__) || defined(__ANDROID__) +#include +#include +#elif defined (TCOD_SDL2) +#include +#else +#include +#endif +#include "libtcod.h" +#include "libtcod_int.h" + +#if defined(__ANDROID__) +#define TCOD_TOUCH_INPUT +#define MAX_TOUCH_FINGERS 5 + +typedef struct { + int nupdates; /* how many updates have happened since the first finger was pressed. */ + Uint32 ticks0; /* current number of ticks at start of touch event sequence. */ + SDL_FingerID finger_id; /* the last finger which was pressed. */ + int coords[MAX_TOUCH_FINGERS][2]; /* absolute position of each finger. */ + int coords_delta[MAX_TOUCH_FINGERS][2]; /* absolute position of each finger. */ + int consolecoords[MAX_TOUCH_FINGERS][2]; /* cell coordinates in the root console for each finger. */ + int consolecoords_delta[MAX_TOUCH_FINGERS][2]; /* cell coordinates in the root console for each finger. */ + int nfingers; /* number of unique fingers employed at any time during this. */ + int nfingerspressed; /* number of those fingers currently still pressed. */ + SDL_FingerID finger_ids[MAX_TOUCH_FINGERS]; + char fingerspressed[MAX_TOUCH_FINGERS]; +} TCOD_touch_t; +#endif + +/* to enable bitmap locking. Is there any use ?? makes the OSX port renderer to fail */ +/*#define USE_SDL_LOCKS */ + + +/* image support stuff */ +bool TCOD_sys_check_bmp(const char *filename); +SDL_Surface *TCOD_sys_read_bmp(const char *filename); +void TCOD_sys_write_bmp(const SDL_Surface *surf, const char *filename); +bool TCOD_sys_check_png(const char *filename); +SDL_Surface *TCOD_sys_read_png(const char *filename); +void TCOD_sys_write_png(const SDL_Surface *surf, const char *filename); + +typedef struct { + char *extension; + bool (*check_type)(const char *filename); + SDL_Surface *(*read)(const char *filename); + void (*write)(const SDL_Surface *surf, const char *filename); +} image_support_t; + +static image_support_t image_type[] = { + { "BMP", TCOD_sys_check_bmp, TCOD_sys_read_bmp, TCOD_sys_write_bmp }, + { "PNG", TCOD_sys_check_png, TCOD_sys_read_png, TCOD_sys_write_png }, + { NULL, NULL, NULL, NULL }, +}; + +typedef struct { + float force_recalc; + float last_scale_xc, last_scale_yc; + float last_scale_factor; + float last_fullscreen; + + float min_scale_factor; + + float src_height_width_ratio; + float dst_height_width_ratio; + int src_x0, src_y0; + int src_copy_width, src_copy_height; + int src_proportionate_width, src_proportionate_height; + int dst_display_width, dst_display_height; + int dst_offset_x, dst_offset_y; + int surface_width, surface_height; +} scale_data_t; + +#if SDL_VERSION_ATLEAST(2,0,0) +static SDL_Window* window=NULL; +static SDL_Renderer* renderer=NULL; +#else +static SDL_Surface* screen=NULL; +#endif +static SDL_Surface* scale_screen=NULL; +static SDL_Surface* charmap=NULL; +static char_t *consoleBuffer=NULL; +static char_t *prevConsoleBuffer=NULL; +static bool has_startup=false; +static bool clear_screen=false; +static float scale_factor=1.0f; +static float scale_xc=0.5f; +static float scale_yc=0.5f; +static scale_data_t scale_data={0}; +#define MAX_SCALE_FACTOR 5.0f + +/* font transparent color */ +static TCOD_color_t fontKeyCol={0,0,0}; + +static Uint32 sdl_key=0, rgb_mask=0, nrgb_mask=0; + +/* mouse stuff */ +static bool mousebl=false; +static bool mousebm=false; +static bool mousebr=false; +static bool mouse_force_bl=false; +static bool mouse_force_bm=false; +static bool mouse_force_br=false; +#ifdef TCOD_TOUCH_INPUT +static bool mouse_touch=true; +#endif + +/* minimum length for a frame (when fps are limited) */ +static int min_frame_length=0; +static int min_frame_length_backup=0; +/* number of frames in the last second */ +static int fps=0; +/* current number of frames */ +static int cur_fps=0; +/* length of the last rendering loop */ +static float last_frame_length=0.0f; + +static TCOD_color_t *charcols=NULL; +static bool *first_draw=NULL; +static bool key_status[TCODK_CHAR+1]; +static int oldFade=-1; + +/* convert SDL vk to a char (depends on the keyboard layout) */ +#if SDL_VERSION_ATLEAST(2,0,0) +typedef struct { + SDL_Keycode sdl_key; + int tcod_key; +} vk_to_c_entry; +#define NUM_VK_TO_C_ENTRIES 10 +static vk_to_c_entry vk_to_c[NUM_VK_TO_C_ENTRIES]; +#else +static char vk_to_c[SDLK_LAST]; +#endif + +/* convert ASCII code to TCOD layout position */ +static int init_ascii_to_tcod[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 0, 0, 0, 0, 0, /* ASCII 0 to 15 */ + 71, 70, 72, 0, 0, 0, 0, 0, 64, 65, 67, 66, 0, 73, 68, 69, /* ASCII 16 to 31 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* ASCII 32 to 47 */ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* ASCII 48 to 63 */ + 32, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, /* ASCII 64 to 79 */ +111,112,113,114,115,116,117,118,119,120,121, 33, 34, 35, 36, 37, /* ASCII 80 to 95 */ + 38,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142, /* ASCII 96 to 111 */ +143,144,145,146,147,148,149,150,151,152,153, 39, 40, 41, 42, 0, /* ASCII 112 to 127 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ASCII 128 to 143 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ASCII 144 to 159 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ASCII 160 to 175 */ + 43, 44, 45, 46, 49, 0, 0, 0, 0, 81, 78, 87, 88, 0, 0, 55, /* ASCII 176 to 191 */ + 53, 50, 52, 51, 47, 48, 0, 0, 85, 86, 82, 84, 83, 79, 80, 0, /* ASCII 192 to 207 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 54, 0, 0, 0, 0, 0, /* ASCII 208 to 223 */ + 74, 75, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0, 0, 0, 0, /* ASCII 224 to 239 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ASCII 240 to 255 */ +}; + +static bool *ascii_updated=NULL; +static bool any_ascii_updated=false; + +static void alloc_ascii_tables() { + if ( TCOD_ctx.ascii_to_tcod ) free(TCOD_ctx.ascii_to_tcod); + if ( ascii_updated ) free(ascii_updated); + if ( charcols ) { + free(charcols); + free(first_draw); + } + + TCOD_ctx.ascii_to_tcod = (int *)calloc(sizeof(int),TCOD_ctx.max_font_chars); + ascii_updated = (bool *)calloc(sizeof(bool),TCOD_ctx.max_font_chars); + charcols = (TCOD_color_t *)calloc(sizeof(TCOD_color_t),TCOD_ctx.max_font_chars); + first_draw =(bool *)calloc(sizeof(bool),TCOD_ctx.max_font_chars); + memcpy(TCOD_ctx.ascii_to_tcod,init_ascii_to_tcod,sizeof(int)*256); +} + +static void check_ascii_to_tcod() { + if ( TCOD_ctx.fontNbCharHoriz * TCOD_ctx.fontNbCharVertic != TCOD_ctx.max_font_chars ) { + TCOD_ctx.max_font_chars=TCOD_ctx.fontNbCharHoriz * TCOD_ctx.fontNbCharVertic; + alloc_ascii_tables(); + } +} + +void TCOD_sys_register_SDL_renderer(SDL_renderer_t renderer) { + TCOD_ctx.sdl_cbk=renderer; +} + +void TCOD_sys_map_ascii_to_font(asciiCode, fontCharX, fontCharY) { + if ( asciiCode > 0 && asciiCode < TCOD_ctx.max_font_chars ) + TCOD_ctx.ascii_to_tcod[asciiCode] = fontCharX + fontCharY * TCOD_ctx.fontNbCharHoriz; +} + +void TCOD_sys_load_font() { + int i; + bool hasTransparent=false; + int x,y; + + if ( charmap ) SDL_FreeSurface(charmap); + charmap=TCOD_sys_load_image(TCOD_ctx.font_file); + if (charmap == NULL ) TCOD_fatal("SDL : cannot load %s",TCOD_ctx.font_file); + if ( (float)(charmap->w / TCOD_ctx.fontNbCharHoriz) != charmap->w / TCOD_ctx.fontNbCharHoriz + || (float)(charmap->h / TCOD_ctx.fontNbCharVertic) != charmap->h / TCOD_ctx.fontNbCharVertic ) TCOD_fatal(" %s size is not a multiple of font layout (%dx%d)\n", + TCOD_ctx.font_file,TCOD_ctx.fontNbCharHoriz,TCOD_ctx.fontNbCharVertic); + TCOD_ctx.font_width=charmap->w/TCOD_ctx.fontNbCharHoriz; + TCOD_ctx.font_height=charmap->h/TCOD_ctx.fontNbCharVertic; + /* allocated bool array for colored flags */ + if ( TCOD_ctx.colored ) free(TCOD_ctx.colored); + TCOD_ctx.colored=(bool *)calloc(sizeof(bool), TCOD_ctx.fontNbCharHoriz*TCOD_ctx.fontNbCharVertic); + check_ascii_to_tcod(); + /* figure out what kind of font we have */ + /* check if the alpha layer is actually used */ + if ( charmap->format->BytesPerPixel == 4 ) { + printf ("32bits font... checking for alpha layer... "); + for (x=0; !hasTransparent && x < charmap->w; x ++ ) { + for (y=0;!hasTransparent && y < charmap->h; y++ ) { + Uint8 *pixel=(Uint8 *)(charmap->pixels) + y * charmap->pitch + x * charmap->format->BytesPerPixel; + Uint8 alpha=*((pixel)+charmap->format->Ashift/8); + if ( alpha < 255 ) { + hasTransparent=true; + } + } + } + printf (hasTransparent ? "present\n" : "not present\n"); + } else if ( charmap->format->BytesPerPixel != 3 ) { + /* convert to 24 bits */ + SDL_Surface *temp; + printf ("font bpp < 24. converting to 24bits\n"); + temp=(SDL_Surface *)TCOD_sys_get_surface(charmap->w,charmap->h,false); + SDL_BlitSurface(charmap,NULL,temp,NULL); + SDL_FreeSurface(charmap); + charmap=temp; + } else { + printf ("24 bits font.\n"); + } + if (! hasTransparent ) { + /* alpha layer not used */ + int keyx,keyy; + Uint8 *pixel; + /* the key color is found on the character corresponding to space ' ' */ + if ( TCOD_ctx.font_tcod_layout ) { + keyx = TCOD_ctx.font_width/2; + keyy = TCOD_ctx.font_height/2; + } else if (TCOD_ctx.font_in_row) { + keyx = ((int)(' ') % TCOD_ctx.fontNbCharHoriz ) * TCOD_ctx.font_width + TCOD_ctx.font_width/2; + keyy = ((int)(' ') / TCOD_ctx.fontNbCharHoriz ) * TCOD_ctx.font_height + TCOD_ctx.font_height/2; + } else { + keyx = ((int)(' ') / TCOD_ctx.fontNbCharVertic ) * TCOD_ctx.font_width + TCOD_ctx.font_width/2; + keyy = ((int)(' ') % TCOD_ctx.fontNbCharVertic ) * TCOD_ctx.font_height + TCOD_ctx.font_height/2; + } + pixel=(Uint8 *)(charmap->pixels) + keyy * charmap->pitch + keyx * charmap->format->BytesPerPixel; + fontKeyCol.r=*((pixel)+charmap->format->Rshift/8); + fontKeyCol.g=*((pixel)+charmap->format->Gshift/8); + fontKeyCol.b=*((pixel)+charmap->format->Bshift/8); + printf ("key color : %d %d %d\n",fontKeyCol.r,fontKeyCol.g,fontKeyCol.b); + if ( ! TCOD_ctx.font_greyscale && charmap->format->BytesPerPixel == 4 ) { + /* 32 bits font but alpha layer not used. convert to 24 bits (faster) */ + SDL_Surface *temp; + printf ("32bits font with no alpha => converting to faster 24 bits\n"); + temp=(SDL_Surface *)TCOD_sys_get_surface(charmap->w,charmap->h,false); + SDL_BlitSurface(charmap,NULL,temp,NULL); + SDL_FreeSurface(charmap); + charmap=temp; + } + } + /* detect colored tiles */ + for (i=0; i < TCOD_ctx.fontNbCharHoriz*TCOD_ctx.fontNbCharVertic; i++ ) { + int px,py,cx,cy; + bool end=false; + cx=(i%TCOD_ctx.fontNbCharHoriz); + cy=(i/TCOD_ctx.fontNbCharHoriz); + for( px=0; !end && px < TCOD_ctx.font_width; px++ ) { + for (py=0; !end && py < TCOD_ctx.font_height; py++ ) { + Uint8 *pixel=(Uint8 *)(charmap->pixels) + (cy*TCOD_ctx.font_height+py) * charmap->pitch + + (cx*TCOD_ctx.font_width+px) * charmap->format->BytesPerPixel; + Uint8 r=*((pixel)+charmap->format->Rshift/8); + Uint8 g=*((pixel)+charmap->format->Gshift/8); + Uint8 b=*((pixel)+charmap->format->Bshift/8); + if ( charmap->format->BytesPerPixel == 3 ) { + /* ignore key color */ + if ( r == fontKeyCol.r && g == fontKeyCol.g && b == fontKeyCol.b ) continue; + } + /* colored tile if a pixel is not desaturated */ + if ( r != g || g !=b || b != r ) { + TCOD_ctx.colored[i]=true; + printf ("character for ascii code %d is colored\n",i); + end=true; + } + } + } + } + /* convert 24/32 bits greyscale to 32bits font with alpha layer */ + if ( ! hasTransparent && TCOD_ctx.font_greyscale ) { + bool invert=( fontKeyCol.r > 128 ); /* black on white font ? */ + /* convert the surface to 32 bits if needed */ + if ( charmap->format->BytesPerPixel != 4 ) { + SDL_Surface *temp; + printf("24bits greyscale font. converting to 32bits\n"); + temp=(SDL_Surface *)TCOD_sys_get_surface(charmap->w,charmap->h,true); + SDL_BlitSurface(charmap,NULL,temp,NULL); + SDL_FreeSurface(charmap); + charmap=temp; + } + for (i=0; i < TCOD_ctx.fontNbCharHoriz*TCOD_ctx.fontNbCharVertic; i++ ) { + int cx,cy; + cx=(i%TCOD_ctx.fontNbCharHoriz); + cy=(i/TCOD_ctx.fontNbCharHoriz); + /* fill the surface with white (except colored tiles), use alpha layer for characters */ + for (x=cx*TCOD_ctx.font_width; x < (cx+1)*TCOD_ctx.font_width; x ++ ) { + for (y=cy*TCOD_ctx.font_height;y < (cy+1)*TCOD_ctx.font_height; y++ ) { + if ( ! TCOD_ctx.colored[i]) { + Uint8 *pixel=(Uint8 *)(charmap->pixels) + y * charmap->pitch + x * charmap->format->BytesPerPixel; + Uint8 r=*((pixel)+charmap->format->Rshift/8); + *((pixel)+charmap->format->Ashift/8) = (invert ? 255-r : r); + *((pixel)+charmap->format->Rshift/8)=255; + *((pixel)+charmap->format->Gshift/8)=255; + *((pixel)+charmap->format->Bshift/8)=255; + } else { + Uint8 *pixel=(Uint8 *)(charmap->pixels) + y * charmap->pitch + x * charmap->format->BytesPerPixel; + Uint8 r=*((pixel)+charmap->format->Rshift/8); + Uint8 g=*((pixel)+charmap->format->Gshift/8); + Uint8 b=*((pixel)+charmap->format->Bshift/8); + if ( r == fontKeyCol.r && g == fontKeyCol.g && b == fontKeyCol.b ) { + *((pixel)+charmap->format->Ashift/8) = 0; + } else { + *((pixel)+charmap->format->Ashift/8) = 255; + } + } + } + } + } + } + sdl_key=SDL_MapRGB(charmap->format,fontKeyCol.r,fontKeyCol.g,fontKeyCol.b); + rgb_mask=charmap->format->Rmask|charmap->format->Gmask|charmap->format->Bmask; + nrgb_mask = ~ rgb_mask; + sdl_key &= rgb_mask; /* remove the alpha part */ +#if SDL_VERSION_ATLEAST(2,0,0) + if ( charmap->format->BytesPerPixel == 3 ) SDL_SetColorKey(charmap,SDL_TRUE|SDL_RLEACCEL,sdl_key); +#else + if ( charmap->format->BytesPerPixel == 3 ) SDL_SetColorKey(charmap,SDL_SRCCOLORKEY|SDL_RLEACCEL,sdl_key); +#endif + for (i=0; i < TCOD_ctx.fontNbCharHoriz*TCOD_ctx.fontNbCharVertic; i++ ) { + charcols[i]=fontKeyCol; + first_draw[i]=true; + } + check_ascii_to_tcod(); + if (!TCOD_ctx.font_tcod_layout) { + /* apply standard ascii mapping */ + if ( TCOD_ctx.font_in_row ) { + /* for font in row */ + for (i=0; i < TCOD_ctx.max_font_chars; i++ ) TCOD_ctx.ascii_to_tcod[i]=i; + } else { + /* for font in column */ + for (i=0; i < TCOD_ctx.max_font_chars; i++ ) { + int fy = i % TCOD_ctx.fontNbCharVertic; + int fx = i / TCOD_ctx.fontNbCharVertic; + TCOD_ctx.ascii_to_tcod[i]=fx + fy * TCOD_ctx.fontNbCharHoriz; + } + } + } +} + +void TCOD_sys_set_custom_font(const char *fontFile,int nb_ch, int nb_cv, int flags) { + strcpy(TCOD_ctx.font_file,fontFile); + /* if layout not defined, assume ASCII_INCOL */ + if (flags == 0 || flags == TCOD_FONT_TYPE_GREYSCALE) flags |= TCOD_FONT_LAYOUT_ASCII_INCOL; + TCOD_ctx.font_in_row=((flags & TCOD_FONT_LAYOUT_ASCII_INROW) != 0); + TCOD_ctx.font_greyscale = ((flags & TCOD_FONT_TYPE_GREYSCALE) != 0 ); + TCOD_ctx.font_tcod_layout = ((flags & TCOD_FONT_LAYOUT_TCOD) != 0 ); + if ( nb_ch> 0 ) { + TCOD_ctx.fontNbCharHoriz=nb_ch; + TCOD_ctx.fontNbCharVertic=nb_cv; + } else { + if ( ( flags & TCOD_FONT_LAYOUT_ASCII_INROW ) || ( flags & TCOD_FONT_LAYOUT_ASCII_INCOL ) ) { + TCOD_ctx.fontNbCharHoriz=16; + TCOD_ctx.fontNbCharVertic=16; + } else { + TCOD_ctx.fontNbCharHoriz=32; + TCOD_ctx.fontNbCharVertic=8; + } + } + if ( TCOD_ctx.font_tcod_layout ) TCOD_ctx.font_in_row=true; + check_ascii_to_tcod(); + /* + screw up things on linux64. apparently, useless + TCOD_sys_load_font(); + */ +} + +static void find_resolution() { +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_DisplayMode wantedmode, closestmode; +#else + SDL_Rect **modes; + int i; +#endif + int bestw,besth,wantedw,wantedh; + wantedw=TCOD_ctx.fullscreen_width>TCOD_ctx.root->w*TCOD_ctx.font_width?TCOD_ctx.fullscreen_width:TCOD_ctx.root->w*TCOD_ctx.font_width; + wantedh=TCOD_ctx.fullscreen_height>TCOD_ctx.root->h*TCOD_ctx.font_height?TCOD_ctx.fullscreen_height:TCOD_ctx.root->h*TCOD_ctx.font_height; + TCOD_ctx.actual_fullscreen_width=wantedw; + TCOD_ctx.actual_fullscreen_height=wantedh; + +#if SDL_VERSION_ATLEAST(2,0,0) + wantedmode.w = wantedw; + wantedmode.h = wantedh; + wantedmode.format = 0; /* don't care for rest. */ + wantedmode.refresh_rate = 0; + wantedmode.driverdata = 0; + if (SDL_GetClosestDisplayMode(window?SDL_GetWindowDisplayIndex(window):0, &wantedmode, &closestmode) == &closestmode) { + bestw=closestmode.w; + besth=closestmode.h; + } else { + bestw=99999; + besth=99999; + } +#else + modes=SDL_ListModes(NULL, SDL_FULLSCREEN); + + bestw=99999; + besth=99999; + if(modes != (SDL_Rect **)0 && modes != (SDL_Rect **)-1){ + for(i=0;modes[i];++i) { + if (modes[i]->w >= wantedw && modes[i]->w <= bestw + && modes[i]->h >= wantedh && modes[i]->h <= besth + && SDL_VideoModeOK(modes[i]->w, modes[i]->h, 32, SDL_FULLSCREEN)) { + bestw=modes[i]->w; + besth=modes[i]->h; + } + } + } +#endif + if ( bestw != 99999) { + TCOD_ctx.actual_fullscreen_width=bestw; + TCOD_ctx.actual_fullscreen_height=besth; + } +} + +void *TCOD_sys_create_bitmap_for_console(TCOD_console_t console) { + int w,h; + w = TCOD_console_get_width(console) * TCOD_ctx.font_width; + h = TCOD_console_get_height(console) * TCOD_ctx.font_height; + return TCOD_sys_get_surface(w,h,false); +} + +/* + * Separate out the actual rendering, so that render to texture can be done. + */ +static void actual_rendering() { + SDL_Rect srcRect, dstRect; +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_Texture *texture; +#endif + + if (scale_data.min_scale_factor - 1e-3f > scale_factor) { + /* Prepare for the unscaled and centered copy of the entire console. */ + srcRect.x=0; srcRect.y=0; srcRect.w=scale_screen->w; srcRect.h=scale_screen->h; + if (TCOD_ctx.fullscreen) { + dstRect.x=TCOD_ctx.fullscreen_offsetx; dstRect.y=TCOD_ctx.fullscreen_offsety; + } else { + dstRect.x=0; dstRect.y=0; + } + dstRect.w=scale_screen->w; dstRect.h=scale_screen->h; + } else { + /* Prepare for the scaled copy of the displayed console area. */ + srcRect.x=scale_data.src_x0; srcRect.y=scale_data.src_y0; srcRect.w=scale_data.src_copy_width; srcRect.h=scale_data.src_copy_height; + dstRect.x=scale_data.dst_offset_x; dstRect.y=scale_data.dst_offset_y; + dstRect.w=scale_data.dst_display_width; dstRect.h=scale_data.dst_display_height; + } +#if SDL_VERSION_ATLEAST(2,0,0) + texture = SDL_CreateTextureFromSurface(renderer, scale_screen); + SDL_RenderCopy(renderer, texture, &srcRect, &dstRect); + SDL_DestroyTexture(texture); +#else + SDL_SoftStretch(scale_screen, &srcRect, screen, &dstRect); +#endif + + if ( TCOD_ctx.sdl_cbk ) { +#if SDL_VERSION_ATLEAST(2,0,0) + TCOD_ctx.sdl_cbk((void *)renderer); +#else + TCOD_ctx.sdl_cbk((void *)screen); +#endif + } +} + +/* In order to avoid rendering race conditions and the ensuing segmentation + * faults, this should only be called when it would normally be and not + * specifically to force screen refreshes. To this end, and to avoid + * threading complications it takes care of special cases internally. */ +static void TCOD_sys_render(void *vbitmap, int console_width, int console_height, char_t *console_buffer, char_t *prev_console_buffer) { + char_t *prev_console_buffer_ptr = prev_console_buffer; + if ( TCOD_ctx.renderer == TCOD_RENDERER_SDL ) { + if (vbitmap == NULL) { + int console_width_p = console_width*TCOD_ctx.font_width; + int console_height_p = console_height*TCOD_ctx.font_height; + + /* Make a bitmap of exact rendering size and correct format. */ + if (scale_screen == NULL) { + int bpp; + Uint32 rmask, gmask, bmask, amask; +#if SDL_VERSION_ATLEAST(2,0,0) + if (SDL_PixelFormatEnumToMasks(SDL_GetWindowPixelFormat(window), &bpp, &rmask, &gmask, &bmask, &amask) == SDL_FALSE) { + TCOD_fatal("SDL : failed to create scaling surface : indeterminate window pixel format"); + return; + } +#else + SDL_PixelFormat *fmt = screen->format; + bpp=fmt->BitsPerPixel; rmask=fmt->Rmask; gmask=fmt->Gmask; bmask=fmt->Bmask; amask=fmt->Amask; +#endif + scale_screen=SDL_CreateRGBSurface(SDL_SWSURFACE,console_width_p,console_height_p,bpp,rmask,gmask,bmask,amask); + if (scale_screen == NULL) { + TCOD_fatal("SDL : failed to create scaling surface"); + return; + } + } else if (clear_screen) { + clear_screen=false; + SDL_FillRect(scale_screen,0,0); + /* Implicitly do complete console redraw, not just tracked changes. */ + prev_console_buffer_ptr = NULL; + } + + TCOD_sys_console_to_bitmap(scale_screen, console_width, console_height, console_buffer, prev_console_buffer_ptr); + + /* Scale the rendered bitmap to the screen, preserving aspect ratio, and blit it. + * This data is also used for console coordinate resolution.. */ + if (scale_data.last_scale_factor != scale_factor || scale_data.last_scale_xc != scale_xc || scale_data.last_scale_yc != scale_yc || + scale_data.last_fullscreen != TCOD_ctx.fullscreen || scale_data.force_recalc) { + /* Preserve old value of input variables, to enable recalculation if they change. */ + scale_data.last_scale_factor = scale_factor; + scale_data.last_scale_xc = scale_xc; + scale_data.last_scale_yc = scale_yc; + scale_data.last_fullscreen = TCOD_ctx.fullscreen; + scale_data.force_recalc = 0; + + if (scale_data.last_fullscreen) { + scale_data.surface_width = TCOD_ctx.actual_fullscreen_width; + scale_data.surface_height = TCOD_ctx.actual_fullscreen_height; + } else { + scale_data.surface_width = console_width_p; + scale_data.surface_height = console_height_p; + } + scale_data.min_scale_factor = MAX((float)console_width_p/scale_data.surface_width, (float)console_height_p/scale_data.surface_height); + if (scale_data.min_scale_factor > 1.0f) + scale_data.min_scale_factor = 1.0f; + /*printf("min_scale_factor %0.3f = MAX(%d/%d, %d/%d)", scale_data.min_scale_factor, console_width_p, scale_data.surface_width, console_height_p, scale_data.surface_height);*/ + + scale_data.dst_height_width_ratio = (float)scale_data.surface_height/scale_data.surface_width; + scale_data.src_proportionate_width = (int)(console_width_p / scale_factor); + scale_data.src_proportionate_height = (int)((console_width_p * scale_data.dst_height_width_ratio) / scale_factor); + + /* Work out how much of the console to copy. */ + scale_data.src_x0 = (scale_xc * console_width_p) - (0.5f * scale_data.src_proportionate_width); + if (scale_data.src_x0 + scale_data.src_proportionate_width > console_width_p) + scale_data.src_x0 = console_width_p - scale_data.src_proportionate_width; + if (scale_data.src_x0 < 0) + scale_data.src_x0 = 0; + scale_data.src_copy_width = scale_data.src_proportionate_width; + if (scale_data.src_x0 + scale_data.src_copy_width > console_width_p) + scale_data.src_copy_width = console_width_p - scale_data.src_x0; + + scale_data.src_y0 = (scale_yc * console_height_p) - (0.5f * scale_data.src_proportionate_height); + if (scale_data.src_y0 + scale_data.src_proportionate_height > console_height_p) + scale_data.src_y0 = console_height_p - scale_data.src_proportionate_height; + if (scale_data.src_y0 < 0) + scale_data.src_y0 = 0; + scale_data.src_copy_height = scale_data.src_proportionate_height; + if (scale_data.src_y0 + scale_data.src_copy_height > console_height_p) + scale_data.src_copy_height = console_height_p - scale_data.src_y0; + + scale_data.dst_display_width = (scale_data.src_copy_width * scale_data.surface_width) / scale_data.src_proportionate_width; + scale_data.dst_display_height = (scale_data.src_copy_height * scale_data.surface_height) / scale_data.src_proportionate_height; + scale_data.dst_offset_x = (scale_data.surface_width - scale_data.dst_display_width)/2; + scale_data.dst_offset_y = (scale_data.surface_height - scale_data.dst_display_height)/2; + } + +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_RenderClear(renderer); +#endif + actual_rendering(); + } else { + TCOD_sys_console_to_bitmap(vbitmap, console_width, console_height, console_buffer, prev_console_buffer_ptr); + if ( TCOD_ctx.sdl_cbk ) { +#if SDL_VERSION_ATLEAST(2,0,0) + TCOD_ctx.sdl_cbk((void *)renderer); +#else + TCOD_ctx.sdl_cbk((void *)screen); +#endif + } + } +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_RenderPresent(renderer); +#else + SDL_Flip(screen); +#endif + } +#ifndef NO_OPENGL + else { + TCOD_opengl_render(oldFade, ascii_updated, console_buffer, prev_console_buffer); + TCOD_opengl_swap(); + } +#endif + oldFade=(int)TCOD_console_get_fade(); + if ( any_ascii_updated ) { + memset(ascii_updated,0,sizeof(bool)*TCOD_ctx.max_font_chars); + any_ascii_updated=false; + } +} + +void TCOD_sys_console_to_bitmap(void *vbitmap, int console_width, int console_height, char_t *console_buffer, char_t *prev_console_buffer) { + static SDL_Surface *charmap_backup=NULL; + int x,y; + SDL_Surface *bitmap=(SDL_Surface *)vbitmap; + Uint32 sdl_back=0,sdl_fore=0; + TCOD_color_t fading_color = TCOD_console_get_fading_color(); + int fade = (int)TCOD_console_get_fade(); + bool track_changes=(oldFade == fade && prev_console_buffer); + Uint8 bpp = charmap->format->BytesPerPixel; + char_t *c=&console_buffer[0]; + char_t *oc=&prev_console_buffer[0]; + int hdelta; + if ( bpp == 4 ) { + hdelta=(charmap->pitch - TCOD_ctx.font_width*bpp)/4; + } else { + hdelta=(charmap->pitch - TCOD_ctx.font_width*bpp); + } + if ( charmap_backup == NULL ) { + charmap_backup=(SDL_Surface *)TCOD_sys_get_surface(charmap->w,charmap->h,true); + SDL_BlitSurface(charmap,NULL,charmap_backup,NULL); + } +#ifdef USE_SDL_LOCKS + if ( SDL_MUSTLOCK( bitmap ) && SDL_LockSurface( bitmap ) < 0 ) return; +#endif + for (y=0;ycf == -1 ) c->cf = TCOD_ctx.ascii_to_tcod[c->c]; + if ( track_changes ) { + changed=false; + if ( c->dirt || ascii_updated[ c->c ] || c->back.r != oc->back.r || c->back.g != oc->back.g + || c->back.b != oc->back.b || c->fore.r != oc->fore.r + || c->fore.g != oc->fore.g || c->fore.b != oc->fore.b + || c->c != oc->c || c->cf != oc->cf) { + changed=true; + } + } + c->dirt=0; + if ( changed ) { + TCOD_color_t b=c->back; + dstRect.x=x*TCOD_ctx.font_width; + dstRect.y=y*TCOD_ctx.font_height; + dstRect.w=TCOD_ctx.font_width; + dstRect.h=TCOD_ctx.font_height; + /* draw background */ + if ( fade != 255 ) { + b.r = ((int)b.r) * fade / 255 + ((int)fading_color.r) * (255-fade)/255; + b.g = ((int)b.g) * fade / 255 + ((int)fading_color.g) * (255-fade)/255; + b.b = ((int)b.b) * fade / 255 + ((int)fading_color.b) * (255-fade)/255; + } + sdl_back=SDL_MapRGB(bitmap->format,b.r,b.g,b.b); +#if SDL_VERSION_ATLEAST(2,0,0) +#else + if ( bitmap == screen && TCOD_ctx.fullscreen ) { + dstRect.x+=TCOD_ctx.fullscreen_offsetx; + dstRect.y+=TCOD_ctx.fullscreen_offsety; + } +#endif + SDL_FillRect(bitmap,&dstRect,sdl_back); + if ( c->c != ' ' ) { + /* draw foreground */ + int ascii=c->cf; + TCOD_color_t *curtext = &charcols[ascii]; + bool first = first_draw[ascii]; + TCOD_color_t f=c->fore; + + if ( fade != 255 ) { + f.r = ((int)f.r) * fade / 255 + ((int)fading_color.r) * (255-fade)/255; + f.g = ((int)f.g) * fade / 255 + ((int)fading_color.g) * (255-fade)/255; + f.b = ((int)f.b) * fade / 255 + ((int)fading_color.b) * (255-fade)/255; + } + /* only draw character if foreground color != background color */ + if ( ascii_updated[c->c] || f.r != b.r || f.g != b.g || f.b != b.b ) { + if ( charmap->format->Amask == 0 + && f.r == fontKeyCol.r && f.g == fontKeyCol.g && f.b == fontKeyCol.b ) { + /* cannot draw with the key color... */ + if ( f.r < 255 ) f.r++; else f.r--; + } + srcRect.x = (ascii%TCOD_ctx.fontNbCharHoriz)*TCOD_ctx.font_width; + srcRect.y = (ascii/TCOD_ctx.fontNbCharHoriz)*TCOD_ctx.font_height; + srcRect.w=TCOD_ctx.font_width; + srcRect.h=TCOD_ctx.font_height; + + if ( charmap && (first || curtext->r != f.r || curtext->g != f.g || curtext->b!=f.b) ) { + /* change the character color in the font */ + first_draw[ascii]=false; + sdl_fore=SDL_MapRGB(charmap->format,f.r,f.g,f.b) & rgb_mask; + *curtext=f; +#ifdef USE_SDL_LOCKS + if ( SDL_MUSTLOCK(charmap) ) { + if ( SDL_LockSurface(charmap) < 0 ) return; + } +#endif + if ( bpp == 4 ) { + /* 32 bits font : fill the whole character with foreground color */ + Uint32 *pix = (Uint32 *)(((Uint8 *)charmap->pixels)+srcRect.x*bpp + srcRect.y*charmap->pitch); + int h=TCOD_ctx.font_height; + if ( ! TCOD_ctx.colored[ascii] ) { + while ( h-- ) { + int w=TCOD_ctx.font_width; + while ( w-- ) { + (*pix) &= nrgb_mask; + (*pix) |= sdl_fore; + pix++; + } + pix += hdelta; + } + } else { + /* colored character : multiply color with foreground color */ + Uint32 *pixorig = (Uint32 *)(((Uint8 *)charmap_backup->pixels)+srcRect.x*bpp + srcRect.y*charmap_backup->pitch); + int hdelta_backup=(charmap_backup->pitch - TCOD_ctx.font_width*4)/4; + while (h> 0) { + int w=TCOD_ctx.font_width; + while ( w > 0 ) { + int r=(int)(*((Uint8 *)(pixorig)+charmap_backup->format->Rshift/8)); + int g=(int)(*((Uint8 *)(pixorig)+charmap_backup->format->Gshift/8)); + int b=(int)(*((Uint8 *)(pixorig)+charmap_backup->format->Bshift/8)); + (*pix) &= nrgb_mask; /* erase the color */ + r = r * f.r / 255; + g = g * f.g / 255; + b = b * f.b / 255; + /* set the new color */ + (*pix) |= (r<format->Rshift)|(g<format->Gshift)|(b<format->Bshift); + w--; + pix++; + pixorig++; + } + h--; + pix += hdelta; + pixorig += hdelta_backup; + } + } + } else { + /* 24 bits font : fill only non key color pixels */ + Uint32 *pix = (Uint32 *)(((Uint8 *)charmap->pixels)+srcRect.x*bpp + srcRect.y*charmap->pitch); + int h=TCOD_ctx.font_height; + if ( ! TCOD_ctx.colored[ascii] ) { + while ( h-- ) { + int w=TCOD_ctx.font_width; + while ( w-- ) { + if (((*pix) & rgb_mask) != sdl_key ) { + (*pix) &= nrgb_mask; + (*pix) |= sdl_fore; + } + pix = (Uint32 *) (((Uint8 *)pix)+3); + } + pix = (Uint32 *) (((Uint8 *)pix)+hdelta); + } + } else { + /* colored character : multiply color with foreground color */ + Uint32 *pixorig = (Uint32 *)(((Uint8 *)charmap_backup->pixels)+srcRect.x*4 + srcRect.y*charmap_backup->pitch); + /* charmap_backup is always 32 bits */ + int hdelta_backup=(charmap_backup->pitch - TCOD_ctx.font_width*4)/4; + while (h> 0) { + int w=TCOD_ctx.font_width; + while ( w > 0 ) { + if (((*pixorig) & rgb_mask) != sdl_key ) { + int r=(int)(*((Uint8 *)(pixorig)+charmap_backup->format->Rshift/8)); + int g=(int)(*((Uint8 *)(pixorig)+charmap_backup->format->Gshift/8)); + int b=(int)(*((Uint8 *)(pixorig)+charmap_backup->format->Bshift/8)); + (*pix) &= nrgb_mask; /* erase the color */ + r = r * f.r / 255; + g = g * f.g / 255; + b = b * f.b / 255; + /* set the new color */ + (*pix) |= (r<format->Rshift)|(g<format->Gshift)|(b<format->Bshift); + } + w--; + pix = (Uint32 *) (((Uint8 *)pix)+3); + pixorig ++; + } + h--; + pix = (Uint32 *) (((Uint8 *)pix)+hdelta); + pixorig += hdelta_backup; + } + } + } +#ifdef USE_SDL_LOCKS + if ( SDL_MUSTLOCK(charmap) ) { + SDL_UnlockSurface(charmap); + } +#endif + } + SDL_BlitSurface(charmap,&srcRect,bitmap,&dstRect); + } + } + } + c++;oc++; + } + } +#ifdef USE_SDL_LOCKS + if ( SDL_MUSTLOCK( bitmap ) ) SDL_UnlockSurface( bitmap ); +#endif +} + +void TCOD_sys_set_keyboard_repeat(int initial_delay, int interval) { +#if !SDL_VERSION_ATLEAST(2,0,0) + SDL_EnableKeyRepeat(initial_delay,interval); +#endif +} + +void *TCOD_sys_get_surface(int width, int height, bool alpha) { + Uint32 rmask,gmask,bmask,amask; + SDL_Surface *bitmap; + int flags=SDL_SWSURFACE; + + if ( alpha ) { + if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) { + rmask=0x000000FF; + gmask=0x0000FF00; + bmask=0x00FF0000; + amask=0xFF000000; + } else { + rmask=0xFF000000; + gmask=0x00FF0000; + bmask=0x0000FF00; + amask=0x000000FF; + } +#if !SDL_VERSION_ATLEAST(2,0,0) + flags|=SDL_SRCALPHA; +#endif + } else { + if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) { + rmask=0x0000FF; + gmask=0x00FF00; + bmask=0xFF0000; + } else { + rmask=0xFF0000; + gmask=0x00FF00; + bmask=0x0000FF; + } + amask=0; + } +#if SDL_VERSION_ATLEAST(2,0,0) + bitmap=SDL_CreateRGBSurface(flags,width,height, +#else + bitmap=SDL_AllocSurface(flags,width,height, +#endif + alpha ? 32:24, + rmask,gmask,bmask,amask); + if ( alpha ) { +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_SetSurfaceAlphaMod(bitmap, 255); +#else + SDL_SetAlpha(bitmap, SDL_SRCALPHA, 255); +#endif + } + return (void *)bitmap; +} + +void TCOD_sys_update_char(int asciiCode, int fontx, int fonty, TCOD_image_t img, int x, int y) { + int px,py; + int iw,ih; + static TCOD_color_t pink={255,0,255}; + TCOD_sys_map_ascii_to_font(asciiCode,fontx,fonty); + TCOD_image_get_size(img,&iw,&ih); + for (px=0; px < TCOD_ctx.font_width; px ++ ) { + for (py=0;py < TCOD_ctx.font_height; py++ ) { + TCOD_color_t col=TCOD_white; + Uint8 *pixel; + Uint8 bpp; + if ( (unsigned)(x+px) < (unsigned)iw && (unsigned)(y+py) < (unsigned)ih ) { + col=TCOD_image_get_pixel(img,x+px,y+py); + } + pixel=(Uint8 *)(charmap->pixels) + (fonty*TCOD_ctx.font_height+py) * charmap->pitch + (fontx*TCOD_ctx.font_width+px) * charmap->format->BytesPerPixel; + bpp = charmap->format->BytesPerPixel; + if (bpp == 4 ) { + *((pixel)+charmap->format->Ashift/8) = col.r; + *((pixel)+charmap->format->Rshift/8)=255; + *((pixel)+charmap->format->Gshift/8)=255; + *((pixel)+charmap->format->Bshift/8)=255; + } else { + *((pixel)+charmap->format->Rshift/8)=col.r; + *((pixel)+charmap->format->Gshift/8)=col.g; + *((pixel)+charmap->format->Bshift/8)=col.b; + } + } + } + /* TODO : improve this. */ + charcols[asciiCode]=pink; + ascii_updated[asciiCode]=true; + any_ascii_updated=true; +} + +#ifdef TCOD_MACOSX +void CustomSDLMain(); +#endif + +void TCOD_sys_startup() { + if (has_startup) return; +#ifdef TCOD_MACOSX + CustomSDLMain(); +#endif +#if SDL_VERSION_ATLEAST(2,0,0) +#ifndef NDEBUG + SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE); +#endif +#endif + TCOD_IFNOT(SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) >= 0 ) return; +#ifndef TCOD_WINDOWS + /* not needed and might crash on windows */ + atexit(SDL_Quit); +#endif +#if !SDL_VERSION_ATLEAST(2,0,0) + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL); +#endif + TCOD_ctx.max_font_chars=256; + alloc_ascii_tables(); +#ifndef NO_OPENGL + TCOD_opengl_init_attributes(); +#endif + + has_startup=true; +} + +static void TCOD_sys_load_player_config() { + const char *renderer; + const char *font; + int fullscreenWidth,fullscreenHeight; + + /* define file structure */ + TCOD_parser_t parser=TCOD_parser_new(); + TCOD_parser_struct_t libtcod = TCOD_parser_new_struct(parser, "libtcod"); + TCOD_struct_add_property(libtcod, "renderer", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(libtcod, "font", TCOD_TYPE_STRING, false); + TCOD_struct_add_property(libtcod, "fontInRow", TCOD_TYPE_BOOL, false); + TCOD_struct_add_property(libtcod, "fontGreyscale", TCOD_TYPE_BOOL, false); + TCOD_struct_add_property(libtcod, "fontTcodLayout", TCOD_TYPE_BOOL, false); + TCOD_struct_add_property(libtcod, "fontNbCharHoriz", TCOD_TYPE_INT, false); + TCOD_struct_add_property(libtcod, "fontNbCharVertic", TCOD_TYPE_INT, false); + TCOD_struct_add_property(libtcod, "fullscreen", TCOD_TYPE_BOOL, false); + TCOD_struct_add_property(libtcod, "fullscreenWidth", TCOD_TYPE_INT, false); + TCOD_struct_add_property(libtcod, "fullscreenHeight", TCOD_TYPE_INT, false); + TCOD_struct_add_property(libtcod, "fullscreenScaling", TCOD_TYPE_BOOL, false); + + /* parse file */ + TCOD_parser_run(parser,"./libtcod.cfg",NULL); + + /* set user preferences */ + renderer=TCOD_parser_get_string_property(parser, "libtcod.renderer"); + if ( renderer != NULL ) { + /* custom renderer */ + if ( TCOD_strcasecmp(renderer,"GLSL") == 0 ) TCOD_ctx.renderer=TCOD_RENDERER_GLSL; + else if ( TCOD_strcasecmp(renderer,"OPENGL") == 0 ) TCOD_ctx.renderer=TCOD_RENDERER_OPENGL; + else if ( TCOD_strcasecmp(renderer,"SDL") == 0 ) TCOD_ctx.renderer=TCOD_RENDERER_SDL; + else printf ("Warning : unknown renderer '%s' in libtcod.cfg\n", renderer); + } + font=TCOD_parser_get_string_property(parser, "libtcod.font"); + if ( font != NULL ) { + /* custom font */ + if ( TCOD_sys_file_exists(font)) { + int fontNbCharHoriz,fontNbCharVertic; + strcpy(TCOD_ctx.font_file,font); + TCOD_ctx.font_in_row=TCOD_parser_get_bool_property(parser,"libtcod.fontInRow"); + TCOD_ctx.font_greyscale=TCOD_parser_get_bool_property(parser,"libtcod.fontGreyscale"); + TCOD_ctx.font_tcod_layout=TCOD_parser_get_bool_property(parser,"libtcod.fontTcodLayout"); + fontNbCharHoriz=TCOD_parser_get_int_property(parser,"libtcod.fontNbCharHoriz"); + fontNbCharVertic=TCOD_parser_get_int_property(parser,"libtcod.fontNbCharVertic"); + if ( fontNbCharHoriz > 0 ) TCOD_ctx.fontNbCharHoriz=fontNbCharHoriz; + if ( fontNbCharVertic > 0 ) TCOD_ctx.fontNbCharVertic=fontNbCharVertic; + if ( charmap ) { + SDL_FreeSurface(charmap); + charmap=NULL; + } + } else { + printf ("Warning : font file '%s' does not exist\n",font); + } + } + /* custom fullscreen resolution */ + TCOD_ctx.fullscreen=TCOD_parser_get_bool_property(parser,"libtcod.fullscreen"); + fullscreenWidth=TCOD_parser_get_int_property(parser,"libtcod.fullscreenWidth"); + fullscreenHeight=TCOD_parser_get_int_property(parser,"libtcod.fullscreenHeight"); + if ( fullscreenWidth > 0 ) TCOD_ctx.fullscreen_width=fullscreenWidth; + if ( fullscreenHeight > 0 ) TCOD_ctx.fullscreen_height=fullscreenHeight; +} + + +TCOD_renderer_t TCOD_sys_get_renderer() { + return TCOD_ctx.renderer; +} + +void TCOD_sys_set_renderer(TCOD_renderer_t renderer) { + if ( renderer == TCOD_ctx.renderer ) return; + TCOD_ctx.renderer=renderer; +#if SDL_VERSION_ATLEAST(2,0,0) + if ( window ) { +#else + if ( screen ) { +#endif + TCOD_sys_term(); + } + TCOD_sys_init(TCOD_ctx.root->w,TCOD_ctx.root->h,TCOD_ctx.root->buf,TCOD_ctx.root->oldbuf,TCOD_ctx.fullscreen); + TCOD_console_set_window_title(TCOD_ctx.window_title); + TCOD_console_set_dirty(0,0,TCOD_ctx.root->w,TCOD_ctx.root->h); +} + +static void TCOD_sys_init_screen_offset() { + TCOD_ctx.fullscreen_offsetx=(TCOD_ctx.actual_fullscreen_width-TCOD_ctx.root->w*TCOD_ctx.font_width)/2; + TCOD_ctx.fullscreen_offsety=(TCOD_ctx.actual_fullscreen_height-TCOD_ctx.root->h*TCOD_ctx.font_height)/2; + printf("fullscreen offset : %d %d\n",TCOD_ctx.fullscreen_offsetx,TCOD_ctx.fullscreen_offsety); +} + +bool TCOD_sys_init(int w,int h, char_t *buf, char_t *oldbuf, bool fullscreen) { + static TCOD_renderer_t last_renderer=TCOD_RENDERER_SDL; + static char last_font[512]=""; +#if SDL_VERSION_ATLEAST(2,0,0) + Uint32 winflags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL; +#endif + if ( ! has_startup ) TCOD_sys_startup(); + /* check if there is a user (player) config file */ + if ( TCOD_sys_file_exists("./libtcod.cfg")) { + /* yes, read it */ + TCOD_sys_load_player_config(); + if (TCOD_ctx.fullscreen) fullscreen=true; + } +#if SDL_VERSION_ATLEAST(2,0,0) && defined(TCOD_ANDROID) + /* Android should always be fullscreen. */ + TCOD_ctx.fullscreen = fullscreen = true; +#endif + if (last_renderer != TCOD_ctx.renderer || ! charmap || strcmp(last_font,TCOD_ctx.font_file) != 0) { + /* reload the font when switching renderer to restore original character colors */ + TCOD_sys_load_font(); + } + if ( fullscreen ) { + find_resolution(); +#ifndef NO_OPENGL + if (TCOD_ctx.renderer != TCOD_RENDERER_SDL ) { + TCOD_opengl_init_attributes(); +#if SDL_VERSION_ATLEAST(2,0,0) + winflags |= SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_OPENGL; +# if defined(TCOD_ANDROID) && defined(FUTURE_SUPPORT) + winflags |= SDL_WINDOW_RESIZABLE; +# endif + window = SDL_CreateWindow(TCOD_ctx.window_title,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,TCOD_ctx.actual_fullscreen_width,TCOD_ctx.actual_fullscreen_height,winflags); + if ( window && TCOD_opengl_init_state(w, h, charmap) && TCOD_opengl_init_shaders() ) { +#else + screen=SDL_SetVideoMode(TCOD_ctx.actual_fullscreen_width,TCOD_ctx.actual_fullscreen_height,32,SDL_FULLSCREEN|SDL_OPENGL); + if ( screen && TCOD_opengl_init_state(w, h, charmap) && TCOD_opengl_init_shaders() ) { +#endif + TCOD_LOG(("Using %s renderer...\n",TCOD_ctx.renderer == TCOD_RENDERER_GLSL ? "GLSL" : "OPENGL")); + } else { + TCOD_LOG(("Fallback to SDL renderer...\n")); + TCOD_ctx.renderer = TCOD_RENDERER_SDL; + } + } +#endif + if (TCOD_ctx.renderer == TCOD_RENDERER_SDL ) { +#if SDL_VERSION_ATLEAST(2,0,0) + winflags |= SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS; +# if defined(TCOD_ANDROID) && defined(FUTURE_SUPPORT) + winflags |= SDL_WINDOW_RESIZABLE; +# endif + window = SDL_CreateWindow(TCOD_ctx.window_title,SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, TCOD_ctx.actual_fullscreen_width,TCOD_ctx.actual_fullscreen_height,winflags); + if ( window == NULL ) TCOD_fatal_nopar("SDL : cannot set fullscreen video mode"); +#else + screen=SDL_SetVideoMode(TCOD_ctx.actual_fullscreen_width,TCOD_ctx.actual_fullscreen_height,32,SDL_FULLSCREEN); + if ( screen == NULL ) TCOD_fatal_nopar("SDL : cannot set fullscreen video mode"); +#endif + } + SDL_ShowCursor(0); +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_GetWindowSize(window,&TCOD_ctx.actual_fullscreen_width,&TCOD_ctx.actual_fullscreen_height); +#else + TCOD_ctx.actual_fullscreen_width=screen->w; + TCOD_ctx.actual_fullscreen_height=screen->h; +#endif + TCOD_sys_init_screen_offset(); +#if !SDL_VERSION_ATLEAST(2,0,0) + SDL_FillRect(screen,0,0); +#endif + } else { +#ifndef NO_OPENGL + if (TCOD_ctx.renderer != TCOD_RENDERER_SDL ) { + TCOD_opengl_init_attributes(); +#if SDL_VERSION_ATLEAST(2,0,0) + winflags |= SDL_WINDOW_OPENGL; + window = SDL_CreateWindow(TCOD_ctx.window_title,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,w*TCOD_ctx.font_width,h*TCOD_ctx.font_height,winflags); + if ( window && TCOD_opengl_init_state(w, h, charmap) && TCOD_opengl_init_shaders() ) { +#else + screen=SDL_SetVideoMode(w*TCOD_ctx.font_width,h*TCOD_ctx.font_height,32,SDL_OPENGL); + if ( screen && TCOD_opengl_init_state(w, h, charmap) && TCOD_opengl_init_shaders() ) { +#endif + TCOD_LOG(("Using %s renderer...\n",TCOD_ctx.renderer == TCOD_RENDERER_GLSL ? "GLSL" : "OPENGL")); + } else { + TCOD_LOG(("Fallback to SDL renderer...\n")); + TCOD_ctx.renderer = TCOD_RENDERER_SDL; + } + } +#endif + if (TCOD_ctx.renderer == TCOD_RENDERER_SDL ) { +#if SDL_VERSION_ATLEAST(2,0,0) + window = SDL_CreateWindow(TCOD_ctx.window_title,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,w*TCOD_ctx.font_width,h*TCOD_ctx.font_height,winflags); +#else + screen=SDL_SetVideoMode(w*TCOD_ctx.font_width,h*TCOD_ctx.font_height,32,0); +#endif + TCOD_LOG(("Using SDL renderer...\n")); + } +#if SDL_VERSION_ATLEAST(2,0,0) + if ( window == NULL ) TCOD_fatal_nopar("SDL : cannot create window"); +#else + if ( screen == NULL ) TCOD_fatal_nopar("SDL : cannot create window"); +#endif + } +#if SDL_VERSION_ATLEAST(2,0,0) + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if ( renderer == NULL ) TCOD_fatal_nopar("SDL : cannot create renderer"); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); +#else + SDL_EnableUNICODE(1); +#endif + consoleBuffer=buf; + prevConsoleBuffer=oldbuf; + TCOD_ctx.fullscreen=fullscreen; + memset(key_status,0,sizeof(bool)*(TCODK_CHAR+1)); + memset(ascii_updated,0,sizeof(bool)*TCOD_ctx.max_font_chars); + return true; +} + +void TCOD_sys_save_bitmap(void *bitmap, const char *filename) { + image_support_t *img=image_type; + while ( img->extension != NULL && strcasestr(filename,img->extension) == NULL ) img++; + if ( img->extension == NULL || img->write == NULL ) img=image_type; /* default to bmp */ + img->write((SDL_Surface *)bitmap,filename); +} + +void TCOD_sys_save_screenshot(const char *filename) { + char buf[128]; + if ( filename == NULL ) { + /* generate filename */ + int idx=0; + do { + FILE *f=NULL; + sprintf(buf,"./screenshot%03d.png",idx); + f=fopen(buf,"rb"); + if ( ! f ) filename=buf; + else { + idx++; + fclose(f); + } + } while(!filename); + } + if ( TCOD_ctx.renderer == TCOD_RENDERER_SDL ) { +#if SDL_VERSION_ATLEAST(2,0,0) + /* This would be a lot easier if image saving could do textures. */ + SDL_Rect rect; + SDL_RenderGetViewport(renderer, &rect); + Uint32 format = SDL_GetWindowPixelFormat(window); + SDL_Texture *texture = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_TARGET, rect.w, rect.h); + if (0 != texture) { + if (SDL_SetRenderTarget(renderer, texture)) { + void *pixels; + int pitch, access; + + actual_rendering(); + SDL_SetRenderTarget(renderer, NULL); + + rect.x = rect.y = rect.w = rect.h = 0; + if (-1 != SDL_QueryTexture(texture, &format, &access, &rect.w, &rect.h) && + -1 != SDL_LockTexture(texture, NULL, &pixels, &pitch)) { + int depth; + Uint32 rmask, gmask, bmask, amask; + if (SDL_TRUE == SDL_PixelFormatEnumToMasks(format, &depth, &rmask, &gmask, &bmask, &amask)) { + SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(pixels, rect.w, rect.h, depth, pitch, rmask, gmask, bmask, amask); + TCOD_sys_save_bitmap((void *)surface,filename); + SDL_FreeSurface(surface); + } else + TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_PixelFormatEnumToMasks")); + + SDL_UnlockTexture(texture); + } else + TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_QueryTexture or SDL_LockTexture")); + } else + TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_SetRenderTarget")); + SDL_DestroyTexture(texture); + } else + TCOD_LOG(("TCOD_sys_save_screenshot - failed call to SDL_CreateTexture")); +#else + TCOD_sys_save_bitmap((void *)screen,filename); +#endif +#ifndef NO_OPENGL + } else { + SDL_Surface *screenshot=(SDL_Surface *)TCOD_opengl_get_screen(); + TCOD_sys_save_bitmap((void *)screenshot,filename); + SDL_FreeSurface(screenshot); +#endif + } +} + +void TCOD_sys_set_fullscreen(bool fullscreen) { + bool mouseOn=SDL_ShowCursor(-1); + TCOD_ctx.fullscreen=fullscreen; + /* + SDL_QuitSubSystem(SDL_INIT_VIDEO); + SDL_InitSubSystem(SDL_INIT_VIDEO); + charmap=SDL_LoadBMP(TCOD_ctx.font_file); + if (charmap == NULL ) TCOD_fatal("SDL : cannot load %s",TCOD_ctx.font_file); + memset(charcols,128,256*sizeof(TCOD_color_t)); + */ + if ( fullscreen ) { +#if SDL_VERSION_ATLEAST(2,0,0) + find_resolution(); + SDL_SetWindowFullscreen(window, fullscreen); +#else + SDL_Surface *newscreen; + find_resolution(); + newscreen=SDL_SetVideoMode(TCOD_ctx.actual_fullscreen_width,TCOD_ctx.actual_fullscreen_height,32,SDL_FULLSCREEN); + TCOD_IFNOT ( newscreen != NULL ) return; + screen=newscreen; +#endif + SDL_ShowCursor(mouseOn ? 1:0); +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_GetWindowSize(window,&TCOD_ctx.actual_fullscreen_width,&TCOD_ctx.actual_fullscreen_height); +#else + TCOD_ctx.actual_fullscreen_width=screen->w; + TCOD_ctx.actual_fullscreen_height=screen->h; +#endif + TCOD_sys_init_screen_offset(); + /* + printf ("actual resolution : %dx%d\n",TCOD_ctx.actual_fullscreen_width,TCOD_ctx.actual_fullscreen_height); + printf ("offset : %dx%d\n",TCOD_ctx.fullscreen_offsetx,TCOD_ctx.fullscreen_offsety); + printf ("flags : %x bpp : %d bitspp : %d\n",screen->flags, screen->format->BytesPerPixel, screen->format->BitsPerPixel); + */ + } else { +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_SetWindowFullscreen(window, fullscreen); +#else + SDL_Surface *newscreen=SDL_SetVideoMode(TCOD_ctx.root->w*TCOD_ctx.font_width,TCOD_ctx.root->h*TCOD_ctx.font_height,32,0); + TCOD_IFNOT( newscreen != NULL ) return; + screen=newscreen; +#endif + SDL_ShowCursor(mouseOn ? 1:0); + TCOD_ctx.fullscreen_offsetx=0; + TCOD_ctx.fullscreen_offsety=0; + } + TCOD_ctx.fullscreen=fullscreen; + /* SDL_WM_SetCaption(TCOD_ctx.window_title,NULL); */ + oldFade=-1; /* to redraw the whole screen */ +#if !SDL_VERSION_ATLEAST(2,0,0) + SDL_UpdateRect(screen, 0, 0, 0, 0); +#endif +} + +/* This just forces a complete redraw, bypassing the usual rendering of changes. */ +void TCOD_sys_set_clear_screen() { + clear_screen=true; +} + +void TCOD_sys_set_scale_factor(float value) { + float old_scale_factor = scale_factor; + scale_factor = value; + if (scale_factor + 1e-3 < scale_data.min_scale_factor) + scale_factor = scale_data.min_scale_factor; + else if (scale_factor - 1e-3 > MAX_SCALE_FACTOR) + scale_factor = MAX_SCALE_FACTOR; + printf("scale_factor: %0.3f -> %0.3f (wanted: %0.3f)", old_scale_factor, scale_factor, value); +} + +void TCOD_sys_set_window_title(const char *title) { + strcpy(TCOD_ctx.window_title,title); +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_SetWindowTitle(window, title); +#else + SDL_WM_SetCaption(title,NULL); +#endif +} + +void TCOD_sys_flush(bool render) { + static uint32 old_time,new_time=0, elapsed=0; + int32 frame_time,time_to_wait; + if ( render ) { +#if SDL_VERSION_ATLEAST(2,0,0) + TCOD_sys_render(NULL,TCOD_console_get_width(NULL),TCOD_console_get_height(NULL),consoleBuffer, prevConsoleBuffer); +#else + TCOD_sys_render(screen,TCOD_console_get_width(NULL),TCOD_console_get_height(NULL),consoleBuffer, prevConsoleBuffer); +#endif + } + old_time=new_time; + new_time=TCOD_sys_elapsed_milli(); + if ( new_time / 1000 != elapsed ) { + /* update fps every second */ + fps=cur_fps; + cur_fps=0; + elapsed=new_time/1000; + } + /* if too fast, wait */ + frame_time=(new_time - old_time); + last_frame_length = frame_time * 0.001f; + cur_fps++; + time_to_wait=min_frame_length-frame_time; + if (old_time > 0 && time_to_wait > 0) { + TCOD_sys_sleep_milli(time_to_wait); + new_time = TCOD_sys_elapsed_milli(); + frame_time=(new_time - old_time); + } + last_frame_length = frame_time * 0.001f; +} + +#if SDL_VERSION_ATLEAST(2,0,0) +static char TCOD_sys_get_vk(SDL_Keycode sdl_key) { + int i; + for (i = 0; i < NUM_VK_TO_C_ENTRIES; i++) { + if (vk_to_c[i].sdl_key == sdl_key) { + vk_to_c[i].sdl_key = 0; + return vk_to_c[i].tcod_key; + } + } + return 0; +} + +static void TCOD_sys_set_vk(SDL_Keycode sdl_key, char tcod_key) { + int i; + for (i = 0; i < NUM_VK_TO_C_ENTRIES; i++) { + if (vk_to_c[i].sdl_key == 0) { + vk_to_c[i].sdl_key = sdl_key; + vk_to_c[i].tcod_key = tcod_key; + break; + } + } +} +#endif + +static void TCOD_sys_convert_event(SDL_Event *ev, TCOD_key_t *ret) { + SDL_KeyboardEvent *kev=&ev->key; +#if SDL_VERSION_ATLEAST(2,0,0) + /* SDL2 does not map keycodes and modifiers to characters, this is on the developer. + Presumably in order to avoid problems with different keyboard layouts, they + are expected to write their own key mapping editing code for the user. */ + if (SDLK_SCANCODE_MASK == (kev->keysym.sym & SDLK_SCANCODE_MASK)) + ret->c = 0; + else { + ret->c = kev->keysym.sym; + if (kev->keysym.mod & KMOD_SHIFT) + switch (kev->keysym.sym) { + case SDLK_BACKQUOTE : ret->c='~'; break; + case SDLK_1 : ret->c='!'; break; + case SDLK_2 : ret->c='@'; break; + case SDLK_3 : ret->c='#'; break; + case SDLK_4 : ret->c='$'; break; + case SDLK_5 : ret->c='%'; break; + case SDLK_6 : ret->c='^'; break; + case SDLK_7 : ret->c='&'; break; + case SDLK_8 : ret->c='*'; break; + case SDLK_9 : ret->c='('; break; + case SDLK_0 : ret->c=')'; break; + case SDLK_MINUS : ret->c='_'; break; + case SDLK_EQUALS : ret->c='+'; break; + case SDLK_LEFTBRACKET : ret->c='{'; break; + case SDLK_RIGHTBRACKET : ret->c='}'; break; + case SDLK_BACKSLASH : ret->c='|'; break; + case SDLK_SEMICOLON : ret->c=':'; break; + case SDLK_QUOTE : ret->c='"'; break; + case SDLK_COMMA : ret->c='<'; break; + case SDLK_PERIOD : ret->c='>'; break; + case SDLK_SLASH : ret->c='?'; break; + } + } +#else + ret->c=(char)kev->keysym.unicode; +#endif + if ( ( kev->keysym.mod & (KMOD_LCTRL|KMOD_RCTRL) ) != 0 ) { + /* when pressing CTRL-A, we don't get unicode for 'a', but unicode for CTRL-A = 1. Fix it */ + if ( kev->keysym.sym >= SDLK_a && kev->keysym.sym <= SDLK_z ) { + ret->c = 'a'+(kev->keysym.sym - SDLK_a); + } + } +#if SDL_VERSION_ATLEAST(2,0,0) + if ( ev->type == SDL_KEYDOWN ) TCOD_sys_set_vk(kev->keysym.sym, ret->c); + else if (ev->type == SDL_KEYUP ) ret->c = TCOD_sys_get_vk(kev->keysym.sym); +#else + if ( ev->type == SDL_KEYDOWN ) vk_to_c[kev->keysym.sym] = ret->c; + else if (ev->type == SDL_KEYUP ) ret->c = vk_to_c[kev->keysym.sym]; +#endif + switch(kev->keysym.sym) { + case SDLK_ESCAPE : ret->vk=TCODK_ESCAPE;break; + case SDLK_SPACE : ret->vk=TCODK_SPACE; break; + case SDLK_BACKSPACE : ret->vk=TCODK_BACKSPACE;break; + case SDLK_TAB : ret->vk=TCODK_TAB;break; + case SDLK_RETURN : ret->vk=TCODK_ENTER;break; + case SDLK_PAUSE : ret->vk=TCODK_PAUSE;break; + case SDLK_PAGEUP : ret->vk=TCODK_PAGEUP;break; + case SDLK_PAGEDOWN : ret->vk=TCODK_PAGEDOWN;break; + case SDLK_HOME : ret->vk=TCODK_HOME;break; + case SDLK_END : ret->vk=TCODK_END;break; + case SDLK_DELETE : ret->vk=TCODK_DELETE;break; + case SDLK_INSERT : ret->vk=TCODK_INSERT; break; + case SDLK_LALT : case SDLK_RALT : ret->vk=TCODK_ALT;break; + case SDLK_LCTRL : case SDLK_RCTRL : ret->vk=TCODK_CONTROL;break; + case SDLK_LSHIFT : case SDLK_RSHIFT : ret->vk=TCODK_SHIFT;break; +#if SDL_VERSION_ATLEAST(2,0,0) + case SDLK_PRINTSCREEN : ret->vk=TCODK_PRINTSCREEN;break; +#else + case SDLK_PRINT : ret->vk=TCODK_PRINTSCREEN;break; +#endif + case SDLK_LEFT : ret->vk=TCODK_LEFT;break; + case SDLK_UP : ret->vk=TCODK_UP;break; + case SDLK_RIGHT : ret->vk=TCODK_RIGHT;break; + case SDLK_DOWN : ret->vk=TCODK_DOWN;break; + case SDLK_F1 : ret->vk=TCODK_F1;break; + case SDLK_F2 : ret->vk=TCODK_F2;break; + case SDLK_F3 : ret->vk=TCODK_F3;break; + case SDLK_F4 : ret->vk=TCODK_F4;break; + case SDLK_F5 : ret->vk=TCODK_F5;break; + case SDLK_F6 : ret->vk=TCODK_F6;break; + case SDLK_F7 : ret->vk=TCODK_F7;break; + case SDLK_F8 : ret->vk=TCODK_F8;break; + case SDLK_F9 : ret->vk=TCODK_F9;break; + case SDLK_F10 : ret->vk=TCODK_F10;break; + case SDLK_F11 : ret->vk=TCODK_F11;break; + case SDLK_F12 : ret->vk=TCODK_F12;break; + case SDLK_0 : ret->vk=TCODK_0;break; + case SDLK_1 : ret->vk=TCODK_1;break; + case SDLK_2 : ret->vk=TCODK_2;break; + case SDLK_3 : ret->vk=TCODK_3;break; + case SDLK_4 : ret->vk=TCODK_4;break; + case SDLK_5 : ret->vk=TCODK_5;break; + case SDLK_6 : ret->vk=TCODK_6;break; + case SDLK_7 : ret->vk=TCODK_7;break; + case SDLK_8 : ret->vk=TCODK_8;break; + case SDLK_9 : ret->vk=TCODK_9;break; +#if SDL_VERSION_ATLEAST(2,0,0) + case SDLK_RGUI : ret->vk=TCODK_RWIN;break; + case SDLK_LGUI : ret->vk=TCODK_LWIN;break; + case SDLK_KP_0 : ret->vk=TCODK_KP0;break; + case SDLK_KP_1 : ret->vk=TCODK_KP1;break; + case SDLK_KP_2 : ret->vk=TCODK_KP2;break; + case SDLK_KP_3 : ret->vk=TCODK_KP3;break; + case SDLK_KP_4 : ret->vk=TCODK_KP4;break; + case SDLK_KP_5 : ret->vk=TCODK_KP5;break; + case SDLK_KP_6 : ret->vk=TCODK_KP6;break; + case SDLK_KP_7 : ret->vk=TCODK_KP7;break; + case SDLK_KP_8 : ret->vk=TCODK_KP8;break; + case SDLK_KP_9 : ret->vk=TCODK_KP9;break; +#else + case SDLK_RSUPER : ret->vk=TCODK_RWIN;break; + case SDLK_LSUPER : ret->vk=TCODK_LWIN;break; + case SDLK_KP0 : ret->vk=TCODK_KP0;break; + case SDLK_KP1 : ret->vk=TCODK_KP1;break; + case SDLK_KP2 : ret->vk=TCODK_KP2;break; + case SDLK_KP3 : ret->vk=TCODK_KP3;break; + case SDLK_KP4 : ret->vk=TCODK_KP4;break; + case SDLK_KP5 : ret->vk=TCODK_KP5;break; + case SDLK_KP6 : ret->vk=TCODK_KP6;break; + case SDLK_KP7 : ret->vk=TCODK_KP7;break; + case SDLK_KP8 : ret->vk=TCODK_KP8;break; + case SDLK_KP9 : ret->vk=TCODK_KP9;break; +#endif + case SDLK_KP_DIVIDE : ret->vk=TCODK_KPDIV;break; + case SDLK_KP_MULTIPLY : ret->vk=TCODK_KPMUL;break; + case SDLK_KP_PLUS : ret->vk=TCODK_KPADD;break; + case SDLK_KP_MINUS : ret->vk=TCODK_KPSUB;break; + case SDLK_KP_ENTER : ret->vk=TCODK_KPENTER;break; + case SDLK_KP_PERIOD : ret->vk=TCODK_KPDEC;break; + default : ret->vk=TCODK_CHAR; break; + } + +} + +static TCOD_key_t TCOD_sys_SDLtoTCOD(SDL_Event *ev, int flags) { + static TCOD_key_t ret; + ret.vk=TCODK_NONE; + ret.c=0; + ret.pressed=0; + switch (ev->type) { + /* handled in TCOD_sys_handle_event */ + /* + case SDL_QUIT : + case SDL_VIDEOEXPOSE : + case SDL_MOUSEBUTTONDOWN : { + case SDL_MOUSEBUTTONUP : { + break; + */ + case SDL_KEYUP : { + SDL_KeyboardEvent *kev=&ev->key; + TCOD_key_t tmpkey; + switch(kev->keysym.sym) { + case SDLK_LALT : ret.lalt=0; break; + case SDLK_RALT : ret.ralt=0; break; + case SDLK_LCTRL : ret.lctrl=0; break; + case SDLK_RCTRL : ret.rctrl=0; break; + case SDLK_LSHIFT : ret.shift=0; break; + case SDLK_RSHIFT : ret.shift=0; break; + default:break; + } + TCOD_sys_convert_event(ev,&tmpkey); + key_status[tmpkey.vk]=false; + if ( flags & TCOD_KEY_RELEASED ) { + ret.vk=tmpkey.vk; + ret.c=tmpkey.c; + ret.pressed=0; + } + } + break; + case SDL_KEYDOWN : { + SDL_KeyboardEvent *kev=&ev->key; + TCOD_key_t tmpkey; + switch(kev->keysym.sym) { + case SDLK_LALT : ret.lalt=1; break; + case SDLK_RALT : ret.ralt=1; break; + case SDLK_LCTRL : ret.lctrl=1; break; + case SDLK_RCTRL : ret.rctrl=1; break; + case SDLK_LSHIFT : ret.shift=1; break; + case SDLK_RSHIFT : ret.shift=1; break; + default : break; + } + TCOD_sys_convert_event(ev,&tmpkey); + key_status[tmpkey.vk]=true; + if ( flags & TCOD_KEY_PRESSED ) { + ret.vk=tmpkey.vk; + ret.c=tmpkey.c; + ret.pressed=1; + } + } + break; + } + return ret; +} + +bool TCOD_sys_is_key_pressed(TCOD_keycode_t key) { + return key_status[key]; +} + +#ifdef TCOD_TOUCH_INPUT +static TCOD_touch_t tcod_touch={0}; + +static int TCOD_sys_get_touch_finger_index(SDL_FingerID fingerId) { + int i; + for (i = 0; i < tcod_touch.nfingers; i++) + if (tcod_touch.finger_ids[i] == fingerId) + return i; + if (i == tcod_touch.nfingers && i+1 <= MAX_TOUCH_FINGERS) { + tcod_touch.nfingers += 1; + tcod_touch.finger_ids[i] = fingerId; + return i; + } + return -1; +} +#endif + +void TCOD_sys_unproject_screen_coords(int sx, int sy, int *ssx, int *ssy) { + if (scale_data.dst_display_width != 0 ) { + *ssx = (scale_data.src_x0 + ((sx - scale_data.dst_offset_x) * scale_data.src_copy_width) / scale_data.dst_display_width); + *ssy = (scale_data.src_y0 + ((sy - scale_data.dst_offset_y) * scale_data.src_copy_width) / scale_data.dst_display_width); + } else { + *ssx = sx - TCOD_ctx.fullscreen_offsetx; + *ssy = sy - TCOD_ctx.fullscreen_offsety; + } +} + +void TCOD_sys_convert_console_to_screen_coords(int cx, int cy, int *sx, int *sy) { + *sx = scale_data.dst_offset_x + ((cx * TCOD_ctx.font_width - scale_data.src_x0) * scale_data.dst_display_width) / scale_data.src_copy_width; + *sy = scale_data.dst_offset_y + ((cy * TCOD_ctx.font_height - scale_data.src_y0) * scale_data.dst_display_height) / scale_data.src_copy_height; +} + +void TCOD_sys_convert_screen_to_console_coords(int sx, int sy, int *cx, int *cy) { + int ssx, ssy; + TCOD_sys_unproject_screen_coords(sx, sy, &ssx, &ssy); + *cx = ssx / TCOD_ctx.font_width; + *cy = ssy / TCOD_ctx.font_height; +} + +static TCOD_mouse_t tcod_mouse={0,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false}; +static TCOD_event_t TCOD_sys_handle_event(SDL_Event *ev,TCOD_event_t eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse) { + TCOD_event_t retMask=0; + /* printf("TCOD_sys_handle_event type=%04x\n", ev->type); */ + switch(ev->type) { + case SDL_KEYDOWN : { + TCOD_key_t tmpKey=TCOD_sys_SDLtoTCOD(ev,TCOD_KEY_PRESSED); + if ( (TCOD_EVENT_KEY_PRESS & eventMask) != 0) { + retMask|=TCOD_EVENT_KEY_PRESS; + if ( key ) *key = tmpKey; + return retMask; + } + } + break; + case SDL_KEYUP : { + TCOD_key_t tmpKey=TCOD_sys_SDLtoTCOD(ev,TCOD_KEY_RELEASED); + if ( (TCOD_EVENT_KEY_RELEASE & eventMask) != 0) { + retMask|=TCOD_EVENT_KEY_RELEASE; + if ( key ) *key = tmpKey; + return retMask; + } + } + break; +#if !SDL_VERSION_ATLEAST(2,0,0) + case SDL_ACTIVEEVENT : + switch(ev->active.state) { + case SDL_APPMOUSEFOCUS : TCOD_ctx.app_has_mouse_focus=ev->active.gain; break; + default : TCOD_ctx.app_is_active=ev->active.gain; break; + } + break; +#endif +#ifdef TCOD_TOUCH_INPUT + /* + * Need to distinguish between: + * - Tap: Can be optionally delegated to a mouse press. + * - Touch and drag: Should affect scaling screen position. + * + */ + case SDL_FINGERDOWN : + case SDL_FINGERUP : + case SDL_FINGERMOTION : + { + SDL_Touch *touch=SDL_GetTouch(ev->tfinger.touchId); + int idx, mouse_touch_valid; + float xf, yf, screen_x, screen_y; + Uint32 ticks_taken = 0; + + /* Reset the global variable. */ + if (tcod_touch.nfingerspressed == 0) { + tcod_touch.nupdates = 0; + tcod_touch.nfingers = 0; + tcod_touch.ticks0 = SDL_GetTicks(); + } else + ticks_taken = SDL_GetTicks() - tcod_touch.ticks0; + + idx = TCOD_sys_get_touch_finger_index(ev->tfinger.fingerId); + if (idx == -1) { + TCOD_LOG(("ERROR: failed to allocate extra finger")); + break; + } + + /* Count the number of events contributing to an ongoing tracked touch (zeroed above in finger press). */ + tcod_touch.finger_id = ev->tfinger.fingerId; + tcod_touch.nupdates += 1; + + /* We only emulate mouse events when the first finger is the only one pressed. */ + if (SDL_FINGERDOWN == ev->type) { + tcod_touch.nfingerspressed += 1; + tcod_touch.fingerspressed[idx] = 1; + mouse_touch_valid = mouse_touch && tcod_touch.nfingerspressed == 1 && tcod_touch.fingerspressed[0]; + } else if (SDL_FINGERUP == ev->type) { + mouse_touch_valid = mouse_touch && tcod_touch.nfingerspressed == 1 && tcod_touch.fingerspressed[0]; + tcod_touch.nfingerspressed -= 1; + tcod_touch.fingerspressed[idx] = 0; + } else + mouse_touch_valid = mouse_touch && tcod_touch.nfingerspressed == 1 && tcod_touch.fingerspressed[0]; + + /* Coordinates are raw full screen positions. */ + screen_x = (ev->tfinger.x * scale_data.surface_width) / touch->xres; + screen_y = (ev->tfinger.y * scale_data.surface_height) / touch->yres; + xf = (float)(screen_x - scale_data.dst_offset_x) / scale_data.dst_display_width; + yf = (float)(screen_y - scale_data.dst_offset_y) / scale_data.dst_display_height; + tcod_touch.coords[idx][0] = scale_data.src_x0 + scale_data.src_copy_width * xf; + tcod_touch.coords[idx][1] = scale_data.src_y0 + scale_data.src_copy_height * yf; + tcod_touch.coords_delta[idx][0] = (ev->tfinger.dx * scale_data.src_proportionate_width) / touch->xres; + tcod_touch.coords_delta[idx][1] = (ev->tfinger.dy * scale_data.src_proportionate_height) / touch->yres; + + /* Console coordinates need to be mapped back from screen coordinates through scaling. */ + tcod_touch.consolecoords[idx][0] = tcod_touch.coords[idx][0] / TCOD_ctx.font_width; + tcod_touch.consolecoords[idx][1] = tcod_touch.coords[idx][1] / TCOD_ctx.font_height; + tcod_touch.consolecoords_delta[idx][0] = tcod_touch.coords_delta[idx][0] / TCOD_ctx.font_width; + tcod_touch.consolecoords_delta[idx][1] = tcod_touch.coords_delta[idx][1] / TCOD_ctx.font_height; + + if (SDL_FINGERDOWN == ev->type) { + // printf("SDL_FINGERDOWN [%d] ticks=%d", tcod_touch.nupdates, ticks_taken); + if ((TCOD_EVENT_FINGER_PRESS & eventMask) != 0) + retMask |= TCOD_EVENT_FINGER_PRESS; + + if (mouse_touch_valid && (TCOD_EVENT_MOUSE_PRESS & eventMask) != 0) { + mouse->lbutton=mousebl=true; + retMask |= TCOD_EVENT_MOUSE_PRESS; + } + } else if (SDL_FINGERUP == ev->type) { + // printf("SDL_FINGERUP [%d] ticks=%d", tcod_touch.nupdates, ticks_taken); + if ((TCOD_EVENT_FINGER_RELEASE & eventMask) != 0) + retMask |= TCOD_EVENT_FINGER_RELEASE; + + if (mouse_touch_valid && (TCOD_EVENT_MOUSE_RELEASE & eventMask) != 0) { + if (mousebl) + mouse->lbutton_pressed = mouse_force_bl=true; + mouse->lbutton = mousebl=false; + retMask |= TCOD_EVENT_MOUSE_RELEASE; + } + } else if (SDL_FINGERMOTION == ev->type) { + float scale_adjust = 1.0f, xc_shift = 0.0f, yc_shift = 0.0f; + + // printf("SDL_FINGERMOTION [%d] ticks=%d", tcod_touch.nupdates, ticks_taken); + if ((TCOD_EVENT_FINGER_MOVE & eventMask) != 0) + retMask |= TCOD_EVENT_FINGER_MOVE; + + if (mouse_touch_valid && (TCOD_EVENT_MOUSE_MOVE & eventMask) != 0) + retMask |= TCOD_EVENT_MOUSE_MOVE; + + if (tcod_touch.nfingerspressed == 1) { + /* One finger drag AKA drag to move. + * Ignore the first few move events that happen unhelpfully immediately after finger down. */ + if (tcod_touch.fingerspressed[0] && (tcod_touch.coords_delta[0][0] || tcod_touch.coords_delta[0][1]) && ticks_taken > 10) { + xc_shift = (float)tcod_touch.coords_delta[idx][0] / scale_data.surface_width; + yc_shift = (float)tcod_touch.coords_delta[idx][1] / scale_data.surface_height; + } + } else if (tcod_touch.nfingerspressed == 2) { + /* Two finger pinch AKA pinch to zoom + * Both fingers should stay exactly where they are on the full surface + * in order to manipulate the drag and zoom effect. */ + if (tcod_touch.fingerspressed[0] && tcod_touch.fingerspressed[1]) { + /* + * New algorithm + */ + int f0x0 = tcod_touch.coords[0][0]-tcod_touch.coords_delta[0][0], f0y0 = tcod_touch.coords[0][1]-tcod_touch.coords_delta[0][1]; + int f1x0 = tcod_touch.coords[1][0]-tcod_touch.coords_delta[1][0], f1y0 = tcod_touch.coords[1][1]-tcod_touch.coords_delta[1][1]; + int f0x1 = tcod_touch.coords[0][0], f0y1 = tcod_touch.coords[0][1]; + int f1x1 = tcod_touch.coords[1][0], f1y1 = tcod_touch.coords[1][1]; + float p0x = (f1x0 + f0x0)/2.0f, p0y = (f1y0 + f0y0)/2.0f; + float p1x = (f1x1 + f0x1)/2.0f, p1y = (f1y1 + f0y1)/2.0f; + float len_previous = sqrtf((float)(pow(f0x0-f1x0,2) + pow(f0y0-f1y0,2))); + float len_current = sqrt((float)(pow(f0x1-f1x1, 2) + pow(f0y1-f1y1,2))); + scale_adjust = len_current/len_previous; + xc_shift = ((p1x - p0x) / scale_data.surface_width); + yc_shift = ((p1y - p0y) / scale_data.surface_height); + } + } + + /* Bound the translations within the console area. */ + if (fabs(xc_shift) > 1e-3f) { + scale_xc -= xc_shift; /* Actual display shift is the inverted finger movement. */ + if (scale_xc + 1e-3f < 0.0f) + scale_xc = 0.0f; + if (scale_xc - 1e-3f > 1.0f) + scale_xc = 1.0f; + } + if (fabs(yc_shift) > 1e-3f) { + scale_yc -= yc_shift; /* Actual display shift is the inverted finger movement. */ + if (scale_yc + 1e-3f < 0.0f) + scale_yc = 0.0f; + if (scale_yc - 1e-3f > 1.0f) + scale_yc = 1.0f; + } + if (fabs(scale_adjust - 1.0f) > 1e-3f) + TCOD_sys_set_scale_factor(scale_factor * scale_adjust); + } + + /* We need to distinguish between handleable touch events, and short distinct mouse events. */ + if (ticks_taken > 400 || tcod_touch.nfingers > 1) { + // printf("DEF NOT MOUSE CODE[%d]", tcod_touch.nupdates); + mouse->cx = 0; + mouse->cy = 0; + mouse->dcx = 0; + mouse->dcy = 0; + } else if (mouse_touch_valid && (retMask & (TCOD_EVENT_MOUSE_PRESS|TCOD_EVENT_MOUSE_RELEASE|TCOD_EVENT_MOUSE_MOVE)) != 0) { + mouse->x = tcod_touch.coords[idx][0]; + mouse->y = tcod_touch.coords[idx][1]; + mouse->dx += tcod_touch.coords_delta[idx][0]; + mouse->dy += tcod_touch.coords_delta[idx][1]; + mouse->cx = tcod_touch.consolecoords[idx][0]; + mouse->cy = tcod_touch.consolecoords[idx][1]; + mouse->dcx = tcod_touch.consolecoords_delta[idx][0]; + mouse->dcy = tcod_touch.consolecoords_delta[idx][1]; + /* printf("CX,CY: %d,%d", mouse->cx,mouse->cy); */ + } + + break; + } +#endif + case SDL_MOUSEMOTION : + if ( (TCOD_EVENT_MOUSE_MOVE & eventMask) != 0) { + SDL_MouseMotionEvent *mev=&ev->motion; + TCOD_sys_unproject_screen_coords(mev->x, mev->y, &mouse->x, &mouse->y); + if (scale_data.surface_width != 0) { + mouse->dx += (mev->xrel * scale_data.src_proportionate_width) / scale_data.surface_width; + mouse->dy += (mev->yrel * scale_data.src_proportionate_height) / scale_data.surface_height; + } + mouse->cx = mouse->x / TCOD_ctx.font_width; + mouse->cy = mouse->y / TCOD_ctx.font_height; + mouse->dcx = mouse->dx / TCOD_ctx.font_width; + mouse->dcy = mouse->dy / TCOD_ctx.font_height; + + return retMask | TCOD_EVENT_MOUSE_MOVE; + } + break; +#if SDL_VERSION_ATLEAST(2,0,0) + case SDL_MOUSEWHEEL : + if (ev->wheel.y < 0) + mouse->wheel_down=true; + else + mouse->wheel_up=true; + return retMask | TCOD_EVENT_MOUSE_PRESS; + break; +#endif + case SDL_MOUSEBUTTONDOWN : + if ( (TCOD_EVENT_MOUSE_PRESS & eventMask) != 0) { + SDL_MouseButtonEvent *mev=&ev->button; + retMask|=TCOD_EVENT_MOUSE_PRESS; + switch (mev->button) { + case SDL_BUTTON_LEFT : mouse->lbutton=mousebl=true; break; + case SDL_BUTTON_MIDDLE : mouse->mbutton=mousebm=true; break; + case SDL_BUTTON_RIGHT : mouse->rbutton=mousebr=true; break; +#if !SDL_VERSION_ATLEAST(2,0,0) + case SDL_BUTTON_WHEELUP : mouse->wheel_up=true; break; + case SDL_BUTTON_WHEELDOWN : mouse->wheel_down=true;break; +#endif + } + /* update mouse position */ + if ( (TCOD_EVENT_MOUSE_MOVE & eventMask) == 0) { + mouse->x=mev->x; + mouse->y=mev->y; + mouse->cx = (mouse->x - TCOD_ctx.fullscreen_offsetx) / TCOD_ctx.font_width; + mouse->cy = (mouse->y - TCOD_ctx.fullscreen_offsety) / TCOD_ctx.font_height; + } + return retMask; + } + break; + case SDL_MOUSEBUTTONUP : + if ( (TCOD_EVENT_MOUSE_RELEASE & eventMask) != 0) { + SDL_MouseButtonEvent *mev=&ev->button; + retMask|=TCOD_EVENT_MOUSE_RELEASE; + switch (mev->button) { + case SDL_BUTTON_LEFT : if (mousebl) mouse->lbutton_pressed = mouse_force_bl=true; mouse->lbutton = mousebl=false; break; + case SDL_BUTTON_MIDDLE : if (mousebm) mouse->mbutton_pressed = mouse_force_bm=true; mouse->mbutton = mousebm=false; break; + case SDL_BUTTON_RIGHT : if (mousebr) mouse->rbutton_pressed = mouse_force_br=true; mouse->rbutton = mousebr=false; break; + } + /* update mouse position */ + if ( (TCOD_EVENT_MOUSE_MOVE & eventMask) == 0) { + mouse->x=mev->x; + mouse->y=mev->y; + mouse->cx = (mouse->x - TCOD_ctx.fullscreen_offsetx) / TCOD_ctx.font_width; + mouse->cy = (mouse->y - TCOD_ctx.fullscreen_offsety) / TCOD_ctx.font_height; + } + return retMask; + } + break; + case SDL_QUIT : + TCOD_ctx.is_window_closed=true; + break; +#if SDL_VERSION_ATLEAST(2,0,0) + case SDL_WINDOWEVENT : + /* At this point, there are some corner cases that need dealing with. So log this. */ + /* printf("SDL2 WINDOWEVENT: 0x%04x\n", ev->window.event); */ + switch (ev->window.event) { +#ifdef TCOD_ANDROID + case SDL_WINDOWEVENT_SIZE_CHANGED: + { + /* printf("SDL2 WINDOWEVENT (SDL_WINDOWEVENT_SIZE_CHANGED): 0x%04x w=%d h=%d\n", ev->window.event, ev->window.data1, ev->window.data2); */ + /* If the app is started while the device is locked, the screen will be in portrait mode. We need to rescale when it changes. */ + if (scale_data.surface_width != ev->window.data1 || scale_data.surface_height != ev->window.data1) + scale_data.force_recalc = 1; + break; + } +#endif + case SDL_WINDOWEVENT_ENTER: /**< Window has gained mouse focus */ + TCOD_ctx.app_has_mouse_focus=true; break; + case SDL_WINDOWEVENT_LEAVE: /**< Window has lost mouse focus */ + TCOD_ctx.app_has_mouse_focus=false; break; + case SDL_WINDOWEVENT_MAXIMIZED: /**< Window has been maximized */ + TCOD_ctx.app_is_active=true; break; + case SDL_WINDOWEVENT_MINIMIZED: /**< Window has been minimized */ + TCOD_ctx.app_is_active=false; break; +#ifdef NDEBUG_HMM + default: + TCOD_LOG(("SDL2 WINDOWEVENT (unknown): 0x%04x\n", ev->window.event)); + break; +#endif + } + break; +#else + case SDL_VIDEOEXPOSE : + TCOD_sys_console_to_bitmap(screen,TCOD_console_get_width(NULL),TCOD_console_get_height(NULL),consoleBuffer,prevConsoleBuffer); + break; +#endif + default : break; + } + return retMask; +} + +TCOD_event_t TCOD_sys_wait_for_event(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse, bool flush) { + SDL_Event ev; + TCOD_event_t retMask=0; + if ( eventMask == 0 ) return 0; + SDL_PumpEvents(); + if ( flush ) { + while ( SDL_PollEvent(&ev) ) { + TCOD_sys_SDLtoTCOD(&ev,0); + } + } + tcod_mouse.lbutton_pressed =false; + tcod_mouse.rbutton_pressed =false; + tcod_mouse.mbutton_pressed =false; + tcod_mouse.wheel_up=false; + tcod_mouse.wheel_down=false; + tcod_mouse.dx=0; + tcod_mouse.dy=0; + if ( key ) { + key->vk=TCODK_NONE; + key->c=0; + } + do { + SDL_WaitEvent(&ev); + retMask=TCOD_sys_handle_event(&ev,eventMask,key,&tcod_mouse); + } while ( ev.type != SDL_QUIT && (retMask & eventMask) == 0 ); + if (mouse) { *mouse=tcod_mouse; } + return retMask; +} + +TCOD_event_t TCOD_sys_check_for_event(int eventMask, TCOD_key_t *key, TCOD_mouse_t *mouse) { + SDL_Event ev; + TCOD_event_t retMask=0; + if ( eventMask == 0 ) return 0; + SDL_PumpEvents(); + tcod_mouse.lbutton_pressed =false; + tcod_mouse.rbutton_pressed =false; + tcod_mouse.mbutton_pressed =false; + tcod_mouse.wheel_up=false; + tcod_mouse.wheel_down=false; + tcod_mouse.dx=0; + tcod_mouse.dy=0; + if ( key ) { + key->vk=TCODK_NONE; + key->c=0; + } + while ( SDL_PollEvent(&ev) ) { + retMask=TCOD_sys_handle_event(&ev,eventMask,key,&tcod_mouse); + if ((retMask & TCOD_EVENT_KEY) != 0) + /* only one key event per frame */ + break; + } + if (mouse) { *mouse=tcod_mouse; } + return retMask; +} + +TCOD_mouse_t TCOD_mouse_get_status() { + return tcod_mouse; +} + + +/* classic keyboard functions (based on generic events) */ + +TCOD_key_t TCOD_sys_check_for_keypress(int flags) { + static TCOD_key_t noret={TCODK_NONE,0}; + + TCOD_key_t key; + TCOD_event_t ev = TCOD_sys_check_for_event(flags & TCOD_EVENT_KEY, &key, NULL); + + if ((ev & TCOD_EVENT_KEY) == 0) return noret; + + return key; +} + +TCOD_key_t TCOD_sys_wait_for_keypress(bool flush) { + static TCOD_key_t noret={TCODK_NONE,0}; + + TCOD_key_t key; + TCOD_event_t ev = TCOD_sys_wait_for_event(TCOD_EVENT_KEY_PRESS, &key, NULL, flush); + + if ((ev & TCOD_EVENT_KEY_PRESS) == 0) return noret; + + return key; +} + + +void TCOD_sys_sleep_milli(uint32 milliseconds) { + SDL_Delay(milliseconds); +} + +void TCOD_sys_term() { + SDL_Quit(); +#if SDL_VERSION_ATLEAST(2,0,0) + window=NULL; + scale_screen=NULL; + if (renderer) { + SDL_DestroyRenderer(renderer); + renderer = NULL; + } +#else + screen=NULL; +#endif +} + +void *TCOD_sys_load_image(const char *filename) { + image_support_t *img=image_type; + while ( img->extension != NULL && !img->check_type(filename) ) img++; + if ( img->extension == NULL || img->read == NULL ) return NULL; /* unknown format */ + return img->read(filename); +} + +void TCOD_sys_get_image_size(const void *image, int *w, int *h) { + SDL_Surface *surf=(SDL_Surface *)image; + *w = surf->w; + *h = surf->h; +} + +TCOD_color_t TCOD_sys_get_image_pixel(const void *image,int x, int y) { + TCOD_color_t ret; + SDL_Surface *surf=(SDL_Surface *)image; + Uint8 bpp; + Uint8 *bits; + if ( x < 0 || y < 0 || x >= surf->w || y >= surf->h ) return TCOD_black; + bpp = surf->format->BytesPerPixel; + bits = ((Uint8 *)surf->pixels)+y*surf->pitch+x*bpp; + switch (bpp) { + case 1 : + { + if (surf->format->palette) { + SDL_Color col = surf->format->palette->colors[(*bits)]; + ret.r=col.r; + ret.g=col.g; + ret.b=col.b; + } else return TCOD_black; + } + break; + default : + ret.r = *((bits)+surf->format->Rshift/8); + ret.g = *((bits)+surf->format->Gshift/8); + ret.b = *((bits)+surf->format->Bshift/8); + break; + } + + return ret; +} + +int TCOD_sys_get_image_alpha(const void *image,int x, int y) { + SDL_Surface *surf=(SDL_Surface *)image; + Uint8 bpp; + Uint8 *bits; + if ( x < 0 || y < 0 || x >= surf->w || y >= surf->h ) return 255; + bpp = surf->format->BytesPerPixel; + if ( bpp != 4 ) return 255; + bits = ((Uint8 *)surf->pixels)+y*surf->pitch+x*bpp; + return *((bits)+surf->format->Ashift/8); +} + +uint32 TCOD_sys_elapsed_milli() { + return (uint32)SDL_GetTicks(); +} + +float TCOD_sys_elapsed_seconds() { + static float div=1.0f/1000.0f; + return SDL_GetTicks()*div; +} + +void TCOD_sys_force_fullscreen_resolution(int width, int height) { + TCOD_ctx.fullscreen_width=width; + TCOD_ctx.fullscreen_height=height; +} + +/* +void * TCOD_sys_create_bitmap(int width, int height, TCOD_color_t *buf) { + int x,y; + SDL_Surface *bitmap=SDL_CreateRGBSurface(SDL_SWSURFACE,width,height,charmap->format->BitsPerPixel, + charmap->format->Rmask,charmap->format->Gmask,charmap->format->Bmask,charmap->format->Amask); + for (x=0; x < width; x++) { + for (y=0; y < height; y++) { + SDL_Rect rect; + Uint32 col=SDL_MapRGB(charmap->format,buf[x+y*width].r,buf[x+y*width].g,buf[x+y*width].b); + rect.x=x; + rect.y=y; + rect.w=1; + rect.h=1; + SDL_FillRect(bitmap,&rect,col); + } + } + return (void *)bitmap; +} +*/ +void * TCOD_sys_create_bitmap(int width, int height, TCOD_color_t *buf) { + int x,y; + SDL_PixelFormat fmt; + SDL_Surface *bitmap; + memset(&fmt,0,sizeof(SDL_PixelFormat)); + if ( charmap != NULL ) { + fmt = *charmap->format; + } else { + fmt.BitsPerPixel=24; + fmt.Amask=0; + if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) { + fmt.Rmask=0x0000FF; + fmt.Gmask=0x00FF00; + fmt.Bmask=0xFF0000; + } else { + fmt.Rmask=0xFF0000; + fmt.Gmask=0x00FF00; + fmt.Bmask=0x0000FF; + } + } + bitmap=SDL_CreateRGBSurface(SDL_SWSURFACE,width,height,fmt.BitsPerPixel,fmt.Rmask,fmt.Gmask,fmt.Bmask,fmt.Amask); + for (x=0; x < width; x++) { + for (y=0; y < height; y++) { + SDL_Rect rect; + Uint32 col=SDL_MapRGB(&fmt,buf[x+y*width].r,buf[x+y*width].g,buf[x+y*width].b); + rect.x=x; + rect.y=y; + rect.w=1; + rect.h=1; + SDL_FillRect(bitmap,&rect,col); + } + } + return (void *)bitmap; +} + +void TCOD_sys_delete_bitmap(void *bitmap) { + SDL_FreeSurface((SDL_Surface *)bitmap); +} + +void TCOD_sys_set_fps(int val) { + if( val == 0 ) min_frame_length=0; + else min_frame_length=1000/val; +} + +void TCOD_sys_save_fps() { + min_frame_length_backup=min_frame_length; +} + +void TCOD_sys_restore_fps() { + min_frame_length=min_frame_length_backup; +} + +int TCOD_sys_get_fps() { + return fps; +} + +float TCOD_sys_get_last_frame_length() { + return last_frame_length; +} + +void TCOD_sys_get_char_size(int *w, int *h) { + *w = TCOD_ctx.font_width; + *h = TCOD_ctx.font_height; +} + +void TCOD_sys_get_current_resolution(int *w, int *h) { + /* be sure that SDL is initialized */ + TCOD_sys_startup(); +#if SDL_VERSION_ATLEAST(2,0,0) + int displayidx; + SDL_Rect rect = { 0, 0, 0, 0 }; + if (window) { + TCOD_IFNOT(window) return; + displayidx = SDL_GetWindowDisplayIndex(window); + TCOD_IFNOT(displayidx >= 0) return; + } else { + /* No window if no console, but user can want to know res before opening one. */ + TCOD_IFNOT(SDL_GetNumVideoDisplays() > 0) return; + displayidx = 0; + } + TCOD_IFNOT(SDL_GetDisplayBounds(displayidx, &rect) == 0) return; + *w=rect.w; + *h=rect.h; +#else + const SDL_VideoInfo *info=SDL_GetVideoInfo(); + *w=info->current_w; + *h=info->current_h; +#endif +} + +/* image stuff */ +bool TCOD_sys_check_magic_number(const char *filename, int size, uint8 *data) { + uint8 tmp[128]; + int i; +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_RWops *rwops = SDL_RWFromFile(filename, "rb"); + if (! rwops) return false; + if ( (i = rwops->read(rwops,tmp,size,1)) != 1 ) { + rwops->close(rwops); + return false; + } + rwops->close(rwops); +#else + FILE *f=fopen(filename,"rb"); + if (! f) return false; + if ( fread(tmp,1,128,f) < (unsigned)size ) { + fclose(f); + return false; + } + fclose(f); +#endif + for (i=0; i< size; i++) if (tmp[i]!=data[i]) return false; + return true; +} + +#if SDL_VERSION_ATLEAST(2,0,0) +void *TCOD_sys_get_SDL_window() { + return (void *)window; +} + +void *TCOD_sys_get_SDL_renderer() { + return (void *)renderer; +} +#endif + +/* mouse stuff */ +void TCOD_mouse_show_cursor(bool visible) { + SDL_ShowCursor(visible ? 1 : 0); +} + +bool TCOD_mouse_is_cursor_visible() { + return SDL_ShowCursor(-1) ? true : false; +} + +void TCOD_mouse_move(int x, int y) { +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_WarpMouseInWindow(window, (Uint16)x,(Uint16)y); +#else + SDL_WarpMouse((Uint16)x,(Uint16)y); +#endif +} + +void TCOD_mouse_includes_touch(bool enable) { +#ifdef TCOD_TOUCH_INPUT + mouse_touch = enable; +#endif +} + +bool TCOD_sys_read_file(const char *filename, unsigned char **buf, size_t *size) { + uint32 filesize; + /* get file size */ +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_RWops *rwops= SDL_RWFromFile(filename,"rb"); + if (!rwops) return false; + SDL_RWseek(rwops,0,RW_SEEK_END); + filesize=SDL_RWtell(rwops); + SDL_RWseek(rwops,0,RW_SEEK_SET); +#else + FILE * fops=fopen(filename,"rb"); + if (!fops) return false; + fseek(fops,0,SEEK_END); + filesize=ftell(fops); + fseek(fops,0,SEEK_SET); +#endif + /* allocate buffer */ + *buf = (unsigned char *)malloc(sizeof(unsigned char)*filesize); + /* read from file */ +#if SDL_VERSION_ATLEAST(2,0,0) + if (SDL_RWread(rwops,*buf,sizeof(unsigned char),filesize) != filesize) { + SDL_RWclose(rwops); + free(*buf); + return false; + } + SDL_RWclose(rwops); +#else + if (fread(*buf,sizeof(unsigned char),filesize,fops) != filesize ) { + fclose(fops); + free(*buf); + return false; + } + fclose(fops); +#endif + *size=filesize; + return true; +} + +bool TCOD_sys_file_exists(const char * filename, ...) { +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_RWops *rwops; +#else + FILE * fops; +#endif + char f[1024]; + va_list ap; + va_start(ap,filename); + vsprintf(f,filename,ap); + va_end(ap); +#if SDL_VERSION_ATLEAST(2,0,0) + rwops = SDL_RWFromFile(f,"rb"); + if (rwops) { + SDL_RWclose(rwops); +#else + fops=fopen(f,"rb"); + if (fops) { + fclose(fops); +#endif + return true; + } + return false; +} + +bool TCOD_sys_write_file(const char *filename, unsigned char *buf, uint32 size) { +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_RWops *rwops= SDL_RWFromFile(filename,"wb"); + if (!rwops) return false; + SDL_RWwrite(rwops,buf,sizeof(unsigned char),size); + SDL_RWclose(rwops); +#else + FILE * fops=fopen(filename,"wb"); + if (!fops) return false; + fwrite(buf,sizeof(unsigned char),size,fops); + fclose(fops); +#endif + return true; +} diff --git a/tcod/tcod_sys/libtcod/src/sys_sdl_img_bmp.c b/tcod/tcod_sys/libtcod/src/sys_sdl_img_bmp.c new file mode 100644 index 00000000..dc82fdd4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/sys_sdl_img_bmp.c @@ -0,0 +1,72 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if defined (__HAIKU__) || defined (__ANDROID__) +#include +#elif defined(TCOD_SDL2) +#include +#else +#include +#endif +#include "libtcod.h" +#include "libtcod_int.h" + +bool TCOD_sys_check_bmp(const char *filename) { + static uint8 magic_number[]={0x42, 0x4d}; + return TCOD_sys_check_magic_number(filename,sizeof(magic_number),magic_number); +} + +SDL_Surface *TCOD_sys_read_bmp(const char *filename) { + SDL_Surface *ret=SDL_LoadBMP(filename); + if( !ret ) TCOD_fatal("SDL : %s",SDL_GetError()); + /* convert low color images to 24 bits */ + if ( ret->format->BytesPerPixel != 3 ) { + Uint32 rmask,gmask,bmask; + SDL_Surface * tmp; + if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) { + rmask=0xFF0000; + gmask=0x00FF00; + bmask=0x0000FF; + } else { + rmask=0x0000FF; + gmask=0x00FF00; + bmask=0xFF0000; + } + tmp=SDL_CreateRGBSurface(SDL_SWSURFACE,ret->w,ret->h,24, rmask, gmask, bmask, 0); + SDL_BlitSurface(ret,NULL,tmp,NULL); + SDL_FreeSurface(ret); + ret=tmp; + } + + return ret; +} + +void TCOD_sys_write_bmp(const SDL_Surface *surf, const char *filename) { + SDL_SaveBMP((SDL_Surface *)surf,filename); +} + + diff --git a/tcod/tcod_sys/libtcod/src/sys_sdl_img_png.c b/tcod/tcod_sys/libtcod/src/sys_sdl_img_png.c new file mode 100644 index 00000000..ec5eefbc --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/sys_sdl_img_png.c @@ -0,0 +1,121 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if defined (__HAIKU__) || defined (__ANDROID__) +#include +#elif defined(TCOD_SDL2) +#include +#include +#include +#else +#include +#endif +#include "png/lodepng.h" +#include "libtcod.h" +#include "libtcod_int.h" + +bool TCOD_sys_check_png(const char *filename) { + static uint8 magic_number[]={137, 80, 78, 71, 13, 10, 26, 10}; + return TCOD_sys_check_magic_number(filename,sizeof(magic_number),magic_number); +} + +SDL_Surface *TCOD_sys_read_png(const char *filename) { + unsigned error; + unsigned char* image; + unsigned width, height, y, bpp; + unsigned char* png; + size_t pngsize; + LodePNGState state; + SDL_Surface *bitmap; + unsigned char *source; + unsigned int rowsize; + + lodepng_state_init(&state); + /*optionally customize the state*/ + if (!TCOD_sys_read_file(filename,&png,&pngsize)) return NULL; + + lodepng_inspect(&width,&height,&state, png, pngsize); + bpp=lodepng_get_bpp(&state.info_png.color); + + if ( bpp == 24 ) { + /* don't convert to 32 bits because libtcod's 24bits renderer is faster */ + state.info_raw.colortype=LCT_RGB; + } else if ( bpp != 24 && bpp != 32 ) { + /* paletted png. convert to 24 bits */ + state.info_raw.colortype=LCT_RGB; + state.info_raw.bitdepth=8; + bpp=24; + } + error = lodepng_decode(&image, &width, &height, &state, png, pngsize); + free(png); + if(error) { + printf("error %u: %s\n", error, lodepng_error_text(error)); + lodepng_state_cleanup(&state); + return NULL; + } + + /* create the SDL surface */ + bitmap=TCOD_sys_get_surface(width,height,bpp==32); + source=image; + rowsize=width*bpp/8; + for (y=0; y< height; y++ ) { + Uint8 *row_pointer=(Uint8 *)(bitmap->pixels) + y * bitmap->pitch; + memcpy(row_pointer,source,rowsize); + source+=rowsize; + } + + lodepng_state_cleanup(&state); + free(image); + return bitmap; +} + +void TCOD_sys_write_png(const SDL_Surface *surf, const char *filename) { + unsigned char *image, *dest=(unsigned char *)malloc(surf->h*surf->w*3*sizeof(char)); + int x,y; + unsigned char *buf; + size_t size; + int error; + /* SDL uses 32bits format without alpha layer for screen. convert it to 24 bits */ + image=dest; + for (y=0; y< surf->h; y++ ) { + for (x=0; x < surf->w; x++ ) { + Uint8 *pixel=(Uint8 *)(surf->pixels) + y * surf->pitch + x * surf->format->BytesPerPixel; + *dest++=*((pixel)+surf->format->Rshift/8); + *dest++=*((pixel)+surf->format->Gshift/8); + *dest++=*((pixel)+surf->format->Bshift/8); + } + } + error=lodepng_encode_memory(&buf,&size,image,surf->w,surf->h,LCT_RGB,8); + free(image); + if ( ! error ) { + TCOD_sys_write_file(filename,buf,size); + free(buf); + } else { + printf("error %u: %s\n", error, lodepng_error_text(error)); + } +} + diff --git a/tcod/tcod_sys/libtcod/src/tree_c.c b/tcod/tcod_sys/libtcod/src/tree_c.c new file mode 100644 index 00000000..042e550e --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/tree_c.c @@ -0,0 +1,44 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "libtcod.h" + +TCOD_tree_t *TCOD_tree_new() { + return (TCOD_tree_t *)calloc(1,sizeof(TCOD_tree_t)); +} + +void TCOD_tree_add_son(TCOD_tree_t *node, TCOD_tree_t *son) { + TCOD_tree_t *lastson = node->sons; + son->father=node; + while ( lastson && lastson->next ) lastson=lastson->next; + if ( lastson ) { + lastson->next=son; + } else { + node->sons=son; + } +} + diff --git a/tcod/tcod_sys/libtcod/src/txtfield.cpp b/tcod/tcod_sys/libtcod/src/txtfield.cpp new file mode 100644 index 00000000..9de55e7c --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/txtfield.cpp @@ -0,0 +1,70 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "libtcod.hpp" + +TCODText::TCODText(int x, int y, int w, int h, int max_chars){ + data=TCOD_text_init(x,y,w,h,max_chars); +} + +TCODText::TCODText(int w, int h, int max_chars){ + data=TCOD_text_init2(w,h,max_chars); +} + +TCODText::~TCODText(){ + TCOD_text_delete(data); +} + +void TCODText::setPos(int x, int y) { + TCOD_text_set_pos(data,x,y); +} + +void TCODText::setProperties(int cursor_char, int blink_interval, const char * prompt, int tab_size){ + TCOD_text_set_properties(data,cursor_char,blink_interval,prompt,tab_size); +} + +void TCODText::setColors(TCODColor fore, TCODColor back, float back_transparency){ + TCOD_color_t foreground = {fore.r,fore.g,fore.b}; + TCOD_color_t background = {back.r,back.g,back.b}; + TCOD_text_set_colors(data,foreground,background,back_transparency); +} + +bool TCODText::update(TCOD_key_t key){ + return TCOD_text_update(data,key) != 0; +} + +void TCODText::render(TCODConsole * con){ + TCOD_text_render(data,con->data); +} + +const char *TCODText::getText(){ + return TCOD_text_get(data); +} + +void TCODText::reset(){ + TCOD_text_reset(data); +} diff --git a/tcod/tcod_sys/libtcod/src/txtfield_c.c b/tcod/tcod_sys/libtcod/src/txtfield_c.c new file mode 100644 index 00000000..e2314c12 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/txtfield_c.c @@ -0,0 +1,678 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +#define MAX_INT 0x7FFFFFFF + +typedef struct { + int x, y; /* coordinates on parent console */ + int w, h; /* textfield display size */ + int max; /* maximum nb of characters */ + int interval; /* cursor blinking interval */ + int halfinterval; /* half of the above */ + int ascii_cursor; /* cursor char. 0 if none */ + int cursor_pos, sel_start,sel_end; /* cursor position in text, selection range */ + int tab_size; /* tab size, if 0, no tab */ + char * prompt; /* prompt to be displayed before the string */ + int textx,texty; /* coordinate of start of text (after prompt) */ + TCOD_console_t con; /* offscreen console that will contain the textfield */ + bool input_continue; /* controls whether ENTER has been pressed */ + int len; /* allocated size of the text */ + int curlen; /* current length of the text */ + TCOD_color_t back; /* background colour */ + TCOD_color_t fore; /* foreground colour */ + float transparency; /* background transparency */ + bool multiline; /* multiline support ? */ + char * text; /* the text itself */ +} text_t; + +/* ctor */ +TCOD_text_t TCOD_text_init (int x, int y, int w, int h, int max_chars) { + text_t * data = (text_t*)calloc(sizeof(text_t),1); + TCOD_IFNOT(w> 0 && h > 0) return data; + data->x = x; + data->y = y; + data->w = w; + data->h = h; + data->multiline = (h > 1); + data->max = (max_chars > 0 ? max_chars + 1 : MAX_INT); + data->interval = 800; + data->halfinterval = 400; + data->ascii_cursor = 0; + data->prompt = NULL; + data->textx = data->texty = 0; + data->con = TCOD_console_new(w,h); + data->sel_start = MAX_INT; + data->sel_end = -1; + /* + if (! data->multiline ) { + data->max = MIN(w - data->textx,data->max); + } else { + data->max = MIN(w*(h-data->texty) - data->textx,data->max); + } + */ + if (max_chars && max_chars > 0) data->max = max_chars; + else data->max = data->w * data->h; + data->input_continue = true; + data->len = MIN(64,data->max); + data->text = (char*)calloc(data->len,sizeof(char)); + data->back.r = data->back.g = data->back.b = 0; + data->fore.r = data->fore.g = data->fore.b = 255; + data->transparency = 1.0f; + return (TCOD_text_t)data; +} + +TCOD_text_t TCOD_text_init2(int w, int h, int max_chars) { + text_t * data = (text_t*)calloc(sizeof(text_t),1); + TCOD_IFNOT(w> 0 && h > 0) return data; + data->x = 0; + data->y = 0; + data->w = w; + data->h = h; + data->multiline = (h > 1); + data->max = (max_chars > 0 ? max_chars + 1 : MAX_INT); + data->interval = 800; + data->halfinterval = 400; + data->ascii_cursor = 0; + data->prompt = NULL; + data->textx = data->texty = 0; + data->con = TCOD_console_new(w,h); + data->sel_start = MAX_INT; + data->sel_end = -1; + /* + if (! data->multiline ) { + data->max = MIN(w - data->textx,data->max); + } else { + data->max = MIN(w*(h-data->texty) - data->textx,data->max); + } + */ + if (max_chars && max_chars > 0) data->max = max_chars; + else data->max = data->w * data->h; + data->input_continue = true; + data->len = MIN(64,data->max); + data->text = (char*)calloc(data->len,sizeof(char)); + data->back.r = data->back.g = data->back.b = 0; + data->fore.r = data->fore.g = data->fore.b = 255; + data->transparency = 1.0f; + return (TCOD_text_t)data; +} + +void TCOD_text_set_pos(TCOD_text_t txt, int x, int y) { + text_t * data = (text_t*)txt; + data->x=x; + data->y=y; +} + +/* set cursor and prompt */ +void TCOD_text_set_properties (TCOD_text_t txt, int cursor_char, int blink_interval, const char * prompt, int tab_size) { + text_t * data = (text_t*)txt; + TCOD_IFNOT(data && data->con ) return; + data->interval = blink_interval; + data->halfinterval = (blink_interval > 0 ? blink_interval / 2 : 0); + data->ascii_cursor = cursor_char; + if (data->prompt) free(data->prompt); + data->prompt = prompt ? TCOD_strdup(prompt) : NULL; + data->textx = data->texty = 0; + data->tab_size=tab_size; + if ( prompt ) { + const char *ptr=prompt; + while (*ptr) { + data->textx++; + if ( *ptr == '\n' || data->textx == data->w) { + data->textx=0;data->texty++; + } + ptr++; + } + } +} + +/* set colours */ +void TCOD_text_set_colors (TCOD_text_t txt, TCOD_color_t fore, TCOD_color_t back, float back_transparency) { + text_t * data = (text_t*)txt; + TCOD_IFNOT(data && data->con ) return; + data->back = back; + data->fore = fore; + data->transparency = back_transparency; +} + +/* increase the buffer size. internal function */ +static void allocate(text_t *data) { + char *tmp; + data->len *= 2; + tmp = (char*)calloc(data->len,sizeof(char)); + memcpy(tmp,data->text,data->len/2); + free(data->text); + data->text = tmp; +} + +/* insert a character at cursor position. internal function */ +static void insertChar(text_t *data, char c) { + char *ptr, *end; + if (data->cursor_pos + 1 == data->max) { + /* max size reached. replace the last char. don't increase text size */ + *(data->text + data->cursor_pos -1) = c; + return; + } + if (data->curlen + 1 == data->len ) allocate(data); + ptr=data->text + data->cursor_pos; + end=data->text + data->curlen; + do { + *(end+1) = *end; + end--; + } while ( end >= ptr ); + *ptr = c; + data->curlen++; + data->cursor_pos++; +} + +/* delete character at cursor position */ +static void deleteChar(text_t *data) { + char *ptr; + if ( data->cursor_pos == 0 ) return; + ptr=data->text + data->cursor_pos-1; + do { + *ptr = *(ptr+1); + ptr++; + } while (*ptr); + if ( data->cursor_pos > 0 ) { + data->cursor_pos--; + data->curlen--; + } +} + +/* convert current cursor_pos into console coordinates. internal function */ +static void get_cursor_coords(text_t *data, int *cx, int *cy) { + char *ptr; + if (data->multiline) { + int curcount=data->cursor_pos; + ptr=data->text; + *cx = data->textx; + *cy = data->texty; + while (curcount > 0 && *ptr) { + if ( *ptr == '\n') { + *cx=0; + (*cy)++; + } else { + (*cx)++; + if ( *cx == data->w ) { + *cx=0; + (*cy)++; + } + } + ptr++; + curcount--; + } + } else { + *cx = data->textx + data->cursor_pos; + *cy = data->texty; + } +} + +/* check if the text does not overflow the textfield */ +/* +not working... +static bool check_last_pos(text_t *data) { + int count = strlen(data->text); + int cx=data->textx; + int cy=data->texty; + char *ptr=data->text; + while ( count > 0 ) { + if ( *ptr == '\n') { + cx=0; + cy++; + } else { + cx++; + if ( cx == data->w ) { + cx=0; + cy++; + } + } + ptr++; + count--; + } + return ( cy < data->h ); +} +*/ + +/* set cursor_pos from coordinates. internal function */ +static void set_cursor_pos(text_t *data, int cx, int cy, bool clamp) { + if ( data->multiline ) { + int curx=data->textx,cury=data->texty; + char *ptr=data->text; + int newpos=0; + if ( clamp ) { + cy=MAX(data->texty,cy); + if ( cy == data->texty) cx = MAX(data->textx,cx); + } + /* find the right line */ + while ( *ptr && cury < cy && cury < data->h ) { + if (*ptr == '\n' || curx == data->w-1) { + curx=0;cury++; + } else curx++; + ptr++; + newpos++; + } + if ( cury >= data->h ) return; + if ( cury == cy ) { + /* check if cx can be reached */ + while ( *ptr && curx < cx && *ptr != '\n') { + ptr++; + curx++; + newpos++; + } + } + data->cursor_pos = newpos; + } else { + int newpos = cx - data->textx + (cy - data->texty)*data->w; + if ( clamp ) newpos = CLAMP(0,data->curlen,newpos); + if ( newpos >= 0 && newpos <= data->curlen ) data->cursor_pos = newpos; + } +} + + +/* decreases the selection range start */ +static void selectStart(text_t *data, int oldpos, TCOD_key_t key) { + if ( data->multiline && data->cursor_pos != oldpos ) { + if ( key.shift ) { + if ( data->sel_start > data->cursor_pos ) data->sel_start = data->cursor_pos; + else data->sel_end = data->cursor_pos; + } else { + data->sel_start=MAX_INT; + data->sel_end=-1; + } + } +} + +/* increases the selection range end */ +static void selectEnd(text_t *data, int oldpos, TCOD_key_t key) { + if ( data->multiline && data->cursor_pos != oldpos ) { + if ( key.shift ) { + if ( data->sel_end < data->cursor_pos ) data->sel_end = data->cursor_pos; + else data->sel_start = data->cursor_pos; + } else { + data->sel_start=MAX_INT; + data->sel_end=-1; + } + } +} + +enum { TYPE_SYMBOL, TYPE_ALPHANUM, TYPE_SPACE }; +static const char symbols[]="&~\"#'{([-|`_\\^@)]=+}*/!:;.,?<>"; + +/* check whether a character is a space */ +/* this is needed because cctype isspace() returns rubbish for many diacritics */ +static bool is_space (int ch) { + bool ret; + switch (ch) { + case ' ': case '\n': case '\r': case '\t': ret = true; break; + default: ret = false; break; + } + return ret; +} + +static void typecheck (int * type, int ch) { + if (strchr(symbols,ch)) *type = TYPE_SYMBOL; + else if (is_space(ch)) *type = TYPE_SPACE; + else *type = TYPE_ALPHANUM; +} + +/* go one word left */ +static void previous_word(text_t *data) { + /* current character type */ + if ( data->cursor_pos > 0 ) { + /* detect current char type (alphanum/space or symbol) */ + char *ptr=data->text + data->cursor_pos - 1; + int curtype, prevtype; + typecheck(&curtype,*ptr); + /* go back until char type changes from alphanumeric to something else */ + do { + data->cursor_pos--; + ptr--; + prevtype = curtype; + typecheck(&curtype,*ptr); + } while ( data->cursor_pos > 0 && !(curtype != TYPE_ALPHANUM && prevtype == TYPE_ALPHANUM)); + } +} + +/* go one word right */ +static void next_word(text_t *data) { + /* current character type */ + if ( data->text[data->cursor_pos] ) { + /* detect current char type (alphanum/space or symbol) */ + char *ptr=data->text + data->cursor_pos; + int curtype, prevtype; + typecheck(&curtype,*ptr); + /* go forth until char type changes from non alphanumeric to alphanumeric */ + do { + data->cursor_pos++; + ptr++; + prevtype = curtype; + typecheck(&curtype,*ptr); + } while ( *ptr && !(curtype == TYPE_ALPHANUM && prevtype != TYPE_ALPHANUM)); + } +} + +/* erase the selected text */ +static void deleteSelection(text_t *data) { + int count = data->sel_end-data->sel_start; + data->cursor_pos = data->sel_start+1; + while ( count > 0 ) { + deleteChar(data); + count--; + data->cursor_pos++; + } + data->cursor_pos--; + data->sel_start=MAX_INT; + data->sel_end=-1; +} + +/* copy selected text to clipboard */ +static void copy(text_t *data) { + if ( data->sel_end - data->sel_start > 0 ) { + char *clipbuf = (char*)calloc(data->sel_end - data->sel_start+1,1); + char *ptr=clipbuf; + int i; + for (i=data->sel_start; i != data->sel_end; i++) { + *ptr++ = data->text[i]; + } + TCOD_sys_clipboard_set(clipbuf); + free(clipbuf); + } +} + +/* cut selected text to clipboard */ +static void cut(text_t *data) { + if ( data->sel_end - data->sel_start > 0 ) { + char *clipbuf = (char*)calloc(data->sel_end - data->sel_start+1,1); + char *ptr=clipbuf; + int i; + for (i=data->sel_start; i != data->sel_end; i++) { + *ptr++ = data->text[i]; + } + TCOD_sys_clipboard_set(clipbuf); + free(clipbuf); + deleteSelection(data); + } +} + +/* paste from clipboard */ +static void paste(text_t *data) { + char *clipbuf=TCOD_sys_clipboard_get(); + if ( clipbuf ) { + if ( data->sel_start != MAX_INT ) { + deleteSelection(data); + } + while (*clipbuf) { + insertChar(data,*clipbuf++); + } + } +} + +/* update returns false if enter has been pressed, true otherwise */ +bool TCOD_text_update (TCOD_text_t txt, TCOD_key_t key) { + int cx,cy,oldpos; + text_t * data = (text_t*)txt; + TCOD_IFNOT(data && data->con ) return false; + oldpos = data->cursor_pos; + /* for real-time keyboard : only on key release */ + if ( key.pressed ) { + /* process keyboard input */ + switch (key.vk) { + case TCODK_BACKSPACE: /* get rid of the last character */ + if ( data->sel_start != MAX_INT ) { + deleteSelection(data); + } else { + deleteChar(data); + } + break; + case TCODK_DELETE: + if ( key.shift ) { + /* SHIFT-DELETE : cut to clipboard */ + cut(data); + } else { + if ( data->sel_start != MAX_INT ) { + deleteSelection(data); + } else if ( data->text[data->cursor_pos] ) { + data->cursor_pos++; + deleteChar(data); + } + } + break; + /* shift + arrow / home / end = selection */ + /* ctrl + arrow = word skipping. ctrl + shift + arrow = word selection */ + case TCODK_LEFT: + if ( data->multiline && key.shift && data->sel_end == -1) { + data->sel_end = data->cursor_pos; + } + if ( data->cursor_pos > 0 ) { + if ( key.lctrl || key.rctrl ) { + previous_word(data); + } else data->cursor_pos--; + selectStart(data,oldpos,key); + } + break; + case TCODK_RIGHT: + if ( data->multiline && key.shift && data->sel_start == MAX_INT ) { + data->sel_start = data->cursor_pos; + } + if ( data->text[data->cursor_pos] ) { + if ( key.lctrl || key.rctrl ) { + next_word(data); + } else data->cursor_pos++; + selectEnd(data,oldpos,key); + } + break; + case TCODK_UP : + get_cursor_coords(data,&cx,&cy); + if ( data->multiline && key.shift && data->sel_end == -1) { + data->sel_end = data->cursor_pos; + } + set_cursor_pos(data,cx,cy-1,false); + selectStart(data,oldpos,key); + break; + case TCODK_DOWN : + get_cursor_coords(data,&cx,&cy); + if ( data->multiline && key.shift && data->sel_start == MAX_INT ) { + data->sel_start = data->cursor_pos; + } + set_cursor_pos(data,cx,cy+1,false); + selectEnd(data,oldpos,key); + break; + case TCODK_HOME: + get_cursor_coords(data,&cx,&cy); + if ( data->multiline && key.shift && data->sel_end == -1) { + data->sel_end = data->cursor_pos; + } + if ( key.lctrl || key.rctrl ) { + set_cursor_pos(data,0,0,true); + } else { + set_cursor_pos(data,0,cy,true); + } + selectStart(data,oldpos,key); + break; + case TCODK_END: + get_cursor_coords(data,&cx,&cy); + if ( data->multiline && key.shift && data->sel_start == MAX_INT ) { + data->sel_start = data->cursor_pos; + } + if ( key.lctrl || key.rctrl ) { + set_cursor_pos(data,data->w,data->h,true); + } else { + set_cursor_pos(data,data->w-1,cy,true); + } + selectEnd(data,oldpos,key); + break; + case TCODK_ENTER: /* validate input */ + case TCODK_KPENTER: + if ( data->sel_start != MAX_INT ) { + deleteSelection(data); + } + if ( data->multiline ) { + get_cursor_coords(data,&cx,&cy); + if ( cy < data->h-1 ) insertChar(data,'\n'); + } else { + data->input_continue = false; + } + break; + case TCODK_TAB : + if (data->tab_size ) { + int count=data->tab_size; + if ( data->sel_start != MAX_INT ) { + deleteSelection(data); + } + while ( count > 0 ) { + insertChar(data,' '); + count--; + } + } + break; + default: { /* append a new character */ + if ( (key.c == 'c' || key.c=='C' || key.vk == TCODK_INSERT) && (key.lctrl || key.rctrl) ) { + /* CTRL-C or CTRL-INSERT : copy to clipboard */ + copy(data); + } else if ( (key.c == 'x' || key.c=='X') && (key.lctrl || key.rctrl) ) { + /* CTRL-X : cut to clipboard */ + cut(data); + } else if ( ((key.c == 'v' || key.c=='V') && (key.lctrl || key.rctrl)) + || ( key.vk == TCODK_INSERT && key.shift ) + ) { + /* CTRL-V or SHIFT-INSERT : paste from clipboard */ + paste(data); + } else if (key.c > 31) { + if ( data->sel_start != MAX_INT ) { + deleteSelection(data); + } + insertChar(data,(char)(key.c)); + } + break; + } + } + } + return data->input_continue; +} + +/* renders the textfield */ +void TCOD_text_render (TCOD_text_t txt, TCOD_console_t con) { + text_t * data = (text_t*)txt; + uint32 time; + bool cursor_on; + char back=0; + int curx,cury,cursorx,cursory, curpos; + char *ptr; + TCOD_IFNOT(data && data->con ) return; + time = TCOD_sys_elapsed_milli(); + cursor_on = (int)( time % data->interval ) > data->halfinterval; + TCOD_console_set_default_background(data->con, data->back); + TCOD_console_set_default_foreground(data->con, data->fore); + TCOD_console_clear(data->con); + + /* compute cursor position */ + get_cursor_coords(data,&cursorx,&cursory); + + if ( cursor_on && data->ascii_cursor) { + /* save the character under cursor position */ + back = data->text[data->cursor_pos]; + data->text[data->cursor_pos] = data->ascii_cursor; + } + /* render prompt */ + if (data->prompt) TCOD_console_print_rect_ex(data->con,0,0,data->w,data->h,TCOD_BKGND_SET,TCOD_LEFT,"%s",data->prompt); + /* render text */ + curx=data->textx; + cury=data->texty; + ptr=data->text; + curpos=0; + while (*ptr) { + if ( *ptr == '\n') { + if ( (curx == 0 || curpos == 0 ) && curpos >= data->sel_start && curpos < data->sel_end ) { + /* inverted colors for selected empty lines */ + TCOD_console_set_char_background(data->con, curx, cury, data->fore, TCOD_BKGND_SET); + TCOD_console_set_char_foreground(data->con, curx, cury, data->back); + } + curx=0; + cury++; + } else { + if ( curpos >= data->sel_start && curpos < data->sel_end ) { + /* inverted colors for selection */ + TCOD_console_set_char_background(data->con, curx, cury, data->fore, TCOD_BKGND_SET); + TCOD_console_set_char_foreground(data->con, curx, cury, data->back); + } + TCOD_console_set_char(data->con,curx,cury,*ptr); + curx++; + if ( curx == data->w ) { + curx=0; + cury++; + } + } + ptr++; + curpos++; + } + if ( cursor_on ) { + if ( data->ascii_cursor) { + /* restore the character under cursor */ + data->text[data->cursor_pos] = back; + } else { + /* invert colors at cursor position */ + TCOD_console_set_char_background(data->con,cursorx,cursory,data->fore,TCOD_BKGND_SET); + TCOD_console_set_char_foreground(data->con,cursorx,cursory,data->back); + } + } else if (! cursor_on && ! data->ascii_cursor && data->multiline ) { + /* normal colors for cursor ( might be inside selection ) */ + TCOD_console_set_char_background(data->con,cursorx,cursory,data->back,TCOD_BKGND_SET); + TCOD_console_set_char_foreground(data->con,cursorx,cursory,data->fore); + } + TCOD_console_blit(data->con,0,0,data->w,data->h,con,data->x,data->y,1.0f,data->transparency); +} + +/* returns the text currently stored in the textfield object */ +const char * TCOD_text_get (TCOD_text_t txt) { + text_t * data = (text_t*)txt; + TCOD_IFNOT(data && data->con ) return ""; + return data->text; +} + +/* resets the text initial state */ +void TCOD_text_reset (TCOD_text_t txt) { + text_t * data = (text_t*)txt; + TCOD_IFNOT(data && data->con ) return; + memset(data->text,'\0',data->len); + data->curlen = 0; + data->input_continue = true; +} + +/* destructor */ +void TCOD_text_delete (TCOD_text_t txt) { + text_t * data = (text_t*)txt; + TCOD_IFNOT(data && data->con ) return; + if ( data->text ) free(data->text); + if ( data->prompt ) free(data->prompt); + TCOD_console_delete(data->con); + free(data); +} diff --git a/tcod/tcod_sys/libtcod/src/wrappers.c b/tcod/tcod_sys/libtcod/src/wrappers.c new file mode 100644 index 00000000..ef2b3eab --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/wrappers.c @@ -0,0 +1,364 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +#include "wrappers.h" + +#define RED_MASK 0x0000FF +#define GREEN_MASK 0x00FF00 +#define BLUE_MASK 0xFF0000 + +TCOD_color_t int_to_color (colornum_t col) { + TCOD_color_t ret; + ret.r = col & RED_MASK; + ret.g = (col & GREEN_MASK) >> 8; + ret.b = (col & BLUE_MASK) >> 16; + return ret; +} + +#define color_to_int(col) (int)(((int)((col).b) << 16) | ((col).g << 8) | (col).r) + +bool TCOD_color_equals_wrapper (colornum_t c1, colornum_t c2) { + return TCOD_color_equals (int_to_color(c1), int_to_color(c2)); +} + +colornum_t TCOD_color_add_wrapper (colornum_t c1, colornum_t c2) { + return color_to_int(TCOD_color_add (int_to_color(c1), + int_to_color(c2))); +} + +colornum_t TCOD_color_subtract_wrapper (colornum_t c1, colornum_t c2) { + return color_to_int(TCOD_color_subtract (int_to_color(c1), + int_to_color(c2))); +} + +colornum_t TCOD_color_multiply_wrapper (colornum_t c1, colornum_t c2) +{ + return color_to_int(TCOD_color_multiply (int_to_color(c1), int_to_color(c2))); +} + +colornum_t TCOD_color_multiply_scalar_wrapper (colornum_t c1, float value) +{ + return color_to_int(TCOD_color_multiply_scalar (int_to_color(c1), + value)); +} + +colornum_t TCOD_color_lerp_wrapper(colornum_t c1, colornum_t c2, float coef) +{ + return color_to_int(TCOD_color_lerp (int_to_color(c1),int_to_color(c2), + coef)); +} + +void TCOD_color_get_HSV_wrapper(colornum_t c,float * h, + float * s, float * v) +{ + TCOD_color_get_HSV (int_to_color(c), h, s, v); +} + +float TCOD_color_get_hue_ (colornum_t c) { + return TCOD_color_get_hue(int_to_color(c)); +} + +float TCOD_color_get_saturation_ (colornum_t c) { + return TCOD_color_get_saturation(int_to_color(c)); +} + +float TCOD_color_get_value_ (colornum_t c) { + return TCOD_color_get_value(int_to_color(c)); +} + +colornum_t TCOD_console_get_default_background_wrapper(TCOD_console_t con) +{ + return color_to_int(TCOD_console_get_default_background (con)); +} + + +colornum_t TCOD_console_get_default_foreground_wrapper(TCOD_console_t con) +{ + return color_to_int(TCOD_console_get_default_foreground (con)); +} + + +void TCOD_console_set_default_background_wrapper(TCOD_console_t con, + colornum_t col) +{ + TCOD_console_set_default_background (con, + int_to_color(col)); +} + +void TCOD_console_set_default_foreground_wrapper(TCOD_console_t con, + colornum_t col) +{ + TCOD_console_set_default_foreground (con, + int_to_color(col)); +} + +colornum_t TCOD_console_get_char_foreground_wrapper(TCOD_console_t con, + int x, int y) +{ + return color_to_int(TCOD_console_get_char_foreground (con, x, y)); +} + +colornum_t TCOD_console_get_char_background_wrapper(TCOD_console_t con, + int x, int y) +{ + return color_to_int(TCOD_console_get_char_background (con, x, y)); +} + +void TCOD_console_set_char_background_wrapper(TCOD_console_t con,int x, int y, + colornum_t col, + TCOD_bkgnd_flag_t flag) +{ + TCOD_console_set_char_background (con, x, y, int_to_color(col), flag); +} + + +void TCOD_console_set_char_foreground_wrapper(TCOD_console_t con,int x, int y, + colornum_t col) +{ + TCOD_console_set_char_foreground (con, x, y, int_to_color(col)); +} + +void TCOD_console_put_char_ex_wrapper(TCOD_console_t con, int x, int y, + int c, colornum_t fore, colornum_t back) +{ + TCOD_console_put_char_ex (con, x, y, c, int_to_color(fore), + int_to_color(back)); +} + +void TCOD_console_set_fade_wrapper(uint8 val, colornum_t fade) +{ + TCOD_console_set_fade (val, int_to_color(fade)); +} + +void TCOD_console_fill_background(TCOD_console_t con, int *r, int *g, int *b) { + TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + int i; + char_t *curchar=dat->buf; + for (i=0; i < dat->w*dat->h; i++) { + curchar->back.r=*r; + curchar->back.g=*g; + curchar->back.b=*b; + curchar++; + r++; + g++; + b++; + } +} + +void TCOD_console_fill_foreground(TCOD_console_t con, int *r, int *g, int *b) { + TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + int i; + char_t *curchar=dat->buf; + for (i=0; i < dat->w*dat->h; i++) { + curchar->fore.r=*r; + curchar->fore.g=*g; + curchar->fore.b=*b; + curchar++; + r++; + g++; + b++; + } +} + +void TCOD_console_fill_char(TCOD_console_t con, int *arr) { + TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + int i; + char_t *curchar=dat->buf; + for (i=0; i < dat->w*dat->h; i++) { + curchar->c=*arr; + curchar->cf=TCOD_ctx.ascii_to_tcod[*arr]; + curchar++; + arr++; + } +} + +colornum_t +TCOD_console_get_fading_color_wrapper () +{ + return color_to_int(TCOD_console_get_fading_color()); +} + +void TCOD_console_set_color_control_wrapper(TCOD_colctrl_t con, + colornum_t fore, + colornum_t back) +{ + TCOD_console_set_color_control (con, + int_to_color(fore), + int_to_color(back)); +} + +void TCOD_image_clear_wrapper(TCOD_image_t image, + colornum_t color) +{ + TCOD_image_clear (image, + int_to_color(color)); +} + +colornum_t TCOD_image_get_pixel_wrapper(TCOD_image_t image, + int x, int y) +{ + return color_to_int(TCOD_image_get_pixel (image, x, y)); +} + +colornum_t TCOD_image_get_mipmap_pixel_wrapper(TCOD_image_t image, + float x0,float y0, float x1, float y1) +{ + return color_to_int(TCOD_image_get_mipmap_pixel (image, + x0, y0, x1, y1)); +} + +void TCOD_image_put_pixel_wrapper(TCOD_image_t image,int x, int y, + colornum_t col) +{ + TCOD_image_put_pixel (image, x, y, + int_to_color( col)); +} + +void TCOD_image_set_key_color_wrapper(TCOD_image_t image, + colornum_t key_color) +{ + TCOD_image_set_key_color (image, + int_to_color(key_color)); +} + +bool TCOD_console_check_for_keypress_wrapper (TCOD_key_t *holder, int flags) +{ + *holder = TCOD_console_check_for_keypress(flags); + return (holder->vk != TCODK_NONE); +} + + +void TCOD_console_wait_for_keypress_wrapper (TCOD_key_t *holder, bool flush) +{ + *holder = TCOD_console_wait_for_keypress(flush); +} + +void TCOD_mouse_get_status_wrapper(TCOD_mouse_t *mouse) { + *mouse=TCOD_mouse_get_status(); +} + +/* Routines to draw hlines, vlines and frames using the double-lined + * characters. */ + +void TCOD_console_double_hline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) { + int i; + for (i=x; i< x+l; i++) TCOD_console_put_char(con,i,y,TCOD_CHAR_DHLINE,flag); +} + +void TCOD_console_double_vline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) { + int i; + for (i=y; i< y+l; i++) TCOD_console_put_char(con,x,i,TCOD_CHAR_DVLINE,flag); +} + + +void TCOD_console_print_double_frame(TCOD_console_t con,int x,int y,int w,int h, bool empty, TCOD_bkgnd_flag_t flag, const char *fmt, ...) { + TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)con : TCOD_ctx.root; + TCOD_console_put_char(con,x,y,TCOD_CHAR_DNW,flag); + TCOD_console_put_char(con,x+w-1,y,TCOD_CHAR_DNE,flag); + TCOD_console_put_char(con,x,y+h-1,TCOD_CHAR_DSW,flag); + TCOD_console_put_char(con,x+w-1,y+h-1,TCOD_CHAR_DSE,flag); + TCOD_console_double_hline(con,x+1,y,w-2, flag); + TCOD_console_double_hline(con,x+1,y+h-1,w-2, flag); + TCOD_console_double_vline(con,x,y+1,h-2, flag); + TCOD_console_double_vline(con,x+w-1,y+1,h-2, flag); + if ( h > 2 ) { + TCOD_console_vline(con,x,y+1,h-2,flag); + TCOD_console_vline(con,x+w-1,y+1,h-2,flag); + if ( empty ) { + TCOD_console_rect(con,x+1,y+1,w-2,h-2,true,flag); + } + } + if (fmt) { + va_list ap; + int xs; + TCOD_color_t tmp; + char *title; + va_start(ap,fmt); + title = TCOD_console_vsprint(fmt,ap); + va_end(ap); + title[w-3]=0; /* truncate if needed */ + xs = x + (w-strlen(title)-2)/2; + tmp=dat->back; /* swap colors */ + dat->back=dat->fore; + dat->fore=tmp; + TCOD_console_print_ex(con,xs,y,TCOD_BKGND_SET,TCOD_LEFT," %s ",title); + tmp=dat->back; /* swap colors */ + dat->back=dat->fore; + dat->fore=tmp; + } +} + + +char *TCOD_console_print_return_string(TCOD_console_t con,int x,int y, int rw, + int rh, TCOD_bkgnd_flag_t flag, + TCOD_alignment_t align, char *msg, bool can_split, bool count_only) { + TCOD_console_print_internal(con,x,y,rw,rh,flag,align,msg,can_split,count_only); + return msg; +} + +colornum_t TCOD_parser_get_color_property_wrapper(TCOD_parser_t parser, const char *name) { + return color_to_int(TCOD_parser_get_color_property(parser,name)); +} + +int TCOD_namegen_get_nb_sets_wrapper() { + TCOD_list_t l=TCOD_namegen_get_sets(); + int nb = TCOD_list_size(l); + TCOD_list_delete(l); + return nb; +} + +void TCOD_namegen_get_sets_wrapper(char **sets) { + TCOD_list_t l=TCOD_namegen_get_sets(); + char **it; + int i=0; + for (it=(char**)TCOD_list_begin(l); it != (char **)TCOD_list_end(l); it++) { + sets[i++]=*it; + } +} + +int TCOD_sys_get_current_resolution_x() +{ + int x, y; + TCOD_sys_get_current_resolution(&x, &y); + return x; +} + +int TCOD_sys_get_current_resolution_y() +{ + int x, y; + TCOD_sys_get_current_resolution(&x, &y); + return y; +} + +void TCOD_console_set_key_color_wrapper (TCOD_console_t con, colornum_t c) +{ + TCOD_console_set_key_color(con, int_to_color(c)); +} diff --git a/tcod/tcod_sys/libtcod/src/zip.cpp b/tcod/tcod_sys/libtcod/src/zip.cpp new file mode 100644 index 00000000..a2201014 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zip.cpp @@ -0,0 +1,123 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "libtcod.hpp" + +TCODZip::TCODZip() { + data=TCOD_zip_new(); +} + +TCODZip::~TCODZip() { + TCOD_zip_delete(data); +} + +void TCODZip::putChar(char val) { + TCOD_zip_put_char(data,val); +} + +void TCODZip::putInt(int val) { + TCOD_zip_put_int(data,val); +} + +void TCODZip::putFloat(float val) { + TCOD_zip_put_float(data,val); +} + +void TCODZip::putString(const char *val) { + TCOD_zip_put_string(data,val); +} + +void TCODZip::putData(int nbBytes, const void *pdata) { + TCOD_zip_put_data(data,nbBytes,pdata); +} + +void TCODZip::putColor(const TCODColor *val) { + TCOD_color_t col; + col.r=val->r; + col.g=val->g; + col.b=val->b; + TCOD_zip_put_color(data,col); +} + +void TCODZip::putImage(const TCODImage *val) { + TCOD_zip_put_image(data,val->data); +} + +void TCODZip::putConsole(const TCODConsole *val) { + TCOD_zip_put_console(data,val->data); +} + +int TCODZip::saveToFile(const char *filename) { + return TCOD_zip_save_to_file(data,filename); +} + +int TCODZip::loadFromFile(const char *filename) { + return TCOD_zip_load_from_file(data,filename); +} + +char TCODZip::getChar() { + return TCOD_zip_get_char(data); +} + +int TCODZip::getInt() { + return TCOD_zip_get_int(data); +} + +float TCODZip::getFloat() { + return TCOD_zip_get_float(data); +} + +const char *TCODZip::getString() { + return TCOD_zip_get_string(data); +} + +int TCODZip::getData(int nbBytes, void *pdata) { + return TCOD_zip_get_data(data,nbBytes,pdata); +} + +TCODColor TCODZip::getColor() { + return TCODColor(TCOD_zip_get_color(data)); +} + +TCODImage *TCODZip::getImage() { + return new TCODImage(TCOD_zip_get_image(data)); +} + +TCODConsole *TCODZip::getConsole() { + return new TCODConsole(TCOD_zip_get_console(data)); +} + +uint32 TCODZip::getCurrentBytes() const { + return TCOD_zip_get_current_bytes(data); +} + +uint32 TCODZip::getRemainingBytes() const { + return TCOD_zip_get_remaining_bytes(data); +} + +void TCODZip::skipBytes(uint32 nbBytes) { + TCOD_zip_skip_bytes(data,nbBytes); +} diff --git a/tcod/tcod_sys/libtcod/src/zip_c.c b/tcod/tcod_sys/libtcod/src/zip_c.c new file mode 100644 index 00000000..cc1ce814 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zip_c.c @@ -0,0 +1,369 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include +#include "libtcod.h" +#include "libtcod_int.h" + +typedef struct { + TCOD_list_t buffer; /* list */ + uintptr ibuffer; /* byte buffer. bytes are send into buffer 4 by 4 (32 bits OS) or 8 by 8(64 bits OS) */ + int isize; /* number of bytes in ibuffer */ + int bsize; /* number of bytes in buffer */ + int offset; /* current reading position */ +} zip_data_t; + +TCOD_zip_t TCOD_zip_new() { + zip_data_t *ret=(zip_data_t *)calloc(sizeof(zip_data_t),1); + return (TCOD_zip_t)ret; +} + +void TCOD_zip_delete(TCOD_zip_t pzip) { + zip_data_t *zip=(zip_data_t *)pzip; + if ( zip->buffer != NULL ) TCOD_list_delete(zip->buffer); + free(zip); +} + + +/* output interface */ +void TCOD_zip_put_char(TCOD_zip_t pzip, char val) { + zip_data_t *zip=(zip_data_t *)pzip; + uintptr iv=(uintptr)(uint8)val; + /* store one byte in ibuffer */ + switch (zip->isize) { + case 0 : zip->ibuffer|=iv; break; + case 1 : zip->ibuffer|=(iv<<8); break; + case 2 : zip->ibuffer|=(iv<<16); break; + case 3 : zip->ibuffer|=(iv<<24); break; +#ifdef TCOD_64BITS + /* for 64 bits OS */ + case 4 : zip->ibuffer|=(iv<<32); break; + case 5 : zip->ibuffer|=(iv<<40); break; + case 6 : zip->ibuffer|=(iv<<48); break; + case 7 : zip->ibuffer|=(iv<<56); break; +#endif + } + zip->isize++; + zip->bsize++; + if (zip->isize == sizeof(uintptr) ) { + /* ibuffer full. send it to buffer */ + if (!zip->buffer) zip->buffer=TCOD_list_new(); + TCOD_list_push(zip->buffer,(void *)zip->ibuffer); + zip->isize=zip->ibuffer=0; + } +} + +void TCOD_zip_put_int(TCOD_zip_t pzip, int val) { +#ifndef TCOD_64BITS + zip_data_t *zip=(zip_data_t *)pzip; + if ( zip->isize == 0 ) { + /* the buffer is padded. read 4 bytes */ + if (!zip->buffer) zip->buffer=TCOD_list_new(); + TCOD_list_push(zip->buffer,(void *)val); + zip->bsize += sizeof(uintptr); + } else { +#endif + /* the buffer is not padded. read 4x1 byte */ + TCOD_zip_put_char(pzip,(char)(val&0xFF)); + TCOD_zip_put_char(pzip,(char)((val&0xFF00)>>8)); + TCOD_zip_put_char(pzip,(char)((val&0xFF0000)>>16)); + TCOD_zip_put_char(pzip,(char)((val&0xFF000000)>>24)); +#ifndef TCOD_64BITS + } +#endif +} + +void TCOD_zip_put_float(TCOD_zip_t pzip, float val) { + TCOD_zip_put_int(pzip,* (int *)(&val) ); +} + +void TCOD_zip_put_string(TCOD_zip_t pzip, const char *val) { + if (val == NULL) TCOD_zip_put_int(pzip,-1); + else { + int l=strlen(val),i; + TCOD_zip_put_int(pzip,l); + for (i=0; i <= l; i++) TCOD_zip_put_char(pzip,val[i]); + } +} + +void TCOD_zip_put_data(TCOD_zip_t pzip, int nbBytes, const void *data) { + if (data == NULL) TCOD_zip_put_int(pzip,-1); + else { + char *val=(char *)data; + int i; + TCOD_zip_put_int(pzip,nbBytes); + for (i=0; i< nbBytes; i++) TCOD_zip_put_char(pzip,val[i]); + } +} + +void TCOD_zip_put_color(TCOD_zip_t zip, const TCOD_color_t val) { + TCOD_zip_put_char(zip,val.r); + TCOD_zip_put_char(zip,val.g); + TCOD_zip_put_char(zip,val.b); +} + +void TCOD_zip_put_image(TCOD_zip_t zip, const TCOD_image_t val) { + int w,h,x,y; + TCOD_image_get_size(val, &w,&h); + TCOD_zip_put_int(zip,w); + TCOD_zip_put_int(zip,h); + for (y=0; y < h; y++) { + for (x=0; x < w; x++ ) { + TCOD_zip_put_color(zip,TCOD_image_get_pixel(val,x,y)); + } + } +} + +void TCOD_zip_put_console(TCOD_zip_t zip, const TCOD_console_t val) { + int w,h,x,y; + w=TCOD_console_get_width(val); + h=TCOD_console_get_height(val); + TCOD_zip_put_int(zip,w); + TCOD_zip_put_int(zip,h); + for (y=0; y < h; y++) { + for (x=0; x < w; x++ ) { + TCOD_zip_put_char(zip,TCOD_console_get_char(val,x,y)); + TCOD_zip_put_color(zip,TCOD_console_get_char_foreground(val,x,y)); + TCOD_zip_put_color(zip,TCOD_console_get_char_background(val,x,y)); + } + } +} + +int TCOD_zip_save_to_file(TCOD_zip_t pzip, const char *filename) { + zip_data_t *zip=(zip_data_t *)pzip; + gzFile f=gzopen(filename,"wb"); + int l=zip->bsize; + void *buf; + if (!f) return 0; + gzwrite(f,&l,sizeof(int)); + if (l==0) { + gzclose(f); + return 0; + } + if ( zip->isize > 0 ) { + /* send remaining bytes from ibuffer to buffer */ + if (!zip->buffer) zip->buffer=TCOD_list_new(); + TCOD_list_push(zip->buffer,(void *)zip->ibuffer); + zip->isize=zip->ibuffer=0; + } + buf=(void *)TCOD_list_begin(zip->buffer); + l=gzwrite(f,buf,l); + gzclose(f); + return l; +} + + +/* input interface */ +int TCOD_zip_load_from_file(TCOD_zip_t pzip, const char *filename) { + zip_data_t *zip=(zip_data_t *)pzip; + gzFile f=gzopen(filename,"rb"); + int l,lread; + void *buf; + int wordsize=sizeof(uintptr); + if (!f) return 0; + gzread(f,&l,sizeof(int)); + if (l==0) { + gzclose(f); + return 0; + } + if ( zip->buffer) { + TCOD_list_delete(zip->buffer); + memset(zip,0,sizeof(zip_data_t)); + } + zip->buffer=TCOD_list_allocate((l+wordsize-1)/wordsize); + TCOD_list_set_size(zip->buffer,(l+wordsize-1)/wordsize); + buf=(void *)TCOD_list_begin(zip->buffer); + lread=gzread(f,buf,l); + gzclose(f); + return lread == 0 ? l : lread; +} + +char TCOD_zip_get_char(TCOD_zip_t pzip) { + zip_data_t *zip=(zip_data_t *)pzip; + char c=0; + if ( zip->isize == 0 ) { + /* ibuffer is empty. get 4 or 8 new bytes from buffer */ + zip->ibuffer=(uintptr)TCOD_list_get(zip->buffer,zip->offset); + zip->offset++; + zip->isize=sizeof(uintptr); + } + /* read one byte from ibuffer */ +#ifdef TCOD_64BITS + switch(zip->isize) { + case 8: c= zip->ibuffer&0xFFL; break; + case 7: c= (zip->ibuffer&0xFF00L)>>8; break; + case 6: c= (zip->ibuffer&0xFF0000L)>>16; break; + case 5: c= (zip->ibuffer&0xFF000000L)>>24; break; + case 4: c= (zip->ibuffer&0xFF00000000L)>>32; break; + case 3: c= (zip->ibuffer&0xFF0000000000L)>>40; break; + case 2: c= (zip->ibuffer&0xFF000000000000L)>>48; break; + case 1: c= (zip->ibuffer&0xFF00000000000000L)>>56; break; + } +#else + switch(zip->isize) { + case 4: c= (char)(zip->ibuffer&0xFF); break; + case 3: c= (char)((zip->ibuffer&0xFF00)>>8); break; + case 2: c= (char)((zip->ibuffer&0xFF0000)>>16); break; + case 1: c= (char)((zip->ibuffer&0xFF000000)>>24); break; + } +#endif + zip->isize--; + return c; +} + +int TCOD_zip_get_int(TCOD_zip_t pzip) { +#ifndef TCOD_64BITS + zip_data_t *zip=(zip_data_t *)pzip; + if ( zip->isize == 0 ) { + /* buffer is padded. read 4 bytes */ + int i=(int)TCOD_list_get(zip->buffer,zip->offset); + zip->offset++; + return i; + } else { +#endif + /* buffer is not padded. read 4x 1 byte */ + uint32 i1=(uint32)(uint8)TCOD_zip_get_char(pzip); + uint32 i2=(uint32)(uint8)TCOD_zip_get_char(pzip); + uint32 i3=(uint32)(uint8)TCOD_zip_get_char(pzip); + uint32 i4=(uint32)(uint8)TCOD_zip_get_char(pzip); + + return i1 | (i2<<8) | (i3<<16) | (i4<<24); +#ifndef TCOD_64BITS + } +#endif +} + +float TCOD_zip_get_float(TCOD_zip_t pzip) { + int i=TCOD_zip_get_int(pzip); + return *(float *)(&i); +} + +TCOD_color_t TCOD_zip_get_color(TCOD_zip_t pzip) { + TCOD_color_t col; + col.r=TCOD_zip_get_char(pzip); + col.g=TCOD_zip_get_char(pzip); + col.b=TCOD_zip_get_char(pzip); + return col; +} + +const char *TCOD_zip_get_string(TCOD_zip_t pzip) { + zip_data_t *zip=(zip_data_t *)pzip; + int l=TCOD_zip_get_int(pzip); + const char *ret=(const char *)TCOD_list_begin(zip->buffer); + int boffset; /* offset in bytes */ + if ( l == -1 ) return NULL; + boffset=zip->offset*sizeof(uintptr)-zip->isize; /* current offset */ + ret += boffset; /* the string address in buffer */ + boffset += l+1; /* new offset */ + /* update ibuffer */ + zip->offset = (boffset+sizeof(uintptr)-1)/sizeof(uintptr); + zip->isize = boffset%sizeof(uintptr); + if ( zip->isize != 0 ) { + zip->isize=sizeof(uintptr)-zip->isize; + zip->ibuffer=(uintptr)TCOD_list_get(zip->buffer,zip->offset-1); + } + return ret; +} + +int TCOD_zip_get_data(TCOD_zip_t pzip, int nbBytes, void *data) { + zip_data_t *zip=(zip_data_t *)pzip; + int l=TCOD_zip_get_int(pzip),i; + const char *in=(const char *)TCOD_list_begin(zip->buffer); + char *out=(char *)data; + int boffset; /* offset in bytes */ + if ( l == -1 ) return 0; + boffset=zip->offset*sizeof(uintptr)-zip->isize; /* current offset */ + in += boffset; /* the data address in buffer */ + /* copy it to data */ + for (i=0; i < MIN(l,nbBytes); i++ ) { + *(out++)=*(in++); + boffset++; + } + /* update ibuffer */ + zip->offset = (boffset+sizeof(uintptr)-1)/sizeof(uintptr); + zip->isize = boffset%sizeof(uintptr); + if ( zip->isize != 0 ) { + zip->isize=sizeof(uintptr)-zip->isize; + zip->ibuffer=(uintptr)TCOD_list_get(zip->buffer,zip->offset-1); + } + return l; +} + +TCOD_image_t TCOD_zip_get_image(TCOD_zip_t pzip) { + TCOD_image_t ret; + int w,h,x,y; + w=TCOD_zip_get_int(pzip); + h=TCOD_zip_get_int(pzip); + ret=TCOD_image_new(w,h); + for (y=0; y < h; y++) { + for (x=0; x < w; x++ ) { + TCOD_image_put_pixel(ret, x,y,TCOD_zip_get_color(pzip)); + } + } + return ret; +} + +TCOD_console_t TCOD_zip_get_console(TCOD_zip_t pzip) { + TCOD_console_t ret; + int w,h,x,y; + w=TCOD_zip_get_int(pzip); + h=TCOD_zip_get_int(pzip); + ret=TCOD_console_new(w,h); + for (y=0; y < h; y++) { + for (x=0; x < w; x++ ) { + TCOD_console_set_char(ret, x,y,TCOD_zip_get_char(pzip)); + TCOD_console_set_char_foreground(ret, x,y,TCOD_zip_get_color(pzip)); + TCOD_console_set_char_background(ret, x,y,TCOD_zip_get_color(pzip), TCOD_BKGND_SET); + } + } + return ret; +} + +uint32 TCOD_zip_get_current_bytes(TCOD_zip_t pzip) { + zip_data_t *zip=(zip_data_t *)pzip; + if (!zip->buffer) zip->buffer=TCOD_list_new(); + return TCOD_list_size(zip->buffer)*sizeof(uintptr)+zip->isize; +} + +uint32 TCOD_zip_get_remaining_bytes(TCOD_zip_t pzip) { + zip_data_t *zip=(zip_data_t *)pzip; + if (!zip->buffer) zip->buffer=TCOD_list_new(); + return (TCOD_list_size(zip->buffer) - zip->offset) * sizeof(uintptr) + zip->isize; +} + +void TCOD_zip_skip_bytes(TCOD_zip_t pzip, uint32 nbBytes) { + zip_data_t *zip=(zip_data_t *)pzip; + uint32 boffset=zip->offset*sizeof(uintptr)-zip->isize+ nbBytes; /* new offset */ + TCOD_IFNOT(boffset <= TCOD_list_size(zip->buffer)*sizeof(uintptr)) return; + zip->offset = (boffset+sizeof(uintptr)-1)/sizeof(uintptr); + zip->isize = boffset%sizeof(uintptr); + if ( zip->isize != 0 ) { + zip->isize=sizeof(uintptr)-zip->isize; + zip->ibuffer=(uintptr)TCOD_list_get(zip->buffer,zip->offset-1); + } +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/adler32.c b/tcod/tcod_sys/libtcod/src/zlib/adler32.c new file mode 100644 index 00000000..a868f073 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/adler32.c @@ -0,0 +1,179 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#define local static + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521 /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/compress.c b/tcod/tcod_sys/libtcod/src/zlib/compress.c new file mode 100644 index 00000000..ea4dfbe9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/compress.c @@ -0,0 +1,80 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/crc32.c b/tcod/tcod_sys/libtcod/src/zlib/crc32.c new file mode 100644 index 00000000..979a7190 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/crc32.c @@ -0,0 +1,425 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/crc32.h b/tcod/tcod_sys/libtcod/src/zlib/crc32.h new file mode 100644 index 00000000..9e0c7781 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/tcod/tcod_sys/libtcod/src/zlib/deflate.c b/tcod/tcod_sys/libtcod/src/zlib/deflate.c new file mode 100644 index 00000000..9e4c2cbc --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/deflate.c @@ -0,0 +1,1965 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + unsigned char *next; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_BLOCK); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + Bytef *str; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (strm == Z_NULL || strm->state == Z_NULL) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/deflate.h b/tcod/tcod_sys/libtcod/src/zlib/deflate.h new file mode 100644 index 00000000..fbac44d9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/deflate.h @@ -0,0 +1,346 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2012 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/tcod/tcod_sys/libtcod/src/zlib/gzclose.c b/tcod/tcod_sys/libtcod/src/zlib/gzclose.c new file mode 100644 index 00000000..caeb99a3 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/gzguts.h b/tcod/tcod_sys/libtcod/src/zlib/gzguts.h new file mode 100644 index 00000000..ee3f281a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/gzguts.h @@ -0,0 +1,193 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/tcod/tcod_sys/libtcod/src/zlib/gzlib.c b/tcod/tcod_sys/libtcod/src/zlib/gzlib.c new file mode 100644 index 00000000..ca55c6ea --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/gzlib.c @@ -0,0 +1,620 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + case 'T': + state->direct = 1; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen(path); + state->path = malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif + strcpy(state->path, path); + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open(path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; + sprintf(path, "", fd); /* for debugging */ + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->msg == NULL ? "" : state->msg; +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, save as static string */ + if (err == Z_MEM_ERROR) { + state->msg = (char *)msg; + return; + } + + /* construct error message with path */ + if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { + state->err = Z_MEM_ERROR; + state->msg = (char *)"out of memory"; + return; + } + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/tcod/tcod_sys/libtcod/src/zlib/gzread.c b/tcod/tcod_sys/libtcod/src/zlib/gzread.c new file mode 100644 index 00000000..3493d34d --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/gzread.c @@ -0,0 +1,589 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in, *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = malloc(state->want); + state->out = malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = buf; + if (gz_decomp(state) == -1) + return -1; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +#undef gzgetc +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/gzwrite.c b/tcod/tcod_sys/libtcod/src/zlib/gzwrite.c new file mode 100644 index 00000000..27cb3428 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/gzwrite.c @@ -0,0 +1,565 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer */ + state->in = malloc(state->want); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->x.next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + unsigned n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + if (strm->avail_in == 0) + strm->next_in = state->in; + n = state->size - strm->avail_in; + if (n > len) + n = len; + memcpy(strm->next_in + strm->avail_in, buf, n); + strm->avail_in += n; + state->x.pos += n; + buf = (char *)buf + n; + len -= n; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (voidp)buf; + state->x.pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (strm->avail_in < state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + strm->next_in[strm->avail_in++] = c; + state->x.pos++; + return c & 0xff; + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) +{ + int size, len; + gz_statep state; + z_streamp strm; + va_list va; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); + va_end(va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf((char *)(state->in), format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + va_end(va); + len = strlen((char *)(state->in)); +# else + len = vsnprintf((char *)(state->in), size, format, va); + va_end(va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (state->size) { + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/infback.c b/tcod/tcod_sys/libtcod/src/zlib/infback.c new file mode 100644 index 00000000..981aff17 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/inffast.c b/tcod/tcod_sys/libtcod/src/zlib/inffast.c new file mode 100644 index 00000000..2f1d60b4 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inffast.c @@ -0,0 +1,340 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2008, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif + } + from = window - OFF; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/tcod/tcod_sys/libtcod/src/zlib/inffast.h b/tcod/tcod_sys/libtcod/src/zlib/inffast.h new file mode 100644 index 00000000..e5c1aa4c --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/tcod/tcod_sys/libtcod/src/zlib/inffixed.h b/tcod/tcod_sys/libtcod/src/zlib/inffixed.h new file mode 100644 index 00000000..d6283277 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/tcod/tcod_sys/libtcod/src/zlib/inflate.c b/tcod/tcod_sys/libtcod/src/zlib/inflate.c new file mode 100644 index 00000000..47418a1e --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inflate.c @@ -0,0 +1,1496 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + unsigned char *next; + unsigned avail; + int ret; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + next = strm->next_out; + avail = strm->avail_out; + strm->next_out = (Bytef *)dictionary + dictLength; + strm->avail_out = 0; + ret = updatewindow(strm, dictLength); + strm->avail_out = avail; + strm->next_out = next; + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/inflate.h b/tcod/tcod_sys/libtcod/src/zlib/inflate.h new file mode 100644 index 00000000..95f4986d --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inflate.h @@ -0,0 +1,122 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2009 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 10K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/tcod/tcod_sys/libtcod/src/zlib/inftrees.c b/tcod/tcod_sys/libtcod/src/zlib/inftrees.c new file mode 100644 index 00000000..abcd7c45 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inftrees.c @@ -0,0 +1,306 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.7 Copyright 1995-2012 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/inftrees.h b/tcod/tcod_sys/libtcod/src/zlib/inftrees.h new file mode 100644 index 00000000..baa53a0b --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/tcod/tcod_sys/libtcod/src/zlib/trees.c b/tcod/tcod_sys/libtcod/src/zlib/trees.c new file mode 100644 index 00000000..8c32b214 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/trees.c @@ -0,0 +1,1224 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2012 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/trees.h b/tcod/tcod_sys/libtcod/src/zlib/trees.h new file mode 100644 index 00000000..d35639d8 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/tcod/tcod_sys/libtcod/src/zlib/uncompr.c b/tcod/tcod_sys/libtcod/src/zlib/uncompr.c new file mode 100644 index 00000000..ad98be3a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/uncompr.c @@ -0,0 +1,59 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/tcod/tcod_sys/libtcod/src/zlib/zconf.h b/tcod/tcod_sys/libtcod/src/zlib/zconf.h new file mode 100644 index 00000000..8a46a58b --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/zconf.h @@ -0,0 +1,506 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +/* ./configure may #define Z_U4 here */ + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# else +# if (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# else +# if (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +# endif +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#ifdef _WIN32 +# include /* for wchar_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/tcod/tcod_sys/libtcod/src/zlib/zlib.h b/tcod/tcod_sys/libtcod/src/zlib/zlib.h new file mode 100644 index 00000000..3edf3acd --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/zlib.h @@ -0,0 +1,1744 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.7, May 2nd, 2012 + + Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.7" +#define ZLIB_VERNUM 0x1270 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 7 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/tcod/tcod_sys/libtcod/src/zlib/zutil.c b/tcod/tcod_sys/libtcod/src/zlib/zutil.c new file mode 100644 index 00000000..65e0d3b7 --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/zutil.c @@ -0,0 +1,324 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/tcod/tcod_sys/libtcod/src/zlib/zutil.h b/tcod/tcod_sys/libtcod/src/zlib/zutil.h new file mode 100644 index 00000000..4e3dcc6a --- /dev/null +++ b/tcod/tcod_sys/libtcod/src/zlib/zutil.h @@ -0,0 +1,252 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/tcod/terminal.png b/tcod/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..d1dabf4546cc38a814a6c4a9d22426180d329e02 GIT binary patch literal 4903 zcmV+?6WHvDP)QIH^g%M!w*6Tfxr?}wmMtUQRfwTt9sg=DXBGGH!~w5<2>Sy zLH18S`On|{7Q17`_}|+PidWayzPe|htAC;xd)*cTHuM}UhRdPW*INDb?`sX6ug}yv z>J!Q_?vDa43AVxAdpp2=eK!J;fW=tPQJkc{-c$zSDfkKS^4DtSnT6D+ z0@TJ;rK3wTC0+q(pM4=Nlme?xk8QiWgK8Thf;Iu0Mkn)ITZ*_;fUnD#)Jqej_QpgV^SaO>8a{=z-{}J zcL3Bp#dJrA-hfTU4mxuKoOB^71mzu=6BASyvf5|h>zNa&OddUf3)7Z84gs9f$lV(+G?>5gAUR{6{ zv0Q+;jdPHb#y#VV8Xk4Dh2RftGO6aPC)IA zNyY`ra}|8$L^U?5H+cuJ1gKymhE|YR(^T`=ngciisFDnkqt^aX-bqrzAO#{&n3#G$ zQGZhc^nEDjUv8UJ%^%J<2SC7gP?UnZOZ28YfZaNZS4n^f*2%8EyLyxRCHBt<(1An* zSbG-e>$Ab%f4cf!nNovxX72#X0Tg>(0gS0VZ?AE$S4G!YEUzOJaw_Kl?*7UF5~Zq| zH~9U}N;+AeQ$trkB|=?WK&&73L5)R)p?#fvHHTC9+N;PrB}96UO27(6Cxd9&`%)KW z$82q^%I~>ljvB0QRBNlL_2U|YtSlwK&V$IeNLQb)@2nP-uRe1%BDJFPtdGnI6hO=& z5|9(;dX3|fBrN?c>|p>uvvy_wkI0*h5Su3@z*1UQepi*VaONDfhPnsU#@6jc&4$D| zYCR}ikAdvFlfu=lhM@>deLm*e%Q|qpw3205(#R z@nd^|3hO{t@b`WOfNIc=s|a*LqE6yo+y1`x_1vzBO3}8tWxV!0`@4(51X{)5TuJ6g z9RLC2im&UNLrQ3; z63k*dAm}^G#d4&zO>%F7Iq|W56XDsth>iW(2CzOyN=C^#_=pUs$*F?b$WSV;bvjaC zB>=PjiNIWq3gp-U+{Q|R6nr#a69pphwi^0-#CrZxX6^dU&es@-1PLfkFg-_&+0UxI zY`k0{10{+Be;-_poq%uc=R4VefKSNwY3)HQRW_+?5nU{C54ESRF%@5FmJ>iRUf8@=L<$b8-JMVF z%*eX&yUTHv0LgjP@D1<=zh834SEENc#ERS3k&8@Jo&fP^2T1Ef`{daKz(m!QVQ-zN zc@hPtL~ssqqAGS@6wCEya#vRCekWNA7XgTmVJ_bQ+tH zgDIc&@`PkR&V(IsO?T^InrIu$g;{vNjM;5E@;Z%15LhlEQaS|KZ zIJ+})ixfZl4p56mzjyn+V$-YG9q;AsmfeQcs8Y?^aU*$@P5nOVI}*m^9YEFQNX15l z!|ydGV@_`<3YM_CHXrRrOgJV=FC93UZ>8VwT%L~&5< zmAtOErvN6zQ6jj*kJ+Om0J=c8Z)fGTm<{MlI0761J4_`C0*E<{i|^Lm-4h^{10?6s z-C)dayAuYbMY4uwI!n}?U5TX4yR-UozyZR+mF4V17Eu7 zY6P%3m7wg-su`Hf+@uD##{rYBZ)K|er)%yGYTaQF|1~hR}%05Q&)+GL=gJN-#%G2Q=$z1-{o)?~yvt`@b!u7p00s%AXJ@bs%*Kcfnob+V^t%arL?N6NgF&i^Or2 z09%MQKVmPMe?8!|z#sd02cAU$Cy@7wu7JB$w*Ew)szRh7B!^OUu!xgKpg`sMkfIp6K?kHT9_Tz^Dci1KC;Oqf8B%jBfwQIgo7i6 z1K6!!`agwM1x&&3D({z{0>ISeW?*cSfK7@3F0XSBw|=GW57vJrP`CH4$Qrv7B)uSO zq^mn2kRnZbzSmKS>}qswh(=-WN9quF`%vNR(&!=;>`nwW!#fGOf|$MUc;nZ_IXAE1->HzTW5`R?*guI6A&5km;?4cD}lKY>FyCbNG(EL z=*QaE?m#Mtqgyx?qM(l5`wX+`laX(&{OlaZSc z_;rseqOZB8p`-}>wQoPK_TNEQ`5i!xK$G(mAQ-`?`BI_ueJ2=2|C;razzlpg1`q*O zj7pg82K`yDZ|CkL+VN8IDU*7gIFd+mF-D{3lfAtOr~#<)E(cRnza%55B9H<@S-o%QxsYd8Xu&3IHyS6~OA=fC0r2}q7WOns@NF_2RSU}|?bIRa6lu)-z|pxyx-z;3-0 zD0v6yF>4GK4-q4AC|CcEq12zK_)`eb+1H!mScaPG=BsOvOyQ8W{on^|N zfPb1>=0KpMrY42{9``s=eCs=3A=Z2CKi_`)_4f1Mx1aU<}RRK-49acrNu zgmVZsn^Rz1eCI$tzq9JpfRjKO%>7wR9{f;y58u zm=gk20Co}U8M+vHUiUeYutHDCha3c1B2%7gdL;mI0u(oiiCo8>ONsQM$LR=gDpcy+ z2|E}GF;ZqLf*=B4iTeoGs3b(L($`aAIHBCd`T6!FeFY z)MQw6AV&hFD5Ie^`|%H!Ne*0_NF=k4c@W!L(BJ?kVu_PH&sDr?W& zv^mJms{KDIcGAR?nv*jQV7Jb4uyK^s^t$ICZ#(~R`}3E#pY?lP>j0_u00w@lPNcY< z-^E5bkaP5=DFr>-0i5f_K%Q>=>)XKv{w`+yzCLS>HE@%Ft)DiI5hZaIMu6%j41Bi7 z-6J8`ihZhZhpVg4oqq*+eHa0H05=8_pt_?}P!NbHCbK^DeC12s!!^`78Cz!rNCi|$ zgw80E%eBb}aNsMePLFbq(d3#-7G->Ojp;-yxKOD`A|{-TH(Gcf@2DT+gd*B62up zP6}f{PYBS#ci_7EkUOboNj`TUMK0IxRA|&*QGiD{Kx&~=^&%CaT(0Q}`PLp}^XRMs zs_vhN%DD*}L6S6#&Ao|^1PSwY1AA;#!^-E>iPpDkJ*s}BXapdd*+|I_q`s~|ceO?D zASnT&U}6&kCbEq0d!m<$XMTi9=G15zt< zDMrGn13aun&nCet6pay=Hz5yl5!4tqrWA0gwO2qK>y0DOGE&lm#;{KPu9BG!5J zVV7rfSmjpzI008#eCiO62+95XNO_Mry|62$uPg9-b69NW1W5zb9_1paKZsb0948LY z$HcVnX^r$hqLhN83UlC3awrlc1aJ*Z0qk)Qc@nZYcXIWj-nl+dqW3wN+Ve?~tbx5D zC^jR3yLdu0H$#;>RkikBvhR!l>G_m+C?32^q5zdtS=K}m&NUDTo<#uHWHcUjA0`&g zM#KpjCV5|pkTBFKUD>m86LmqAQzP;9Ql=xZ%bTv>^|mHvY+EGQpZfb%7ALl* zUZT?TYoDrH5u}q$k#piw)83^uj^cLKjSfFxa{{2M(VgGx3HU5lwQ>Z0Uw3;>+m;u%4yw7tRe-4e-C2Qwyr#SHN6Sw9WurdwZUJc|@8@h}|f*U)AZr za{##WOkC669VxpcIVJ!C|C9t(<;>b@zNASG02d=YuK-A5u=5C*`pk_0cfWof*1;~o z*n3hS0w38ud&VxBG(T|wr4Xr}X49ICdkXjQ$Lf-~{~c4$OKJ zFgigik!x)z76Z%y+(A^Z5;ISA`X+Sh3fcl&E1)QrmsE(TBlepZue4Og!7&Fq~O Z{eKVIk9wwIZZH4<002ovPDHLkV1hh%F~9%- literal 0 HcmV?d00001 From 68d9fe84dc0626975d620f83348bd0d434bb0d97 Mon Sep 17 00:00:00 2001 From: Tomas Sedovic Date: Mon, 20 Jun 2016 13:38:09 +0200 Subject: [PATCH 4/4] Test removing the runtime link dll suffix --- tcod/tcod_sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tcod/tcod_sys/build.rs b/tcod/tcod_sys/build.rs index ce25a340..3b2ce919 100644 --- a/tcod/tcod_sys/build.rs +++ b/tcod/tcod_sys/build.rs @@ -208,7 +208,7 @@ fn main() { compile_config(config); assert!(dst.join("libtcod.dll").is_file()); - println!("cargo:rustc-link-lib=dylib={}", "SDL.dll"); + println!("cargo:rustc-link-lib=dylib={}", "SDL"); println!("cargo:rustc-link-lib=dylib={}", "opengl32"); println!("cargo:rustc-link-search=native={}", sdl_lib_dir.display()); println!("cargo:rustc-link-search=native={}", dst.display());

    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�`{36f`aGP;Pdzu<2TRz>x;E?CeCNXax=mly*$p{$o04^QB#$_|>zLF$j)#j@S&Lo} z)Xsic9Y;p&+4-2EZtCJa(CoD=ID0lL{{K|PALzubyAn-pcHyE|gg1P@vyuA9= z^pHCld};bLU+@u3lQ7B))%F)X6jQ*uk$s`-VYd9SVR(Dc^DgZgo7Mx= z8w{$fw-GSFe`1^Y5xNn!A1rR=*E3ecvbUG`bhZo=CzK^*>2Yy70eQ1WxYHM>Yb7jh z5#X_^`O0gvX{Z!oPRqihG*B28u=(obKnSO|YCMG+LCZtEdd){tv|3XmTGWOc{0)yW zZMRzP(;j&Dx-#^Atma1~E^j9y5DBK0|VzN0!OX^ZH3 zY}B$mWI*RbrdQloZR1zo9TB9cCcHy`J^5(l>?ylSvW3I`3viR(my#e ztZwOXpRU6dNg&FTs*|N}yY&aMpU58R-05o7jKaFhW13ERn|(9!eN;N-dVuQb>xD>I}VJqC+4?yLw;ChIR*}5X+l! zn3v@RBOTi~>W6cRgoyvZeeCF^5y{=#NYMRoGI6>TtmZ${Pca2eEFG#n-T?wX+32>X zv&5u2tGP`R6RHTqwxsLD*PqdpN#pFN%CN?24o6=S8zA9+_{$P*6#aA&)y-xQ^e8< zH&6Nm{}2;<%3bGt&z`b7f0K@}_h3aq%D;0poQb1DA?uK>kjQH`bVoKd3`wE+5Irgq zuPF*GDUrT7JSg~!9(fW$%@b*A;P%7Ii!X#s-cYZ+ng?ra5wu4Kxe=P1Zb2egNcpmF zt3g=Ce@b`zel*dk6h^z45t(U%g)il5W>5h`UjtUWpf}393dd&y?0Qjq8y9{h# zfygfH8@PtDln0UAJ?4-6LsI^?R>5Y1QcPV3x$l#yh^-zX@5jPHuKPgb_3Q07mdQdF z|2{+bjl`!H2ZT*Yid5g;>I{s;I`ZN-r}pmMyKD228;@z^Uo>g23@P8=@k!xd8XH0L z@XAPhQclDQZ^&wo#J1)}h9ayS)IUU@crmwi9aUoqO_idJ5pM$bnpR7Fp1!1UE+nfB z?FV`6)~Gm7s6dD+#4J&PXpp^&3K>I#Y6)OMi6GQhf6WZ1Q6>>obl?rHJfX^h zGGvC|5kMX_2%4V~4C%Y_qjE5?npLYeUhw!fQ2&F*wB82#4K>P7h%)`+XcyzZh8u6LzAtXp{VoRqL~jI6mTR5wFR$ zA}dkW$nWUNDO>r={bKF8v2AOR~i)ONn$77ZW5qjhXy1py@*9F0YLu|&~> zcMlWhjPkThsq?se!e(2#-Z)}4JiY(s4nf7|6<6&_RN&@`7300+btVkRUT?2={|#wT zawqS3%Mk{zo-eNDsIpwps`N8ti`BJjmdU72NYm7KxNp%ToE;KY%j?9WnvN2{dj^7E z{}RaFRBgLlb?jW}Jsr89clm-A_s*3$(SCIjhQ-ejU%9z!`_jx?q?utFh9k=$cgSY- zv#vNLeG|!TfRqm4KWi*(R|OIwCX^!V8;V$hco~&FxRn^J$wIMDv&CFgJDwcNa%%I6 zPXuKrXQ$W4!DI>x8wE#BE6iFd9Zrr$Y^(RdSRby<%6jSq?OpRxl+oSfPjXZpzxg0y zJ$h@p7yE>RCwl7Q@0rzbKZC+CV-_dpC1gb|!Pz^rzn*DQ&&j0DA(gL!#JkmV(;8L! zo?5&hEU_mOEB<@%w*7toJ&5qd|8dkO1OrW+Mj6jKFhP!GhMb(*o+c-9o~bqqtja;P zNBmnV)<>b8q-3`eS~t_=-xCc&+AxNlX< z>}*X63wb!%)3+*k=pq^jQODoI$Ik=e4?8Z?Oi>A6Gl>d9 z;(lm9-*+p2gdt}N#(WybxdlSpe*{uNSPto&%HBZ560)mqJO zNG1@g`6U2l7u;17G%8~A8q^Q+2PN(U=`0?9@PL#86Cr$4hCdiX$m0(R4OqlR|MxtN z4FHO*7#UF7@*QD#i4wqO6D$0|Z?w3IAmBv`{%`n$t@C>D2d+awm}hV7<`vfWq6#~0uROv6e7-^Y(M5f|m#$%=){ZpQG`a1Ck7?nH*j z-1}4hKQ3o7Je~qNPwxndz(S3`y{{xz@KQGV9`8*Yp4EW;=1tR?N2_@zf9GB+hL#Pj zR`YEVx1fX1ns%S4F^>>~EvLdZFuUfB?@(&IU)!QNq1R5%nFZ|a-);LSG6bf z6D0FBd~;#)-Wz+`6Uw_6#x#8Hb?FB$c;1;M+2OzKs`4Z++|eq5i{7 z{m)&vukB_T4d}epo3Ezb4U{5JTHGUzZ>dmR_kI4BmN=K9Iv;J?ogK_-j23&gjV(u* zJeQa}7f7Dg%=t3z`>ZEsTWt^<@n|)IAW8^VI-x;TPE~$r7sd$H z&cKiz8VpMp+I3AK9+mwaH6hY@p+a?4GY~d-Tzn3Aj=;PUjRC%Pb6+ z_TwpCU)hz>XVW;CJKq&u4@L32@S4au2+oi ziGl6`7M*JEQ?XSUj;-9u*vkFUE1iuIV;}u2lWztM`$MKR-SWC098WW6->)V5TQzI? zp-DBq_u3#Dp)ERj;}D!H!_bS~8vcIwv%UEH=axVy41e!gScnKn_fdFe-KK@BUS9lw z3=zVeNAwro+So0Kyk`kf!eO`bo93Bk04vWtQvl(IW|^NEhG)K1dFByNKAJt7P0@X< zKEpG64S+k=1|U{=KuSa0AhnD5;R*fqswQ8%q#MJSqK|VR>*=yO80n^43`WaOjAZ& zb%9V?Wedaj;^I;*afZkh*wIcvV@o7Tpe8w~qB1u3kgo;6&sbtd4W5U?TtPv721Fzz0m7Y`2<;7Bfq7a-PPkHcy>O*KB>+$LtM}|bZ1sA zoCrDO8^eAkn`AuW1#PeDn%TcA%~31Q%$!v_GkA97L>5TecyA@0=ZYm+&X?U~n}#ft zlHJj?C3&^Xe!So#q{<n(Xrw>(f=fM2$SqT)qE4Q?na(U zcsr*%QB6vV_B>IaXU;_t#d+8Nqw_WHH&uRM7sSs~3X#7mghIV>?Tf#+1;mP9^`F(_ zS6yA(H2CC%$shhzCGx`ZtFFdlUBUW~Q~t{tNRED>zP;9(kDFVX-dx-$xj>KrTx#jt z)nW=t5%L~X4Ij@E%L2~ztVGE?Ly{!3GOuCI(?njW`Kz%OAX`J{5gGa#Tg9pEJIh+| zCvZ7b_MSEWw*W|erG}Bz3s?+@aEO(;TL$MPh$A-^Ya+EsX717@Fr~OA<$uV;KQ^)U zb;kB2_$akmsJeWmWEy8rzdI|Ey;8s6c*+H&vHb3(n%AOBDqiqw@J)6O-T*GB0){`k zi60fHRI?C9OP`0xUEs7xLhdaarDFj%eh{)1VrM{(LQ4NydGd@#XQ~QFp|eVNG8!_JlI9+%bupaP@r7!eD`z-4 z@=alwS$Q%M)gtATKS609lB1c_olYbslJbuyhEH%MNPDUgg#<;L{ZCXf!5;ZqNRQP_ z(EN*Kk@J4bYQZ61MkWZ)J&O|A?0@;7d?JPRv#7v zSETF7{xqE|GL`Pn%PCL<&ucYb^m*x1gQAl+p>h8RsnlScsX68UeY)VzcrW=N=flZN zF;`kDS#Mf3~!OD#k(D&^4fd1Sn9)aqI(Jjo2b@fSvUy(6j5ME&n8c&Z_AX1*& z|XE!5I4`fAwTG^~11u)4P08nTJc#@W@0JW>M^i;AI?@wN5ij<2nYHhw+M8aO49 zU;mHD2UH}a_D(JUK1 z50ICFSTL&_^pxc z!~D+SH-i35BVPkn12zL%^S`A!*8j-Tooua4TB`G4M2zCDT)az^-BdXDN~bw01KP4O z`cEeuodq^b%=O!U4Q~(I9YZ_pbw1e=%lA^~b&uP- zZy)R0Q#xHm!8$3Taa3A>5!xBDHH9$MWQ1^9G_& z!zjBpIQK+es`>KOZ7uBc_4xeGWQx8Yv=+Z1dkr=I2yWKopSKZzBGeY!9<-XD5)y|^ zGPw{EAUlb~+qS%uO2s2MP^uZv9%ucUuB?o0$Z7iKEW+{DH%Sg#<5y~Io{7zb^UEiZ zDQs1&WK@QP<>BnJWdpFcR^m(>=501TXLrg>A6rrwAvFz6bB0^ptB!@6JA$>5*{{kU zrn^>ii;Sg+^`cjmKO`|NiT-zv@3~Z!}-0W#S0$B-cAwC zZ~?dOkGC!HHEPDgd(5wqas~BAuHZLG7FMWy{P_!7{-qS$c|R2C-x~IvBjNdk7ntxk z!pWOxJ5i6Bs1qb=rgZ0f^4W+}Rik%u?op>ue4?U8YKIK$<1bO3*>NYzGds{fe&zh> zX|@b-|8=r_3Lht5uF8*;eO><{MTjem^o=Zysk%Zx%a=XJVZYH^*EGISt}p*eGSsfG zv@rz#RLGGtpf%+`hz+cCGmP8-dn5BE@fWV*e9XpeZlFY&h}V=pevGf<1r^%mx7=Yr z+mkXkW#$`uqd0)f^j~&8rym=qcOSx4jr2M{c`d`_@ylMiP_ShM>2#5-^iGFDWG%~2 zr=OHbpGnd3=^#mhwSv2g!sXg8V7wb=uM_Gf-#*V5Dfe5DlpXkBVdo_;Jj@IlG*eW9 zz)xW^hdBLJXD76zK&tE`YB!OKMrSQk>m?bGODU?Z?Oc0f$le@!&TegOeV#ouYw~k{Z#wJH zU7cZjBi4Wn=V*$fH38D#OE-mZB^?^tfftC7WLih2aQ23d-M*nK?TyxA94@X6+b<7Y zYdyPG%j?*d-*4lx349#37HtUIo6it^Chci>=ms4yzUtUs*l!~}9746}y6smxzRexF z%HBdn_7>{NeydkC_Ip}OcLmm>w{-AAL*IfXYz|RqSW6vl`#!xKeZQ+&bBsL#rwqSC z2fg`}sf@@}a!-lU3|87|osHl7Nc_s;fYVPWTqZY<&O9fRi;H;oP|6f{jyjQ%5xgw{ zzIFAvZnWlTi?r;F9uTkC3sYd-GLH|97KP|s#LTI(Nq4=%DyyloSyObJHImbkDGHgY9ueD06c}DcdqP9I1UZUXe{x zB!g*=v?M!7XX0b;F(e{>bzy5|p0hvO6c|3zP43n%+ocQ*MU}16L5d#3><8^GbF9kX zXX)FV#un^ht#-a4>pPw|#@YY-eV3(;%9`BN#)scxEk@~Hs+y}+)jy;Y8d@UVkJP?h zn)>0+x6^sLp3Q}S-i7wmqTH#2fo}1nR(8$cxnPVptD^5@d5Ruvk^ zAMM1_Z*+y7C)hzf%cw`lMh%sL2kLTln$TN&&=X3|-Bvyz8mN{BYd=^IG~L=hM7TqQ^^dzEj93rPluyc|hDh^fGp#_NB6S8J7)) z#Bwa*WHG%Kk=pg3jVBL43I&HDZ@By~_TB_Msv>P0E|y@_U^hyfsGvs$B_fyr0fHjk zB!L7IhzYwWbdnAPvYGC%$Os7mG)9!sj4PwTiO!6J$|$4gh=w5G27(H>A~K2{QH(l9 zMWnv_u2ZMG(}y_ozVCls|NDQx4Nsm^ch&RMdTOsaCEUgS=8~c4c$@?;65Dipcq%%R zfs%nx7V3Ex|x-k?L@#eWue z&8ZF$!u3)f7d^EZ-HSe3kn?Zgu10hyu@d^_0Hop@sBf(GPxhrQOh;1)j(tu)J_xls zeAYrJFRv$Wo*(~&aO-U*=hi%?w@+T8NOc)-_`W;;Q#`( z2@o5^zzD$XBpk*C#x9mOwOD$IQZ*g1L+9cYrHS7-Kq2gYAC+|tD*F`B3_@RDYw3T} z>bc@;{rqA|Z#hLyNq`!;cubHZML+#-m?dp#X()Zp6?CCoV(zf&sm&ezLki2^lK%~h< zBULAjrN!R^L3v{{f^uYr?mVK)sWNJ{O7K?4=9FkG`~hNj60UEj>n6+f;a$P^3F&3J zj6S^F>Tj7@%RW`9y?)gB6|710E zL@3?Zr_rSL_^7DnBb5-%{#|kgrohm9<=DMirHPDG@ zV2euo`k&=Z=QlrMk%6fSFHVi{&UFO-;QdOBTU)~P@oYf`tGbHB)w_ zdZk%=5ZY2yqWIFqGOUGO+puWZrh`-$&bP|M}G*-9DWb zV0(S|5F`Voc*0Bk0YdlBO$gm>Q`J7L!>_^da;70N2leX;BsGS$e4p`Bk-#{%}Xa{%=79i&`mGC(^2U4bXJ6${s*GN^&;+&0` zolN_{^;WuV#6!)zm`*kGOm#1-p263Fa&X>~!l0n4z&M}bV4WSRFO;T>l|P5?LbPHK ztrwBAGVtUSRO-l$FQV0Y83$6)>H@T2S>}WFKDDHv&R~0l`cEzEZjb78Z6}o^GWJ5e zu`+f5{?ygUhd6=$-Nfm7!xhgnO=~vf%8y2%ryt~O*0rjX!TGrr_1nPiWZ2Jw%Kiu~Q z{Y>_N2vZoAzN&tKPqSlnp+0$_+|+3q zbg0!<_v)9Z3N74k`?zH6WJqBe9g{vttpvseydUR^&22L3gE!BL)9J(Kcfp5M-A5th z=B}4O>Leu19b9kfAbc32Tj4uK>Hl*0o`%$a8oqI6_#S*N7{11dI(%&3kTn?pM_o!+ zW+4je|6$=J>eaIEbtrP=XGWL@YV$VDcWQUtw0W}T`|mO3@6xgLrnqQ>(m0GS)^Zgn>SNmt#KcMka%}>+zrCQF?XW3i$5lhZ;r}+z-Z`1q; z$_>-S3g?wtZokGY^Ae5k)c8eOzMIDPYW#7H57m6KwlCE7-83GQ*XBaat?(Sz=7E~u zrsYr5{E)^EY4g+CY{lfe{3-4AsxPGZ>>gh#G;z2HkPdA2%pmq=eA&U}$~;wZsB2N20Y+XAyXb z&eixb0RswdTX+QN4OvtWX#3y67}4xcu%aG|HUxp}bXF6q^YH3|?P)*k(T=M*+Qomy zM)<-SMpfo!|03{LjJrelYIA&DGtxH!%X0oxwnxq81H@{McJ`lMbF`Cx6cs25blot1 z?>+4=2-vEm9J1tZ{Rh%?Foqx4x=BEZGDfoow5%pzvaM`f`&2%DN`lLPg|oR8YaBPTd*vaU}RbY|9WtHfYB zI5m$x(Hx!t!Ql_O!ge;g!U6@SxwfpX>%MFv+hWIUhY8n3&4ZC2HM079yk98!y#?s& z&T-b2M5lN9JU#g>$Fdr@cB>B^HO0A;U;phsj-}o}N~(qnXD=J!AS?fq39I@PWNiMV zOIGctnOz2)2IU#GX-@a{G*}~wn@+>($)p&4MxxU$7E}W+IJ)>ax04uGmuX-~@+#)~ znTH;9iBfBR=vsMpP1Gx}?!-%mYmd_J{=KmX)fEK~JAeEiXV!Ip2=?xcF8IQE*x@Ye zMpmbfWo#vs9expUY)NN1UDf@ar{D&MeG)j^g}xI6aRmx2K7z&gx>O@N5DP0+zSZ}& zCi5$@+)7aM#VlMxmd5hIbd{JI!4ruc-2}J?a96lX2z6bk>|^*R9BT6#WCO zfl*F8tm?jny_{9Op9k9>^?42@2(SxS8?_f^mb!QhQGPgS$=&#Ss^d1Q#mrMJM0hD+ zPh7WFt)6k++G~(j$Oh1W#j_+9UZ@NCvMb(ixJYaU>!^L6C`SoUA> zEicpzxMze)YqrGTCV&D+q$j`YSUHs;T9x$45PZUImA5Ga;{o*8D0EfVRP0EoJHyS7 z8F#{EpU%v>m^1wa3;N@{m1FrAOeE~5f09eRSVq{M)}~ z2<)VPHS6R+q;{48IP$R!|))1+DjaM5K;ASM>O&Mbl94AM|bJn z-`s)Fhbn{)qN}Az{_~Hx{$12t?HgtF53r`18)Y!)jQuC^>$s< zL;|aL*BL%uRvVi}BMO6Bz71b5HQNgaoY9MUAZxeyFU6~QIbQ4L)av@YY35p1`4# zKB2TdDg{Qquxu4tZh%57cINmoB7SqyHx7E}qXGB!hXCqy7q0htB%ROPR;w>V@Zevy%QEF8Rx&0S$iNO z`GfTDclmo~*7j{1%kV}?u$FSfH&p)9H@<$Y@n#|JTF7{Qu#P3BNQ2`C)}Nf>K+2zw zO$Mw&%gt~h8BRhvrmvb5&^s{#XTg^hO_)hDo0IfaX$Md<1Tt#h!DJ6cU&E2+2nU8^ zuzE+ewpg@yC5x3M`#4WfL0!~(c*NPEq|5NIJ!%DNqLaIdrtMKn@uc#tHflK@;k37k zSXvVvFEAfpma#omT6O;z`!!_jWiZItvud$Hf=aNOC}X<-3p|N0f^t3vZC7p7Nce;> z@$pRrM;$F!g@O?_>N<@?716X{=*U%I71#WOfk=GQ?97cj6M;tODZRGYvHSwqV9Ew- zW-Gek5!s8Wv60xLgesG@%>1&EzgGrs`@k^-;(wvCCe!KakRt|j5TYXz{F4>{MT9ma4ctSt{mt1q#p;N)&dqS|eBQM1spW9qoFf7om_x?AXKPylZp_MnD7XT2QJQw?bHzD3KJx~lKsqR$V0E(&%$7Cx{;}^d%SI9HREo>#O!EE#Ul^-BLA1iJ27~kVT%ALS}PHDUF zMsa@bX*xmp4LzladKOcOwL2MpyhkobisA4^>_7w=@6sLZ=ks#a=)ypI28Rfa!+Nu= z@ye?1XTe6smYLdzP#>D6v+JD6?^T|9_^P@d$?y5&*?BbY8K^u0&kvz&$=K&15>jWD z&-A*ho%l+DGw_cdDs!G!F7JTL!*8e8;ghx8#T2^}=;04^`eBPhC;!-rSPbbZqXLIf zK+ST@aoy^``!M7CwGcp^R>?)QB0O)88il|7$=JtgpbWjyDjMseE`bFiaOU=?UU;IT zkUFl=vW51`=`z(L>AV*ZAJLw?uq`ie;6(=Y8tmHwNqT;D~C_D(z~V!tG%w6wA#%X$-5Vv zoZ7_|otfNRaZ1f*eC2g_#YZYZIabu^slVUdPc43-cY%Us)+lHM123@ekKWq+UTPjP zxbE2gMJcQvIrx%eGHZI}yXpC{g?L0OccEfkJ68`^@qDqcdLd$2`HbV4Io)s(Q%}4a zf5nOYM7W*dj0+3@mVRbO)V$0!a4Pbd9q`3?p|R02`KyW#P=}YmWWJwBU-+qo0XBkOszlhxf2z#BYN2q{&QdoTh1M)$7?W;_17MS?vmU`5)y1c0T8tG9Q{SGrz zLiKNc_Z8H)Dt5GDJ$q=q`?TIS9M6pIcKDUB^fmSMII+IW{HP>T-#7h^$qZ~jiqwbv z9?eW2hfHtsHzCtsL8hM)hwEj#p}Zl#+gukLsAn)M`cQgJOQ)J<~Ka+rW14wkkT1Sk3TxNmY*N% zR|>2Ih60tq`%ZU{83d$^DFzn)V1np4owx6 zXTpSsiT;eLqkeyC&F2YKM^B!AMeVz*rgaLab8XNz!SS@S>Sz`vN-95rM5n5wxitAI z_rlb<>gZ(u{Z&Wj`|qlK_b?7Kp|>|_sR{_Xc3)w#&9R~wK@GM~sGp`avQ{gjtJ#O%UYO&^*IG5CP5@rH^nC70IQF}0bBzKoroRv}iIUh1=P7&z?_+(lv z_$(v7nP6t^u8f+`aRlz|t1$;>YH(j;SKvO80)miq=WfCL(mTks!c@mn%vu$uIi@sm z?WBpAW2qk>Cvx;_Ep$5uz6_%po9It+VYOnH7Q{&&xcZSg>ibk_&^%5_tg%mn#@4AL zl#V)l>{EQ>=z)2!4^#W}d-v1(KRWQ?JADP}Yjq7VzUE*$_-%&{ymXL?lMMApYzFT~ zN1ehPJ=zQ5Rv*j>z%?Cx?WjW`Qi8qfwBS#UnwvEiyOda}W8gkVP2aAj$hVG~k(74y z+a3s@FIngqxE)UVy>kOL=|2od*qHM^W%fFjxwOm=j+^H55$JZu%1iLL;(d7EuhoCv zHx6e~r$&q}V|9DtSn(}tM#8WDQF(*QysYFeL-O-lte25|+~uXx+fjyGfa)@47Z?*C zEST_R!GtdhCVZKh@R;;tUT;xJv3NS7l5`_Hb=<_ zZx`o7R-K;59g%R_GJ&PqvEp$&hx*Sg$$T3^=E{2y|5e2uQH=WjA?j-WzEh!N;x?d@ zS_>VMTU)w8#H!B&b?{FGaJ#qw9y)H~mr)6{&OeDMx^uy$RP_>6Ap+YRHeIaUt9qiVmD-|CA`=6n%+Zief3Do&-&j~z8Pvg?gm$19M<+fX0A)_|_uX)4mr z?%mcZ-7lZjg!i+isXHWJ#%UP@AZF)TZ`K_Ap{Ds{Vvf;v7m`-ks8!UjwPv!7CfueoE=GwM6IgKSb3JVd#k@e2RM?0OC(JxRT^9UM;Wep#5qX+)Buh`^?|&E{L>^VIIADi_mQ zzj0jmb>PgCF++{2n|?cE4+MoAGmvBbw$az-Z_*soc0=bjxS6`^8^?;FRAAHH!+J5GiB7`^7eDoU0I zC6`bVo_`A`Gj^Ghrcc`fd32f~46YbU1FoG6ou%KjJU#P@!-$zOD9DpDoHqj`3qS z*D&W0$lD)8ApZ=_NG|7qzrmzp2SeYk3{IM3;)n2M;#TJ62Ta(P0$p@;wm5Dvl+S15 zuj+xLTX+U^ad-10z!<6Ppc2)equ*zEuMU9k1loHRP$--63V;^SZdeA8vHK9~4;{-E zA=Ma_*B#4B`G^DueT2-48c0dUjNVr&&XRpy)CKB!s^-L|p)aD`_r6Hmof&km?cn>5 zR1~WnM1?s(?nZ@~k=rQDj;YNE^3=`C8Jkwe@(RpRG6R}e&yRtD=_wyz3QlQlnMhkz zzo?W^^EWMRm_l69^a7GbIF?TXgQjhPr!d*Ve7|9MgzJ6qXea6SP0AKo-in6~W4 z4b^%;7wW$)R6QXV3IaOLytI}5q=eeN^aeS(o!xEB;qvA+%pA>87sB0eab@3{qbL{H zMI#)yo{Cqv=1?d2hlDmu%J(f9cv#H>FdPpx$E9QW8+hRBHSqZS9!%mV5Z!+uH&OPc zw618Y{eBZ12*=GuU~I!Kb=Mx-2!t`-=C1jqlOy$=z-TmZSOB|p)o6)x4xF#Q?Kf}_ zeX(WG2d8L=Q2HG+(0W~m=S%QBt@|~w1E%>@;@g0OPwPHG$qiK8ans3KTZX9(FZ00N z3#Kx>qfB?3=bwv9)B@)%Z}P_ye))bORLJ4qHl`ZBxxf%RmUFnjTl!DOwPc;(QJepp z-N?#m+bWOLV7JlouMjnKr6A!yk16fAcDGeYD68rk45tWgin2D-0I(`_`}MIdJE5KG0^`2*fPd6L_IP4h9DKcM+e&5vllx6DkRZQ8sff?uc2cWHNzYqO<)zQ&Je zeq8hMrKVns4^`%1e(~MKuOqXC|KGwpb$0w>R1U=UoI?jqnj39rD6>oRUlfLAcv{kJ zr1?OCsUNkX`c)*hH!s#^G>GcAEW*4>o6(4=UvY%_4sGT*gTH$s%nxcadSUAKrwH?U zZN{38`fZFbZ`Nk?iq&s>gn6enW3Zrpdn3#rX)^{?>i1cMxmBAn;8efwBFsN&GncW{ zZ;+XOmifTzPL*G+nu{H#+0fh)n-$wbxhp@@mb;Gl0qri~Y}5UL3$*+> z|C#)(KHA+yCU3adV6@qUr_HAFG^3%Bcz^^d~6W@NeYc@Pr;V{X4mkU+T&7@Ia)TW$|x# z!kfRGj{innbSxi=o=Us0^bXhQde-#cswcveMalgZ`GiW~yl^2rXFnY&7vZ1-W5?lb zFTn7G!qnc*G`YkqQ7#sW--;z-saRU|TTv{=h;E__{-ItK2Sh6h%Q0~r87-@1lRR)- ze1(tP-c)r`6pn6L33x5XMS#y>(4fM zd9i-~YD_M4JXqh7W{o!8b)9G0Cunyr?T+;#$+$wtAJ6}lp8>~AUR8#|GP6PJ54Xo8 zyRho{28RxJm^`)&2&>+m{$^pv34ArfJDrhb{w0GM9gpOILmlUoE^sw zC=qj(9Y34+*>?OK;^)}$Uc`IZ@!rIH+wpUWpKHfif5)6>#|`3!9Y3G=`F8vQ;uqNQ z3yEK7$NLcPW5@dv?`y{|B7Tt_znJ*NcDx_)es(;bc)T6Ig!mK_`X~fg)_!#12?D$yXW9@i4@pL<$K|I5bk0UKAre5ihdibBWKjlJ3gQI zd^^5?_yRk=koZD7zKHlDJAMQ48|?UE;*0G#hMywlw|1Nh5HUB}@g>BU*zu*rm)h|v z;#GFMns~JxUq*bH9j_r?W5<^hUv9@&5MN=(R}x=o$8REjlO4aA_|0~_mUyilzlHcM zcD#;wogKfG_^oz)74cPe{5ImZ+40+n-)_fO6JKq|e@FaxcKixtLf z@!u2wy&b=c_+57VZsK>_@q38hW5@3$ey<(BkNACd{C?v1+wnET*Vyqt5dVW6e}MP{ zcKku&58Ckt;th6uE%CK>{2}5G+3`OT|DzpmB;IJpA13~=9e;%QBX;~x#Q$W+|4jVP zcKk2I|6<1A1D5}9e;xO6Lx$(@%486Z^Zv*$Dbtr zq#b{X_)~U#1Mv-Z{O`p7ZpWV{{KVZi{CjPMkJ$A2LHgB|~o z_>Xq{DDk6q{3qf++3{n9H)kcYvQ};#HPAi#s~NEqja4`u|w?ogKuhM+f-n9pGnlfCFy#i%6d; zYcVk*e}lL!e><7#R_k>l<}b=g(0zl(8Lx1By~cY+;H?^u>j3W+ftPFd25@{~stQc~ zEW8g)C&K%6fL|JcD`ohT07AK~vdk7w>;NCs0Y10`d`Jg)QV00Z4)9?e;KMt>lRLmi zbbw#p0e(dX_{a|MD?7kPb%47%z}+3-qdUM;I>1vqz|%Uw$8>;??Ep{j0MF9k`SJPY`f#@eCU5wiX@5ZT%NLpWXw8jA z(|-NECg*-E{@|_pHElC-%iOP}y}9B1*g3Ro>SglImP5_0n=34MhraE>GXKi|ccnmX zYUa$z8L4R#QgbpUr{xHm-IG!?EOWoo%Hra9?5n{wHh=!%{|@@*$NxMYbZfbPE=zzltqSA1?Nu~2j%NCRx$Wy~hA5ip81+i~v{oIuWMNsISUzG1P zihPErn4wr?l$Co+y#=A-Fmp^!+SQZN#-~gR$0p=txhIOO+|glRO1gXe__WMi(}zT( zUrAYMS-jyXEieWd{d|6Jg%`&BIiAu|Z?VttRhE~RRruTamFv#R&P-DpSRN-JEGnG+ z;*D~T&*v>LJjVD*nVCkur?@!JlRrR0nLR=8AY__ zrYZa{(=V%Np-#RLMx`zjW?bP@iN_!A{(s$br_NovMs+(W`s7nijp=@x!`b8XGkV6J z`J1@2&OWDC?{m*H&cEQoK7B8`xL^Dw{VyFb@Un!&L4$`R4IMT-dBo*cjJ$G`%RM?J zHEqn;^o(&=WoC_^kbQMd?!-xxr%atT{hArqUN>`=CojLiTR3}8(cF2(C8cHM*H`%b zmGc)YTy(?Y-`==nX;t;In&m52-gI;AEp@l9y6yJWzq{kk`rqGm_dWOCcmJ9{Jn&${ z+K2ww`0yit`tx5N{p-5N9)Du}-=2JG!{48NX5+KZ{p0yfFTB{axp~V=Teoe0`IT2+ zdws{wH+JoQ^R2h{?A`ayyYIdK!H4@lI`Hwqe}3}mq0a&>pCA6>%OhX4e*Mk2|N5@& z`yYNh`qQzWkN>~^n^aoi%`cl>T66;oW)a>J|DtlQ(XX`3Z%lDd=6&4imr_&w|Usmo+cWQP@7RtM~u&^k<$Xn|7(P>t8+E^pgvj{K7U{$9@ zsI&Ai45qzVmPZ%~3;PZnvQT>`EO&hi2ILj_4SL0zmG77;`59Sm!wf+I;#mOi@;#+S zS!wYi12t3u;@h_%SXo(0!}v*fW_@}x=oAp^SB}9rp61w@<1UUJ&j7`OegirS#BtPl zpbJ2KK}^R1AdXu&hG2i5edr8OHfSoy1DXe#4_XGg9rOp#V<65a?*?&RigOM;!ZjFl zH3$b%#66(Rpd%oovk;R(cYydExn5m_CSpvj2n>4@k7 z&=y2?6C%3{k(G#SCL;PACIm7O(UTC-BN$Y6LqsPcq92?i#KY$b@$~tKKO*{SKOsK4 z6raAr!0jpwqMpTo=1Dj1DNM%)?9utXeu@y6%@Sf~kq~*PndDML<`;e`sRME*WU0cT zn=I3@#(kA}zC~zrN|cMDQZ%8SVwPp3Z0USF78u%PK}FGgw1A}r-i1LcpWjnqwz(B- zWGspDV$UL@*jqZ=KPQL{gRUPQ|0GyEv{#tq(zGS#T3X5_j@XQs`}oRD(W%&XF-E?VC@e4&Cagn%K^g}VfMD)id*a2doxD12( zL=^bJ`0j0z7>Z&)TqKJT;&K%Jk>W}*O1Q)|VurX@TqkCVSt$PSO%w>PC=|2B98o0Z z;&mt%C8AW6VT<+kqC)tDUsU1+S%3}Ki^L70z+3F~d&PpXisAwzLGwh-2WdW7^C6li zX+Bi*VVV!uJX!O^ph8PyqNOs?(wS%}O|-NoT51z5y@{6ML`(A^OYk$^I%K!U`z90OY>k$^I%K!U`z85OY;y* z^AJn(5KHqAOY;y*^AJn(5KHqAOY;y*bCRVw$+s8a%E{jnQjkKJRJ3KY>1v&nHoY4 zP`wvDvb6d?X8q2Q#l;KecuVuW7n=$um8zi+M9mS0Uv=I}**XE6R9eJNk(e}b%y2O& zC3jG$ePU~C^i_Q|YFbcKI(X1bb`WQBFggM)soA_jt>3%Qf0^n#vP;;mnYPRQn*eh> zlQU%uM#y8}SHJiX21ZayH=O#~qo2Ot@92bh5xK0GOTK%&UVoiIQ@n#nwI44MeKHCf`& z(P`RfJ|qs!v;gw~H8`D{Z15oM+4u=yxQ?V z)p8rgtE}e{wVE2Be8$9?6Em{Xa^mquVi-*ivf684 zrB+!~0flP*1!GFp#r0uyVE#rIW0Zz^F|Vl9({$pfHPkbt=l z_%6`uZ;r{|gC>DyfyzNuphmdK26uf24vGRfK?W#+&)-51cvIUkxfQemv>Ma^S`T^? zc2(fzKOB>lpeoR6Py=W^Xx8_~WIlNIQTPE$02v@BNPy1x5pKX^j{yfIfLx$#&@7Pn z32wm?BydnRXcnj(R0R@0ACnh=_r+&*589ApR(ctTIufm+Y_Sqg9`$N(jr z`m@}1`p@!?K|jj|P*dX1@*7YeJkJ8T`U6XVOvG>fjle;bpeoR6Py=YvV)zTbYboqO z>p=~m)u1YnbIH&00I_AT19?H^peoR6nycV1u@%5TNgx*}8#Ie%Th9+-FC3%8*4pa#%tP!;IFJs>{chqM8egBn1qL9;-VTLHel0rH@49)v&O z*`O*=`TfujEc|1Lj?iB20K*zX5tdt3g$ua?mVL!{6W@{NZQe2Gj)F z1v&s~1vP90fj2h89<+5c;sl-qDhKU(?q~V8Cg^$tW{}tk4q6Xt1vS0=vuu7HIDWcN zL`z}N=#&_k;TI>>jD#?xsHQnyinZj4@Q6HFii6~Ci8%xO#>r@dJV%<-mD6RkhvqyP zt>ov*XeIBH(Mo=?j8^hBl9MR7q((Xo@_OlXk*|?XCEqBWN`9SmD)|l4spL0Fr;^_) zxtJ})4jE^V?~!pX^8GSS$sdw&O8$t9Q}S&xPRUCdNBOP-FBf^VH2BcfDGe8SoHQuk z)sP0|yT(g{@?8_9LHVx9(ophl84siAI!?wL-cqQ+X@k)NN zj92nC5_2VRUndg{@_L!*B3~mDm3*U2RPyU&qLSYr6P5fXnW*HqN-i>st~+G1LB2;O zyU6#;WF>z{CM)?PGFi#D$z&yu55`eGT1YpTh>n(SgWM_IF7i0(rhK#^-IR}xmu|{O zCrUTvqm!ju$-Ct^7)A6rInE%@k>gzC)8#lNpC`vD`MGkOlK07RN`A2%r{rs74xEeV zI+7#nqvSWq93{V1PKR?5y+ckn$oI(UF7o|yx{^O6 zrz`m*a=Mallhc*Fl+!66BV-;JPOr*5gWM_eT;y>wkMc2w%%glvyv(C~Orp%Ad`z;; zQ}S*(7e<_Bl5-96968rTK3&dL@_BNulAkN*DtVurtK=8Uxk|o9s$Oy*4t)+zbLvQEj@$a**z&N^9dkk`w47x@}lujCtLy^>!i z>y`WlS+C?b$$BNfRjz?^;oKqD803588W;I~xkkw!l53Rw5xGXmx5+h1UdlC;? znCKZT8x3-&Y;=*w$wtceG-M;?d&bK~%J)n}rAwYH8u2b?pxlYM1mg|&!jobj|qGz4lV360#4KDIEa)Xj@lpB=%I=Ml~Z;%_5 z{3f|U$#0dL;9T_FAvYQ1d*mh;`F^=c$sdxNl>8C7Ny)cKev4Q1lyVd0TmRps)Tke2S#Ep|X4DuYg!$m$_?ojf1 za)*+iD|aY)pWLD37t0+=zDDkWa}if3_ZZ~$a*vCAjohQ;8|5A)zfSH^@*CtHCBI4T zQSw{memEC#JLG<`9#Qgn@`#e3 zD~~97pFE=E7t13`zDBmex#(3V+YIu0+2$f&BiodGqij?1>tvgf-yqwR{3h9^=I_1>d|duwJ_Vb zwZd$xnuXcsK;Dg@qOvvH03+J0%U#iCo$NuKO6%%qvyNOFZPs5Oogi(dSTg zh~YHr0+-W#r#*NVX=_GdJc(Ki}L zZp6zRa#y^ZPVPaQL0%m%=aR3Dmp=05c)6JTAnH_d^r`B|jYL^b?n;zv$UUfQ$g30O zI`XxNaszpDqTED&5bq*6`eHlCjbyop+?6c%lY3A`$*Ys)5%RUkvW>hsSxWMQ=)HGLgL5EtARd`6f3x`hMfcjd3!E+%-;4C-;n# zyp~l|qirN#J5Kt@o5#t;&T59Sx@fDk!#33IkJ(w8g(l9+8nuoyg5g1 zB0rcTw~`CgHRQ&0xrf{}UG69MOqYkqtMM+9ubnR2$eX82Rp1X!mufYSebgA>MxJz% zyYgflxhGE=lCax1w&T}o~& zmV3xui{*ZD&tiFqyc%^4`P#*@jl6lWk;`N10LCP&|W9Jzr$9J#AbPAB)&$vpDvIyskoE&4d*&2gF!URqESYZ8yIVlyBcL2xu+3>Yw+qu8Be|zeR1;U zMwv{0uu;0n#X32T+&~|d+_g?lC-IR z(oK%B*En)xhs+^&p)XGE*&*}Dt9Qt`Z${fsevm`|Ux)ul zgkOjMzYhO@9sc7z_;vXI>+s)&a`5Z$|Njree`K`!{W|>TaQN5Z|F6S;4vT*s{{K4s z=kWN~;s3A0e>HsmzjpYq$Ns7h@Zb6~I?EK}Zatna;|@TNF$MeV%NF>I(OKDQ^B(uT zmy}mv_c?Y1SzzP|k`o+~gHs(UoYKfEFYiz`v~SVc=2%q19i`agIA{nZt;o5J`9%d@ zy^m0BbjrhiLL64f^J0gT*I3}GDCbGLk}~deN4P61eAsz7hi6^N@yFUhRa^wOMgBQB zk(aNWXb-SkG0cNG9v>8ABPDz=9gOvqlz0rBAt*OWJf%hDmDrkff^AT6Ts2Co6bIy2 zF7vruW5M%bVggUHVEg+#p9+rQ)8`Iw_yxPXDhjcU-xoT>P*z!y?=|wc2Mfo3{GQU; z#f&6=*7=13uMa08%rKqEU1&e4I=~R_TziKjIo6g_<-})tYT26J1^;qm*`#vppXJ7| z5k~vte_=AYIxgnsG?p^t8}*|=6;xtt?Q9h-kvM?Ggpp&xD^}%k5wf?4$Ct3rmIo2} z8}c8zL%A+C)nTt%Wohudla;vEL8D10u<{g_&+#Ceee*0=Q;G`wa}1UzFSkPTh4Gh_ z8O5H8*|7V$3QXXAD6vAmx8VUWrAjaib1~x-3nR* zS_gU_)C8H=L5Sd3uitIyjNDczw5Jj8W-!LV_j5vS@D;Zr8L^eI{h3l7eRaN;*<`&( zIE;pUm)M$Fj+3gzM!yQYYpQ}=Jbd85frAI#7$0=HpnajRf~sm#>+Gt|FLU>E3AScJ zvpUDa{gx;(NZ#4SqrJ0>N_ANY9++j~GgAsHOHn3Ji2M3RfKH)%)Y22Nce}E}OA}5! z6^wx^Jg1ZumsJeGF`VMmA|KyoJf*4ET0PLSF~ya>IpAZxrCNtinf$rP*3#K{&VDqvkE5sjS@0LGw8Um29cbQxh?D@EM+m zoWc<47EsVJ!k1E3R#7mB5rQGDbiRJdU?VXo)r7M>Jlch03k(XJ?h;2f_LE{ zT1_tUF5r=7fijmib>d7Ml|n5vQ)RT;$-^uNroTS0?3?33i)hsvf`uroEUF5?@RpWU z&Yq*rmh~-I*w?J6RDQDF?>a`e39i9|zYVqx(iA1u(bya$_ZfBX9YaUo{u&zydGrO z%yXEiQOxRDnCBT-EzwpT)l{2+OO3>#mkk$kjmK*E1 zxOIG-M>~QqyE+D;N`~Eisds^{badLEK$5L)_^l8Hl_e#MSP;;b;;DV5uKcn7P!dN5 zuQKnDNXv9j6TX6Cb=rJjg=c{(OhNlG8917-K^jv0sgW9 zN}<^=n1_3AO5BhduEF$SA?($lR5%OM4@l=!|V@DX1O1%qlOo#U!;EYk}%t1**dCnT)W(~`CvVD2i z^(6d96+j7nK3k`fd87rKjl)ufRUMC5Vdzm{_I_D{`xXrBTX2dMqy=oD{AmmQW-9p1 z*2$eST1-Lp4Q|%kGtGBJzJ|*Zx*ut?NI`)GjcaDb;4Eeu8#g zT$ESg!L=o3;$>Hq<+}?CIC@j*qi*0xF^_!_NL6QW!+N0!*t6rA!Q+59FoyP0 zYmG#8hN<^J1qeruD~fP>#A?8-4vg8vhVo-JdiSX*s@3F+WfowzuNVU5V|+H7nPv9E zbcGnI-1S==eED=CBwV&Yg(&0?;t!upE9G1Jq}AaMxu@%N1T5U^uwtaW3Kb+Pwb>)m z1yA*6i{`Tcs$#6WRxG*fc=(X8GnunECq7k!B13cl=+_mB8PSgk)9kPstdcI$=r%E9PLjGs_0vA zDLQNUs046;GZ-N4TWZE=jQ&;E+iEmWM3a*)OCEmN_=%SdLbNVRNi)W#X6W*U+e(UX zHII3t&-qrqqS>r4^o=pB*HcwXmr+`ddxlEA-U1&E&(5w;_X`CF7Ufol))!IHr<&IR zvHrB08#D&$9p!{U`#z)yb8R0Oax`HL?83vO?jur{bu1L-hyx6f$p~{~Djqaq1ZrsW zIoFR1azyc4sNdcU(T=cZ;y*{2kL||T@fXON%VApDydNjDFpL;sVrKMD9KNe7y%mdsnZron7pB#eRq;s0)hA}%VY=$b9jbK1 z7sE1paSbb1>gb+UbYlNh=VN@CABSIs zQ~(nP%$A3G=%eo8K{JL)qEf@VFdxHhUSQ(M$Aq5G?Ej;U(=$Yd$M5&#&p~>GVd!iX zU^>&QlnhtbolJy&yvL7!2- zh9v>#;BWP=u?umgt|kN0!ognS9Q9oFEFamf$8m_{+*Of{1Vi?Eao`UcpG z6Rl>KIn>AlE-Wr8M`Uz*SYcxQN1Jjr!(o=#?Dk;@CW?0<`mF7TqvnWO$4^IynN?84 z`@YZ`n7M>*0&5mE$_*QuBkCx@!RnTir+))PF$T9sP||gL*C)MHu^lqY&Gee zUxtpV*$`Rv0(I-u7(8M``--ODSa(*ITODnK{!n_W8Ep3U(CbiDw*qo7qm60B4&9-W z4R;q(7xI1#vLZ}AWRb~h-t zOb)vXq!=2m6x=nzl3G!QOZ|}h?P`ONR``ifYTc>0K}W|YRb_8Mk-FSY&(>NmfOUJI z3ZHUkl`^08R$&DK!{#z{a?6X*+eJKnNgw8x^DBx}C91vG?tekA54S0uD1FS>V-8N$ zJHeC;o*zdof`y>cveE(Q;)YFi>67D}?ziHJr3+5Nu!g)89TGJX!FaQz!@L}Wn-jzG z!|Xw*jNl01zuaY0=^Jd4%$&0I2y}wA%h7hFs9$ytE*s04X1*~Ycfs<6!eY;VtG-c< zqm>}mLR!w)(Ru={eQZsCv%^;hZ2lpCP~a>#A?sk_$BZf0UBWbLL|zVmgn z3ID?T0x#2WH4CPad9xO0fPHLW%swzXz=j#TsXC3@u^(U}{o+slqHS=C^9fuXz`bXr zU;O>|)vG(;&ih5>zZ5!C@Rz&~Wvnh+$oKZOT?kk8Xha^-fH>i@O4XfdH{vp;n7*LC%$+c4d}>&)G?#ru^95tr!^2r*wb-W& z7+_@htWs+v4NTx1I658}e&S*yKi6jpMhSPjyH~M%h!y2Sq$*<1__w?z}e#W0=w1wJ)gI8jZd zd{^n7t8O2hp~I_l3l-!H{Wv4bTTtZ5@j@4t-hDHyr2!<+4E3Ko4A@z;EFjA(2}3Id zeGBlqOi0TbkHsnUr~f1W^!Tm_9-@JnkK7MKET3jTsTqvWf`wkXWdXB#q_$$y&lfL7 zV^OidEHs#gu{4?m(;AAHOFbAACKpxsaZ8;V{OH71)4PaP-XcFjgq<`VbNU-vET0X- zn)NF8c`FNeGaGiJnB%!+hG zzGUd0_g?&D)CEIM&wOP6KS#wrlX%MUZvPxLJg>6!hT#WCEx!83D>hbqJjzk~WAW6# zTl4MDKB?*F8Iwk&%f?+4Q#pPcUxtD*U~$`*>_U@ zS65EEYQQO^wiy7aG4){MI2?5_Kw=dBx6vUQo<^y1D@UnL(s zK6>DxQD$(g`@DZxs?8R+x^z_Ps^FE(PMQT`^(pFX60p% zGLfDx#j94jdZ=Hu#+|N7>i4iVM{Dy|Z5E~+?i>H%)W_?4Px?UNRq_oJe|cAv(ks?m z?oA^$B3KV5x8m8lRO1o$A@^2!I`oH8gC}I4y1m9+ZxwFTMo1;blkGsUpI{x}437g;Sv3{B9|EUq~yGNK~BFz0F z;&VxaIX=Q%-oJNQ!=AA8SynOWinl`MZz9s~{0RAfMc98AVg6@?`JxEw8ZY?dq|158j`RAN?a?W&cx? z9^2L9wnxOQyYK$|n!H1)({6b*l)w2A=2>Ut)P~zHgZ;p;_opVpToqxijxaZU|M6#U z-W+=0JQ4b9j^1~1bw()tRz{eYN0?Vcn5!e+_hk|0nh0~kx~~#vT)nHuUmivJcwV@3 z%R@O+6TG{7JpD&ZOH?lY@x90I%TAsQGp<&l*{Y}hH}P-98Mt{}h%1LjiB8~eXzG^` zB?<;diH4z3V*M5&${)aYxXwi#+Xo!fl!>D-MQ{w-g$c_BP(lHoXTvS%0LCK;m~(W3 zH-N7`8%LMUGK;2(wx>*2@x`FQp~&qC-N1i1&{_w3H% z0CpNRGH{Hk?;`QUI(`s@B`$`MOYy3LY_3h&HC%XD}jMrh;IY*tw-3_KY;Kf4YL~%XYeYN zW2FeB{fYvj=u0a@(rcKk~4r!mA&{^z)ALa0C z{U|(N4tu0&>ld)Q0bztLaXZ3^JakS%*pc@M&4?GmT7~$OBRARnk2bUSD* z=rPcfvyI5Kt9mTp!-070X+-a4tgKd0{RhjQVQ|`bO~q_ z=xWd`&_d8k(Cissr5x zdIcnP`Jftks?w>niwO-igbLDWt_N5WQr^?UQEEZ zS*{k?2_z~x8VygtHtlc9pX+=FMcoX5_gMx#J%D^alcrDFT*?_9uy5?t#}9(TcdbbJc5es z&*CrWsQgu|6OW0<#S>z^_?viAJS8@WzoYtkMr;(%is!^X#PebkzA5vfXcC)6v)CeD z5?jSKv0c0@UJY>#8|Q z2+dSe-@G|G{C)xu=rH(i)2us>AFzRB>$M6KD8DFCcN=1Y&;sBCzW@4Cn z5AL6(mq2+mCR1;+4MN!Dpr0{qiiLH3I?BRA$G0qJlS=Ut28AYZrqIh6nuQwE>)0$E zia*VKQ^U$V7g~@I!Bn9+RLo!sy$CdLr#VuQyBt-Z!nSl+0CFez%0i@lW|=^{5MePm z!i-7ab_hzar5um$;4{i1x9h1r@a+W5QjApz9ma_`{Si!&$vpO!QCetz`v?J2KzKF- zo01iDk?!#gP92ZEz*J@#u$$a6yK#U1WN*G@%*vV?_88_aCv{?Oie;6XYZg`L!{ZQh`8D5HLj;J6q z`F$5|dr{i5Jmpr&HXqHBZGFm7xj~C(#oSC7#y{kzYW2d5UT?W75T@H~eD_8fm8$H@ zl6ICj9v89-~k{xcq3RRdf=n@M#qtoz}6D6h$_=ZWy zfbWi2hRkqhnQ39pGSh<2%!4tg)U;R$&ZULAB)M3b4$Dq7Jy=~d6C2MHD;5RYWf&*( zb7)Ep4B-}h4sWkn6$jfT7~0jBG;>EK_nk2&mf6e!nnJbd|7q{~V;j4w^o{MZX0|&R z7Agx>m4N}WtATY<)eY^6i(bfqj%9; zj5Dx-E`%O28(=La)P3MQa3rUdVLUnqo9*3rm+}}at$Z+*vDCfF^vLQyVZo3Z)03Ae z!k_5O0OIf#>|8gbctw!nC84R#r9-MWXXoOXgI{apimpn0t9nvXvzNCUPWYj#MX&bk>1L&lADuP|#sw5t~G8;1&MIwUjB9UZB7lG0Oc*~b4AIUHb zrroraKN(NL`OHjJK&#Fxor3VA@$mCoYT(m8`HgKp1DCMQZ~u$bB z!#Am8lQ*fG$GW`X#hcW%k6}G(yvqwjP~OLHQdcLsymjybpXkz7-GaX$|2px=L;LgH zM!KJPf;d486H~-A@hM`B_)X&T#FvS`Bp#hI^&TVMNxYjlLA*#z5uYR$h}VeUAzE#H ziS)k`uM?fqrrukK?;(DOc#e3H_$cvl;?u;d#4X~>#D6C`{iYr_@i_4##7W{jaf$dO zu|~W`{2uYA#Q!2XXIKyMIPosx1TjW@jQBLMLEI$1NPLBOop^NC)Z-z(pLj3vL1LKr zDdGyz>X$s}XNa4`=ZP(1n|Pi0hJdO6DDf7ehj^TLCvlK?FL9jsATdA;6R!|c#K(zG z5T7FEi8bO?;x*#4#OH}WB)&xa7h;=uo#+U%eZ*Ucw-Nh^A0VC}-c9roA0P&Z5u&C4 zPm=x&F;9Gk_$={dVw?CX@o31%`RBwF#IwYQh+*QR#5D0K;#K0a#21MzVw<=}ym`*l z`%a>lc#8NCF;0Ax_&D)%#0v2mahup8zCwJJcx2wx>n6URI7l2PhKQdcK0(Y8uM#(j zFA#rDY!ht@ral+(7|}}{B#sbgh!J9n_#`n;{4()b;x_T;#66-lPL5nOa@#luFbB%#?LE2D?Q`O4_w zaK18n_(RWE-|agWoYSksvLN*fp=8An#Ob9W^(&$EE@!>?B`jE0?^;NTyAbTEH^eZz64FxDB+(q*wpO%|7{eXr7j>M;5Pe4@mI=&FjYb z!0VfYvrl4?Yt$w|QW&#OowLdMnU<4c-KlhEa|!SqHLX{i(6(utVMmX)J~s_bTxIj=ghI;xECi$m-I6RM2KHevl0(J!9A#g?~DB*rSC1R$?== z>|FPV?y=-3&MsmSlW;P_H}cK|)V)1iF6gWKZr~xKniQ^H5*&XdhAKZHG{UUrUqev!4*p@gVUQtD@NL`+L?3z7Is z|0XnT4RUF{*Cy+E3%a`ws_K5*NDzzF2ieMJ>#++$p0Qr~0$vhj)1EPR!7E`ricpfl zlW=KQS)0D7eQ+ih!zy0=u0?{8?n^d|>wt)iJz_{}{}f}RRsUqsoi11E`?hn*FwFdx z6~qke7lbRTpW+$Cs6Rgv-bgfh>2l1)}nnpoRF^527xQ~-&m~rjGfIwX-TmotF*<@9iY^TUDkLHc<`vF z>{eHeM?3weYIeO`t2^hcnwr8cizp&y$wD@$h3L#wNJ24U8{(9IF)=r#4`F}E)Qkjq zOd2N{?1%i8nu7aNmwpa(JRXVSm2`bm3mAe>$)Za4O=(l{7l5*!dWUU_wSC?u3$Y8c zi@2+QQK!QX$5m0Mu!yT(uub6&-#A6Rgp@Hj=k5L(iGNtP`;*a-QVl`u5q-uk-iJ|0 z{dIe2Rxc~7O*>*CpnsM6XL~4&D2(d6_7E3@zi$uWh89pS2x5%>KyWFhcI=@eZw5~kGmW(T5n=r+7Xr?8Z)-YO|E5vf}w zm5>O$?{NGLHc=$iyBu-<0`9QyamXE2itsuTW*3M0OGhFx>yMyaf8~H`X6GUM37rxh zostwHWh!-#q#{!3SxMo)QgekC~d~9wzg1s8Q@RE?+5(_UbJR{Qx0y?1d#D0!186Q%g?DDiOR{H3l z$-N&+eWmYA;sFGsfT3J{wND$xF=55kbA2+q=!m8$drMPjc27fx)JuIZM)Nj@W61ZD z{T%(&*b<(RRNto)c!C;D%<<-@?{NsWY#ve)>J2s@F6QnCaN5K!+og|aTC8;BskhjC z$ukji#oUT{%GeC`fPh4|TQe8uBs_Oo9P~S$q-MncHy$+u1~Z5}TXpjKG$mt8l&n>% zE@++^Pao^1^>~^V`tIl~c8V##Ngo(Lj|taUTCous>3x0p_xm}z!q0Yjx{fEhG{Vj% z(Z;83W3bP1fU3G}JbFF?b6g;(zHGyewn##J%`J7QZ|En({aX5|&73V)x$Y$Flf0;X zZV@g@o}E$4yU3B9b-^nM_3nLMxpye|)?!HN2c|J?1;jZ6!tL?69m2lEB*vGygCVkG zG=RH=aO65S^gn1CMd>G}FK9}}rLm2EQPa?yA+c|f&iwk}7CX2t+LDDj`ijMu-#FOO z_*x+V6m~a~e;#JYp5Op@2cC6APsDo7PwZm+4xO49@|{5(McMv{&s)L&eSYsb)vc@_ zb^TxX-go-k+0zn>k~%zrcD-J|i-{|<@uX>q5A8Voc6GqGw7QoA(9Qqki%5&3qt<}2 z7UB=_e_sPG7d*CZ{A@n=r<$K8-k9T%^Lo<2Q0i^EKTi=;w;I|TGx&OH%b~2ln+9H? z|EKucxKM-}ZfsIgFTW48_ci!$bSU`5V5Kb$e<+)rWj-6WJCMM>FExd~r?rpF8TiX! zEdw4jXW>huT~5{49RKmE@$r!wj^Y=v!H=>W2Rwgziq%}VW{e@iMI5fD5jBU>77*tG zA&fwU6c#tsFQpg}`3`(PsBuOb@J^JELno1GQN{41Hi9LTv%p21&W{&$B9B$*DI7`Y zkQxg(BZ;b_I7>cba0?odXWpB8^G_gu9A|X%-HxSl50<~>@9mIC5VG`}dPL}?J|_Y> z!adTk{AqYHL7oxhnbSE$`WWPv=Fh2loNZdPpXY(AkJReLzYiicrd#PjInrurhp5gk z@;jyc`&pjwMGmX|LK*ECc{*W5&cW9T=lO766rn~gLr2LT=|w*aTFcTk9_VTTIfFXa zC@=up55CCr2xuL6^n}sn{xT10^f&19lD+QIom+g#gP+g@v}?XI=g_TZrAEVv5pf~U}5@D>INgN5OOuP|Ad zF3cBVg{4BOuv|zNGKErMy|7W(D!7XS#mVAQF;!eHri&}ZOmU;QUEGC}o4e#K4VR`% zOQm$FRN5@RC%SmUfwFV%6ny3rN1&*nXJSr%au%Jqq1Gug?pU4 z>a7k}r>jfVbhT97tnO6XRcFmp8>sne^R-lMrM6z%sDT zR+m>Z(DL@`E}Z_{d2fC=Kb>F7r=ju9{7$}|cdmKX2G)FQ^J}TKm9=&BKnuEeLFa?e zbqqSrK)c(8UAPOni{9dJaT+>K7fZ#>;!d$$be24&fs(H@UrLo$O6#SqQmeFAa+Ukb zgXPI`th`*#lsC%Tt48`fG!=$y%(oT+7rpYTLD4xG1{o-uiHTy1rCT*Gu)y`cA!FcQ!nYfrhU!-$*r9 z8taX%Mys*ca5ejzgU!iithwCGG&h>t(5!Mf^xQO^S;DAJWmhn6w=in=vaVczZV+QN vhOwGiD?tkz9E&@h(dfcBlu?LsV(`TUxb+o+M9R=Ar2wO$M|#Ha`nQ4s^8q9TT*69V!u>F$I~oiyE@gt@utzDeJ3yKi&*b`l1e z3A4;Ign)>MiinD+h=_`a$iphi;#s^ZisA>w56iOrLDj3m_pLpyz0bLuoRdz~`|(nI z>^^I)v%j;4v&VJzJ@oiWb7;hD+qzL^9&wD2%J3KU<*RV8ycr9BT{$* zA#mzUgPRdD5I5sA#INvIguv-Ym%?_0z!}pF5ce63H#N@eBT{%4AuxEP0iJ!3@vg>M zXAvnpj}WLFVQ?ct#=kVyolc~HxYhwfh)>~8guw7#22F$vJS(HxY48|AVEqh(ixD#3 z*4QvWr0_ICVB|1^s}M5q9E{qT26)yQuyK|Fo?#~C->LdM@U zTBi~zynqmx>@e7d5ZJVjK?@<{O^wZcL<-L!1hyPua4SOKT;zws2tvlI8s{BHr0^g@ z;C$qV0^&ZOfoEr2&}r}}Lf{(*8eD*o@rK5Q-9!qoxe&N$hQWCV8F*gC#mfvHM+jVU zkimrr8HkT@DeM%ULk%?u(%3$W zNCA1io$;>517{K`AgvEPH#oSor*~D~z+m^H{;s~Iy#uTI2K&2L(BR<8)hkwHm2?rb zS~sv{^~&Xg-3td663Z424-eEvt4-Wm8y)9JyhvTt>y4qlwNh;)N;^4RYjihjo2t!~ zmC>rSiZsr8=~%55+bNl|IB7C#p=4~)Ia#X@FXYI()(nVvLOEM@b$8Vp6Y`m?L~9pq ztPaU1>FU-Jt&Nh?)vW|ZH#w@(JR$gD;H27W)p&I*Fi--m>#a;iPo^bCTd$lO+}XnlS+RnwMMp=_JgN~_8bB~#&r!e+8L5$3M8 z(qeDdGuf(c$wa25-m34!PWu@C9q&>x3RRx{;$~ws6TQDjsr`NZ)zQlMNTV5KgQD>o zZ#^&qRW>J#*xQ}5dd({2dGto8XoZUHyQ`s*zSf$FRh->`L3Sdg zuh(RIw3siIyjiVw#qY~vFSIs67sh%BtS6G z5&u`;5o4_J*1gTf5c=t6bwW1S+Ft6+9V^hLuBfeRR+_RGfw@#T+o7|= zXIRmI#Ay55K53w_)|)Hios;X=SDVpe_6vovT|I_jMZ|1m)?$1Z6^5%s6x(W{P_}r; z@$tBNaVA@-wc=4jrr%>jp)j^xs9#ZagrSpKtGME^jc=uK759@)WMWWn0V;Yc7=f`B zzaBNx4#gfXzobHv4&4Sa3q<+yB z+1gtZmKv*t^;T_7btsI-3XM%q&&i>l1zwlofLbv0br1A+h4*WbiJ`w=b~1QG7I@w4 z@Kz{iD{VBXaPtZNqknQ;|G5*bsvOFMa*lsl12!nhc+L>YrKRY=d;wZ>p_KQax-8sM zlMR}^!D=Gw&PrVldWE&p#MYCoRzprYq`lTfcPt480K%LV(st?Ca4^=irdlp7qqfHy zy7`k6OpY$xQq9W?%%qeih;?$5Q{2W}t73bV;&yi!Wpodc-R1_Rk=D`t&L+#v@}!_D zN4k+h#;N-@QOT{XQLycDjFd8?XCY*p6}7RmtHXn9&=uE$3K1!^?L-Srbx;y3YF4H! zFret{=^YHlP&}A0LTj^la%`v-@xjW8t=+11(bSvcGD2&Eu~nAO2(``7+41y@hc148 z$yc@=^)IND+IYkeEi@DgZM(VJ?5qcq%oPnQV~d{3c-VItf!E2tODlEX)l=INC&!8S zZoCt=F31WRh}n*-UmTH_v4vV`h)sl0*;K3JstJ=^ynEs(s2i-uV@V1M4MWVD7L_%My%b~lm zV4=6kqhgt|z}&ZU(b4lHixqkO9NFFVDLq79Kd&QmKSWl)A{)OFd3`4S6^lgtD;8zq zS0a7?2DA{>CWhF-BY3H{8f|Q<#>r9mrgafQWm6sPZ3L@Cn0_mX(GE1v zjaGkPV1>qJO{G35OAQuUWc1kx-0BfbE z8udmKLv4}6QflL3EBTsQn+a7D_$r>Ic$tYKo~6LR&))e$Oh$r7mI@P>nvR5ztVL2E z&0;_i&SD^Nvxk7tNlk3Ho~&1wRK|vb7gFEvHO9KPQm?jxNjD6w(AdP)6&6}#^lE(0 z{biU&FIILVjm_C?_d;dUSdT@KX0Hm+}5+rz6wU6t`@I2Fn{E|xSa>z0m< z2aDQ)*w`%{YK+y^pS!j;HXO_qVH>K9J!*dL69~DtPt8@(p?aB%BkHo1h3m7;RhGr|+QuTw;`;3k)mC+ElgJ1o;3ue| z1f@z}JI&xww40{%M(V8^;jWi9QbKQob@$rX2JsZy%81#nUT-zz;*Bg9O&RlSzvVap&% z=s{rm$?yOH-T;=JLi7YM^Hg{P0Pg`KrxE=Xm=6zy?ZC7%U=O?r^kG;0S>VV)#1Fg+ zu$R#Dz!4RA9svIWPG1K*;K(8D`U86n!^;KuE6`abdJLF>UHFTEw}F8TL{9^U!PDU? z;9tO*HN*?d+K4y+cH!9wybR2ShrvU@^ijkMybdhE?*C)Jj0QYXfVY4pq9=ia zFN4<#@D9*>Ib^`WSKxVpw}F*gAp;J%5?(97J3!x6L{9++UyVEj{tm3U2G0&0el5IF zfPVm|Uq|#DaOCw!55R6FBf!hR{2Nf_z&dr*eJYrygMBL9KC z?gKyY8gSe;?ZL78{qP6_UIJ!q$Fl?P0%tw|Uf}-Sz)2sVy=ZURhxVmu^g)_VAEFP_ zM`%C#DD6)N&1B9F3qE3Xg(cF$I;j5c=``Ifxb=)Xd!h{7j@GjT1+R>5?V^j zXgRH*9$HDOsFzN{E89;4w3^n?S~{6dp;PHJI-Sm-Gii{{q6)2}AsVJCt)~q%LN(fm z3SXyD8lwh{(>c_n32MruQn(2aBx-AuR8t#ljRPIu6qbQj%C_t3p`A8n)iX*)eY57M{jA^J8wOy8kL z=)3eNeUH9RKcL6xhx9o8h@PMy(@*H9^d$X^o}!=AFX)%_H2sR6pygs)MxGmt zt2Hh+q;BsZ#CPU6|7dZpSC3X@Ty~7OjVq4U^8Oe6ZtO+Yr$%W~o-)dyjq{7u$;ApI zOFFJ78|74iRkC6Ibo$coW@?ua?+3BtE+js7ESDG`5ic|2cQ1%$j`@BZZ2tbP8Omx$ z{49iFMF0Ly5qz&-E>V*czdM?BVqkN23=kW|e3|2qU@hDD8L)cCoCb_#yZwKo#)QrL zC0JS8t$Sk-&$)RYE3xmc?!vs%Zm-*GU(FDK&rH4$Yfr{HTq}Z2+s$orL)-moqZhly zMiOs0TXA-K*=T}A89Y*(U14LbX8UqE1$X3a=(2fYpVp|eJFrI4r*>P-MZA;BV%Jvk zAAT{NRd%;QZ-`1sRKu+ylA!iBr72{Ieagr(f6GxCwcSGujO zR;VRD_1t=~Pp>9A&0zi#A?q`1e=N+d?6K6XiK&b1BApS}hvEe|RUyXA! z7a_`iOu;jj+zkjddr@^v+|SmkW_ejSukmvGv4fOkKY56pb>vqJ@k7M{TwPI zwu3pL@bjsRFy4`sbF0`GL(z7TdsVKhzMpNyahet(7K^ciS7rU`v4-8wn_f>3<;}`C z?@0oOc2NR>Jl;t+%G?KyXKMZ_w8lEC3wi9a?tRj|k(U>7>l`KC>0Lafx^ub zLuvf_po7(;oWM+ubpnN-KL%nui;RVB9HnzTne+Xi+xQ~qcsWb=Fr=z4JKqeR&JCDC zY1T>Ej97C0lCzZ(%o&$sI}H^DZABTMU+XgLp9-dVj>DNd`?CJQc`m`yF)HdK!)=in=5wb`4HA?^Kk)eJZHo=)v^o2%p5ZdTFG%{J<%ZDKH2Ywtsw@|R7y#5zOp3n-nug_6jjm_QJ>^RVu6ts*qu_oN*Q7*3G$?hPJtmre-!REv*YoD9gSV z>^z#=H2Yb$kHWZq#sc|G;x{r}k%+Bx zTaMLZa&NOA{an4;CS=RZgGxU=7E?d#PQOlF( zs9 zJ3nRooxDR+yYnlK8m`x!v(x*X;M8%w{zurc zd;!gTc6WpyhKC6M+Z#(!oTx9*0sHNZ>sOSNly=`O`}fp_nvDrGUNevA`{K+MOII#8 z`XHE&D}D$DJE8Dj`{Dl|P=6T)S}@cY9mg~7yX6-8_rIkz%-|fsut{A2|0$M?ScyuM z<}fxLYy%T-GuKO4elY*f{NuO?&MW@k?r>1SQBT>kOG+GUGR-7$hik^{4&(kdlWWHA zs%HEYkE0(mzh(^kXIFoTnlZz1kEzt{sn*WjnzDU|3)l1xdz@Xw!Zmd_G!=+gy4i43#Ij=TtgRXm2R8uhbEP<< zg>Rdn!d$cSbL~KI?IF4Bc1^hyC0O>9ENZw^IxV&lit_D~NXrKdOSs%$nki8W_A*R% z17TNi?Cm(*nM-rP{832#VT3)iB|c;j>#XbHT5hXaV*|< zupCS3ZP`z-Xs5(-936A=OXlM!nU7iyznfRS1|)d)cRX%`uslzqO+LW#1bdE_%7i;S z22JJM48i0NJu6v4i5mSe!K2oqY+{PHG>I|5fe{NYyUua@4MUTQ8+IXwc|4ZmsxGI zM1}LQBT;HI117PMTAFQ6n>^efrFN)cbDrnrYGIpNyy9$$p7(Q>E%xm%RZ?@?^oXB9UHE(+lk?3i_x{dpGYUThd|wFpa;kda`q8GQ z^KASG!xp>Fl&*`3GW%k{Wu0-#GNs<%FIgt#-cyz#H6Hu2W$+F|mZo?;Z&Ukt-RDTd z<9v`xv&?BTa``A&zG7L}t*JCaD!-1h4Bk_!G*4<4^Hss4Kd349hIS;{?pcB(9^{!s z?f96#O-sP5aYqXt^94|;)~%yW$@7?Xw&2KVYKqt8L|Ze*aK&zHwjvbGyHqRM5pYFk zq)vG*&h>24)y^iYcrGSt#XQLc?>$RWH1|3ZC3TGFz*emH2Q1B%sDbkZSNN@2$u~E# zQhTiDGER%TB1Oju7PpD7zAPx2qC{KtHOnPDD|bbjju$+_SJP4zui=R_{fFmr4lS0* zggf58CThb8f+w8V7G_EG;9vJF?n9iC^&s&UEf6fiJI7{Q@$yN``WAXF??_vosm<(} z*9$v6ll9Fl&yz?|SHR;BKrUHMiMrh#FuAXU6;a_@m*83Cd7P`2&AP%oi81|R$>Y47 z%QB@#b|-o!^KEX)(n<8KO9BpcE@!EdncJph4nv(@Dmb#v-DPtwHC|oj8J&MyX`Vz& zw_NbpBe6@CQQ}=);aQ9)8+_Vra*DTeiBV8b#I)06{X}21(sTLGz)RJ=jzkHqGA!0_ ze<$*-O%3Ng(cXx~oc>)dHHqHgB+p~NHz-{XQY}xP=P@7Jm#o!^^6w8gb}Gjb=n+oOa@o@@ z%H?C5u?VjNpOM3*za}c3vc&x1%q*KZjYB1DN^AXK#N~cLpi~}qB*qG7MNB*C2b8E8 zm6*x@fq#-nS%+g4H1_=tEMDZVhlE7xWuP@wx9~v!qhr-&G1BD3zp|fjKwxO zF8cwZr72wZ5;=FaW$~XhTAJcHm#E`)!Q;M?EYFlk(WqeZKjty@b#6@X_>+-J@+9g( z!|~Y9Lv6Mdt_O+P(zsyR=^19CRX9iROvz49BIlZpOZ+y9Dxjh{mzrlx7#8!Ltu375 zZ%><181KQg0*>-4LaAB#q~)-`08>6CiFRO%+N0s3{x;ePqfb$8K&qndYf&~XFu|)Y_5wPg9+NPdmt6;IG z#Z5iSl>y7H%CV~gmYvG6#8~iZ$KubRu+^+^T~6>^<9Ph37NvO-Ex@&gN1T&kX^OXJ ziBZ~hmd78yS?>K$q~&_gVGr{tpO(bC`AyH`P75vh)+BQ52G0_F=25toC3>_QLyq_( zkK#2Tk!v?OE`M%n$y`gkH#d8ho%c*h@Z2JJ>~Fx?%2v395_R`AI|R#=_}L`t^qro|9no8|PABGtcSS7ftR7q0ioc_YT79=?+IgRp#0v5~ z0Z;H7fK%Qp-0QjQ5k=+mE>Rcm^E~dy2&cX-Z1XJcM4+AU5lHl=_gkjmJm``sO4PaS zmPZ`-WDBTp8yh>ci;Ek2<}EbfOT%5fx8@|5Lp$268MmjuhtLl&{HIF)tm7a@ySSe#0hUrLr>DRwGZ zo(@@dQI7p8WZ8)vOYJQ`V_3|QoVJ1$ZqHI*DgWAV=u@LZz7c7hW-Jp^wN%W6@^c?m#!b{bx ylyCftl0*N{Q8|vpddHtUhx@tma=DeNTQ3xW6rK3In|K}nR@G{KRr#MmLJWm{IB9mzJflThlcEz8e|Vq0>h zr^M!KpeAfx)ocr;-Lg9{+p-@m)0TGHCD6h;B$RZTPAQ$)+3jvSbZ533)=Yt6hK15? z_IJ*`@990+O33aX`_Ep@yYJj{f9KqD&pr3!J-v;4;+e$JkCpH6Ia6)0u0GJ%*w9$( z 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,4,5,5,1.5f,1.5f); + // clear it (keep only the root) + myBSP->removeSons(); + // and rebuild another random tree + myBSP->splitRecursive(NULL,4,5,5,1.5f,1.5f); + @CEx + TCOD_bsp_t *my_bsp=TCOD_bsp_new_with_size(0,0,50,50); + TCOD_bsp_split_recursive(my_bsp,NULL,4,5,5,1.5f,1.5f); + TCOD_bsp_remove_sons(my_bsp); + TCOD_bsp_split_recursive(my_bsp,NULL,4,5,5,1.5f,1.5f); + @PyEx + my_bsp=libtcod.bsp_new_with_size(0,0,50,50) + libtcod.bsp_split_recursive(my_bsp,0,4,5,5,1.5,1.5) + libtcod.bsp_remove_sons(my_bsp) + libtcod.bsp_split_recursive(my_bsp,0,4,5,5,1.5,1.5) + */ + void removeSons(); + + /** + @PageName bsp_init + @FuncTitle deleting the tree + @FuncDesc You can also completely delete the tree, including the root node to release every resource used : + @Cpp void TCODBsp::~TCODBsp() + @C void TCOD_bsp_delete(TCOD_bsp_t *node) + @Py bsp_delete(node) + @C# void TCODBsp::Dispose() + @Param node In the C version, the node reference. + @CppEx + TCODBsp *myBSP = new TCODBsp(0,0,50,50); + // create a tree + myBSP->splitRecursive(NULL,4,5,5,1.5f,1.5f); + // use the tree ... + // delete the tree + delete myBSP; + @CEx + TCOD_bsp_t *my_bsp=TCOD_bsp_new_with_size(0,0,50,50); + TCOD_bsp_split_recursive(my_bsp,NULL,4,5,5,1.5f,1.5f); + // use the tree ... + TCOD_bsp_delete(my_bsp); + @PyEx + my_bsp=libtcod.bsp_new_with_size(0,0,50,50) + libtcod.bsp_split_recursive(my_bsp,0,4,5,5,1.5,1.5) + # use the tree ... + libtcod.bsp_delete(my_bsp) + */ + virtual ~TCODBsp(); + + /** + @PageName bsp_split + @PageFather bsp + @PageTitle Splitting the tree + @FuncTitle Splitting a node once + @FuncDesc Once you have the root node, you can split it into two smaller non-overlapping nodes. + @Cpp void TCODBsp::splitOnce(bool horizontal, int position) + @C void TCOD_bsp_split_once(TCOD_bsp_t *node, bool horizontal, int position) + @Py bsp_split_once(node, horizontal, position) + @C# void TCODBsp::splitOnce(bool horizontal, int position) + @Param node In the C version, the root node created with TCOD_bsp_new_with_size, or a node obtained by splitting. + @Param horizontal If true, the node will be splitted horizontally, else, vertically. + @Param position Coordinate of the splitting position. + If horizontal is true, x <= position < x+w + Else, y <= position < y+h + @CppEx + TCODBsp *myBSP = new TCODBsp(0,0,50,50); + myBSP->splitOnce(true,20); // horizontal split into two nodes : (0,0,50,20) and (0,20,50,30) + @CEx + TCOD_bsp_t *my_bsp=TCOD_bsp_new_with_size(0,0,50,50); + TCOD_bsp_split_once(my_bsp,false,20); // vertical split into two nodes : (0,0,20,50) and (20,0,30,50) + @PyEx + my_bsp=libtcod.bsp_new_with_size(0,0,50,50) + libtcod.bsp_split_once(my_bsp,False,20) # vertical split into two nodes : (0,0,20,50) and (20,0,30,50) + */ + void splitOnce(bool horizontal, int position); + + /** + @PageName bsp_split + @FuncTitle Recursively splitting a node + @FuncDesc You can also recursively split the bsp. At each step, a random orientation (horizontal/vertical) and position are choosen : + @Cpp void TCODBsp::splitRecursive(TCODRandom *randomizer, int nb, int minHSize, int minVSize, float maxHRatio, float maxVRatio); + @C void TCOD_bsp_split_recursive(TCOD_bsp_t *node, TCOD_random_t randomizer, int nb, int minHSize, int minVSize, float maxHRatio, float maxVRatio) + @Py bsp_split_recursive(node, randomizer, nb, minHSize, minVSize, maxHRatio, maxVRatio) + @C# void TCODBsp::splitRecursive(TCODRandom randomizer, int nb, int minHSize, int minVSize, float maxHRatio, float maxVRatio) + @Param node In the C version, the root node created with TCOD_bsp_new_with_size, or a node obtained by splitting. + @Param randomizer The random number generator to use. Use NULL for the default one. + @Param nb Number of recursion levels. + @Param minHSize, minVSize minimum values of w and h for a node. A node is splitted only if the resulting sub-nodes are bigger than minHSize x minVSize + @Param maxHRatio, maxVRation maximum values of w/h and h/w for a node. If a node does not conform, the splitting orientation is forced to reduce either the w/h or the h/w ratio. Use values near 1.0 to promote square nodes. + @CppEx + // Do a 4 levels BSP tree (the region is splitted into a maximum of 2*2*2*2 sub-regions). + TCODBsp *myBSP = new TCODBsp(0,0,50,50); + myBSP->splitRecursive(NULL,4,5,5,1.5f,1.5f); + @CEx + TCOD_bsp_t *my_bsp=TCOD_bsp_new_with_size(0,0,50,50); + TCOD_bsp_split_recursive(my_bsp,NULL,4,5,5,1.5f,1.5f); + @PyEx + my_bsp=libtcod.bsp_new_with_size(0,0,50,50) + libtcod.bsp_split_recursive(my_bsp,0,4,5,5,1.5,1.5) + */ + void splitRecursive(TCODRandom *randomizer, int nb, int minHSize, int minVSize, float maxHRatio, float maxVRatio); + + /** + @PageName bsp_resize + @PageTitle Resizing a tree + @PageFather bsp + @FuncDesc This operation resets the size of the tree nodes without changing the splitting data (orientation/position). It should be called with the initial region size or a bigger size, else some splitting position may be out of the region. +You can use it if you changed the nodes size and position while using the BSP tree, which happens typically when you use the tree to build a dungeon. You create rooms inside the tree leafs, then shrink the leaf to fit the room size. Calling resize on the root node with the original region size allows you to reset all nodes to their original size. + @Cpp void TCODBsp::resize(int x,int y, int w, int h) + @C void TCOD_bsp_resize(TCOD_bsp_t *node, int x,int y, int w, int h) + @Py bsp_resize(node, x,y, w, h) + @C# void TCODBsp::resize(int x, int y, int w, int h) + @Param node In the C version, the root node created with TCOD_bsp_new_with_size, or a node obtained by splitting. + @Param x,y,w,h New position and size of the node. The original rectangular area covered by the node should be included in the new one to ensure that every splitting edge stay inside its node. + @CppEx + // We create a BSP, do some processing that will modify the x,y,w,h fields of the tree nodes, then reset all the nodes to their original size. + TCODBsp *myBSP = new TCODBsp(0,0,50,50); + myBSP->splitRecursive(NULL,4,5,5,1.5f,1.5f); + // ... do something with the tree here + myBSP->resize(0,0,50,50); + @CEx + TCOD_bsp_t *my_bsp=TCOD_bsp_new_with_size(0,0,50,50); + TCOD_bsp_split_recursive(my_bsp,NULL,4,5,5,1.5f,1.5f); + // ... do something with the tree here + TCOD_bsp_resize(my_bsp,0,0,50,50); + @PyEx + my_bsp=libtcod.bsp_new_with_size(0,0,50,50) + libtcod.bsp_split_recursive(my_bsp,0,4,5,5,1.5,1.5) + # ... do something with the tree here + libtcod.bsp_resize(my_bsp,0,0,50,50) + */ + void resize(int x,int y, int w, int h); + + /** + @PageName bsp_read + @PageFather bsp + @PageTitle Reading information from the tree + @FuncDesc Once you have built a BSP tree, you can retrieve information from any node. The node gives you free access to its fields : + @Cpp + class TCODBsp { + public : + int x,y,w,h; // + int position; // position of splitting + bool horizontal; // horizontal splitting ? + uint8 level; // level in the tree + ... + } + @C + typedef struct { + int x,y,w,h; + int position; + bool horizontal; + uint8 level; + ... + } TCOD_bsp_t; + @C# + class TCODBsp + { + public int x { get; set; } + public int y { get; set; } + public int h { get; set; } + public int w { get; set; } + public int position { get; set; } + public bool horizontal { get; set; } + public byte level { get; set; } + } + @Param x,y,w,h Rectangular region covered by this node. + @Param position If this node is not a leaf, splitting position. + @Param horizontal If this node is not a leaf, splitting orientation. + @Param level Level in the BSP tree (0 for the root, 1 for the root's sons, ...). + */ + + /** + @PageName bsp_read + @FuncTitle Navigate in the tree + @FuncDesc You can navigate from a node to its sons or its parent using one of those functions. Each function returns NULL if the corresponding node does not exists (if the node is not splitted for getLeft and getRight, and if the node is the root node for getFather). + @Cpp + TCODBsp *TCODBsp::getLeft() const + TCODBsp *TCODBsp::getRight() const + TCODBsp *TCODBsp::getFather() const + @C + TCOD_bsp_t * TCOD_bsp_left(TCOD_bsp_t *node) + TCOD_bsp_t * TCOD_bsp_right(TCOD_bsp_t *node) + TCOD_bsp_t * TCOD_bsp_father(TCOD_bsp_t *node) + @Py + bsp_left(node) + bsp_right(node) + bsp_father(node) + @C# + TCODBsp TCODBsp::getLeft() + TCODBsp TCODBsp::getRight() + TCODBsp TCODBsp::getFather() + @Param node In the C version, the node reference. + */ + TCODBsp *getLeft() const { + return (TCODBsp *)sons; + } + TCODBsp *getRight() const { + return sons ? (TCODBsp *)(sons->next) : NULL; + } + TCODBsp *getFather() const { + return (TCODBsp *)father; + } + + /** + @PageName bsp_read + @FuncTitle Checking if a node is a leaf + @FuncDesc You can know if a node is a leaf (not splitted, no sons) with this function : + @Cpp bool TCODBsp::isLeaf() const + @C bool TCOD_bsp_is_leaf(TCOD_bsp_t *node) + @Py bsp_is_leaf(node) + @C# bool TCODBsp::isLeaf() + */ + bool isLeaf() const { return sons == NULL ; } + + /** + @PageName bsp_read + @FuncTitle Check if a cell is inside a node + @FuncDesc You can check if a map cell is inside a node. + @Cpp bool TCODBsp::contains(int cx, int cy) const + @C bool TCOD_bsp_contains(TCOD_bsp_t *node, int cx, int cy) + @Py bsp_contains(node, cx, cy) + @C# bool TCODBsp::contains(int x, int y) + @Param node In the C version, the node reference. + @Param cx,cy Map cell coordinates. + */ + bool contains(int x, int y) const; + + /** + @PageName bsp_read + @FuncTitle Getting the node containing a cell + @FuncDesc You can search the tree for the smallest node containing a map cell. If the cell is outside the tree, the function returns NULL : + @Cpp TCODBsp *TCODBsp::findNode(int cx, int cy) + @C TCOD_bsp_t * TCOD_bsp_find_node(TCOD_bsp_t *node, int cx, int cy) + @Py bsp_find_node(node, cx, cy) + @C# TCODBsp TCODBsp::findNode(int x, int y) + @Param node In the C version, the node reference. + @Param cx,cy Map cell coordinates. + */ + TCODBsp *findNode(int x, int y); + + /** + @PageName bsp_traverse + @PageFather bsp + @PageTitle Traversing the tree + @FuncDesc You can scan all the nodes of the tree and have a custom function called back for each node. + Each traversal function returns false if the traversal has been interrupted (a callback returned false). + * Pre-order : the callback is called for the current node, then for the left son, then for the right son. + * In-order : the callback is called for the left son, then for current node, then for the right son. + * Post-order : the callback is called for the left son, then for the right son, then for the current node. + * Level-order : the callback is called for the nodes level by level, from left to right. + * Inverted level-order : the callback is called in the exact inverse order as Level-order. + + + +
    Pre orderIn orderPost orderLevel orderInverted level
    order
    + @Cpp + class ITCODBspCallback { + public : + virtual bool visitNode(TCODBsp *node, void *userData) = 0; + }; + + bool TCODBsp::traversePreOrder(ITCODBspCallback *callback, void *userData) + bool TCODBsp::traverseInOrder(ITCODBspCallback *callback, void *userData) + bool TCODBsp::traversePostOrder(ITCODBspCallback *callback, void *userData) + bool TCODBsp::traverseLevelOrder(ITCODBspCallback *callback, void *userData) + bool TCODBsp::traverseInvertedLevelOrder(ITCODBspCallback *callback, void *userData) + @C + typedef bool (*TCOD_bsp_callback_t)(TCOD_bsp_t *node, void *userData) + + bool TCOD_bsp_traverse_pre_order(TCOD_bsp_t *node, TCOD_bsp_callback_t callback, void *userData) + bool TCOD_bsp_traverse_in_order(TCOD_bsp_t *node, TCOD_bsp_callback_t callback, void *userData) + bool TCOD_bsp_traverse_post_order(TCOD_bsp_t *node, TCOD_bsp_callback_t callback, void *userData) + bool TCOD_bsp_traverse_level_order(TCOD_bsp_t *node, TCOD_bsp_callback_t callback, void *userData) + bool TCOD_bsp_traverse_inverted_level_order(TCOD_bsp_t *node, TCOD_bsp_callback_t callback, void *userData) + @Py + def bsp_callback(node, userData) : # ... + + bsp_traverse_pre_order(node, callback, userData=0) + bsp_traverse_in_order(node, callback, userData=0) + bsp_traverse_post_order(node, callback, userData=0) + bsp_traverse_level_order(node, callback, userData=0) + bsp_traverse_inverted_level_order(node, callback, userData=0) + @C# + bool TCODBsp::traversePreOrder(ITCODBspCallback callback) + bool TCODBsp::traverseInOrder(ITCODBspCallback callback) + bool TCODBsp::traversePostOrder(ITCODBspCallback callback) + bool TCODBsp::traverseLevelOrder(ITCODBspCallback callback) + bool TCODBsp::traverseInvertedLevelOrder(ITCODBspCallback callback) + @Param node In the C version, the node reference (generally, the root node). + @Param callback The function to call for each node. + It receives the current node and the custom data as parameters + If it returns false, the traversal is interrupted. + @Param userData Custom data to pass to the callback. + @CppEx + class MyCallback : public ITCODBspCallback { + public : + bool visitNode(TCODBsp *node, void *userData) { + printf("node pos %dx%d size %dx%d level %d\n",node->x,node->y,node->w,node->h,node->level); + return true; + } + }; + myBSP->traversePostOrder(new MyListener(),NULL); + @CEx + bool my_callback(TCOD_bsp_t *node, void *userData) { + printf("node pos %dx%d size %dx%d level %d\n",node->x,node->y,node->w,node->h,node->level); + return true; + } + TCOD_bsp_traverse_post_order(my_bsp,my_callback,NULL); + @PyEx + def my_callback(node, userData) : + print "node pos %dx%d size %dx%d level %d"%(node.x,node.y,node.w,node.h,node.level)) + return True + libtcod.bsp_traverse_post_order(my_bsp,my_callback) + */ + bool traversePreOrder(ITCODBspCallback *listener, void *userData); + bool traverseInOrder(ITCODBspCallback *listener, void *userData); + bool traversePostOrder(ITCODBspCallback *listener, void *userData); + bool traverseLevelOrder(ITCODBspCallback *listener, void *userData); + bool traverseInvertedLevelOrder(ITCODBspCallback *listener, void *userData); +protected : + TCODBsp(TCODBsp *father, bool left); + +}; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/color.h b/tcod/tcod_sys/libtcod/include/color.h new file mode 100644 index 00000000..db0dd1f9 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/color.h @@ -0,0 +1,322 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_COLOR_H +#define _TCOD_COLOR_H + +typedef struct { + uint8 r,g,b; +} TCOD_color_t; + +/* constructors */ +TCODLIB_API TCOD_color_t TCOD_color_RGB(uint8 r, uint8 g, uint8 b); +TCODLIB_API TCOD_color_t TCOD_color_HSV(float h, float s, float v); +/* basic operations */ +TCODLIB_API bool TCOD_color_equals (TCOD_color_t c1, TCOD_color_t c2); +TCODLIB_API TCOD_color_t TCOD_color_add (TCOD_color_t c1, TCOD_color_t c2); +TCODLIB_API TCOD_color_t TCOD_color_subtract (TCOD_color_t c1, TCOD_color_t c2); +TCODLIB_API TCOD_color_t TCOD_color_multiply (TCOD_color_t c1, TCOD_color_t c2); +TCODLIB_API TCOD_color_t TCOD_color_multiply_scalar (TCOD_color_t c1, float value); +TCODLIB_API TCOD_color_t TCOD_color_lerp (TCOD_color_t c1, TCOD_color_t c2, float coef); +/* HSV transformations */ +TCODLIB_API void TCOD_color_set_HSV (TCOD_color_t *c,float h, float s, float v); +TCODLIB_API void TCOD_color_get_HSV (TCOD_color_t c,float * h, float * s, float * v); +TCODLIB_API float TCOD_color_get_hue (TCOD_color_t c); +TCODLIB_API void TCOD_color_set_hue (TCOD_color_t *c, float h); +TCODLIB_API float TCOD_color_get_saturation (TCOD_color_t c); +TCODLIB_API void TCOD_color_set_saturation (TCOD_color_t *c, float s); +TCODLIB_API float TCOD_color_get_value (TCOD_color_t c); +TCODLIB_API void TCOD_color_set_value (TCOD_color_t *c, float v); +TCODLIB_API void TCOD_color_shift_hue (TCOD_color_t *c, float hshift); +TCODLIB_API void TCOD_color_scale_HSV (TCOD_color_t *c, float scoef, float vcoef); +/* color map */ +TCODLIB_API void TCOD_color_gen_map(TCOD_color_t *map, int nb_key, TCOD_color_t const *key_color, int const *key_index); + +/* color names */ +enum { + TCOD_COLOR_RED, + TCOD_COLOR_FLAME, + TCOD_COLOR_ORANGE, + TCOD_COLOR_AMBER, + TCOD_COLOR_YELLOW, + TCOD_COLOR_LIME, + TCOD_COLOR_CHARTREUSE, + TCOD_COLOR_GREEN, + TCOD_COLOR_SEA, + TCOD_COLOR_TURQUOISE, + TCOD_COLOR_CYAN, + TCOD_COLOR_SKY, + TCOD_COLOR_AZURE, + TCOD_COLOR_BLUE, + TCOD_COLOR_HAN, + TCOD_COLOR_VIOLET, + TCOD_COLOR_PURPLE, + TCOD_COLOR_FUCHSIA, + TCOD_COLOR_MAGENTA, + TCOD_COLOR_PINK, + TCOD_COLOR_CRIMSON, + TCOD_COLOR_NB +}; + +/* color levels */ +enum { + TCOD_COLOR_DESATURATED, + TCOD_COLOR_LIGHTEST, + TCOD_COLOR_LIGHTER, + TCOD_COLOR_LIGHT, + TCOD_COLOR_NORMAL, + TCOD_COLOR_DARK, + TCOD_COLOR_DARKER, + TCOD_COLOR_DARKEST, + TCOD_COLOR_LEVELS +}; + +/* color array */ +extern TCODLIB_API const TCOD_color_t TCOD_colors[TCOD_COLOR_NB][TCOD_COLOR_LEVELS]; + +/* grey levels */ +extern TCODLIB_API const TCOD_color_t TCOD_black; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_grey; +extern TCODLIB_API const TCOD_color_t TCOD_darker_grey; +extern TCODLIB_API const TCOD_color_t TCOD_dark_grey; +extern TCODLIB_API const TCOD_color_t TCOD_grey; +extern TCODLIB_API const TCOD_color_t TCOD_light_grey; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_grey; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_grey; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_gray; +extern TCODLIB_API const TCOD_color_t TCOD_darker_gray; +extern TCODLIB_API const TCOD_color_t TCOD_dark_gray; +extern TCODLIB_API const TCOD_color_t TCOD_gray; +extern TCODLIB_API const TCOD_color_t TCOD_light_gray; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_gray; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_gray; +extern TCODLIB_API const TCOD_color_t TCOD_white; + +/* sepia */ +extern TCODLIB_API const TCOD_color_t TCOD_darkest_sepia; +extern TCODLIB_API const TCOD_color_t TCOD_darker_sepia; +extern TCODLIB_API const TCOD_color_t TCOD_dark_sepia; +extern TCODLIB_API const TCOD_color_t TCOD_sepia; +extern TCODLIB_API const TCOD_color_t TCOD_light_sepia; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_sepia; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_sepia; + +/* standard colors */ +extern TCODLIB_API const TCOD_color_t TCOD_red; +extern TCODLIB_API const TCOD_color_t TCOD_flame; +extern TCODLIB_API const TCOD_color_t TCOD_orange; +extern TCODLIB_API const TCOD_color_t TCOD_amber; +extern TCODLIB_API const TCOD_color_t TCOD_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_lime; +extern TCODLIB_API const TCOD_color_t TCOD_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_green; +extern TCODLIB_API const TCOD_color_t TCOD_sea; +extern TCODLIB_API const TCOD_color_t TCOD_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_sky; +extern TCODLIB_API const TCOD_color_t TCOD_azure; +extern TCODLIB_API const TCOD_color_t TCOD_blue; +extern TCODLIB_API const TCOD_color_t TCOD_han; +extern TCODLIB_API const TCOD_color_t TCOD_violet; +extern TCODLIB_API const TCOD_color_t TCOD_purple; +extern TCODLIB_API const TCOD_color_t TCOD_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_pink; +extern TCODLIB_API const TCOD_color_t TCOD_crimson; + +/* dark colors */ +extern TCODLIB_API const TCOD_color_t TCOD_dark_red; +extern TCODLIB_API const TCOD_color_t TCOD_dark_flame; +extern TCODLIB_API const TCOD_color_t TCOD_dark_orange; +extern TCODLIB_API const TCOD_color_t TCOD_dark_amber; +extern TCODLIB_API const TCOD_color_t TCOD_dark_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_dark_lime; +extern TCODLIB_API const TCOD_color_t TCOD_dark_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_dark_green; +extern TCODLIB_API const TCOD_color_t TCOD_dark_sea; +extern TCODLIB_API const TCOD_color_t TCOD_dark_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_dark_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_dark_sky; +extern TCODLIB_API const TCOD_color_t TCOD_dark_azure; +extern TCODLIB_API const TCOD_color_t TCOD_dark_blue; +extern TCODLIB_API const TCOD_color_t TCOD_dark_han; +extern TCODLIB_API const TCOD_color_t TCOD_dark_violet; +extern TCODLIB_API const TCOD_color_t TCOD_dark_purple; +extern TCODLIB_API const TCOD_color_t TCOD_dark_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_dark_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_dark_pink; +extern TCODLIB_API const TCOD_color_t TCOD_dark_crimson; + +/* darker colors */ +extern TCODLIB_API const TCOD_color_t TCOD_darker_red; +extern TCODLIB_API const TCOD_color_t TCOD_darker_flame; +extern TCODLIB_API const TCOD_color_t TCOD_darker_orange; +extern TCODLIB_API const TCOD_color_t TCOD_darker_amber; +extern TCODLIB_API const TCOD_color_t TCOD_darker_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_darker_lime; +extern TCODLIB_API const TCOD_color_t TCOD_darker_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_darker_green; +extern TCODLIB_API const TCOD_color_t TCOD_darker_sea; +extern TCODLIB_API const TCOD_color_t TCOD_darker_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_darker_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_darker_sky; +extern TCODLIB_API const TCOD_color_t TCOD_darker_azure; +extern TCODLIB_API const TCOD_color_t TCOD_darker_blue; +extern TCODLIB_API const TCOD_color_t TCOD_darker_han; +extern TCODLIB_API const TCOD_color_t TCOD_darker_violet; +extern TCODLIB_API const TCOD_color_t TCOD_darker_purple; +extern TCODLIB_API const TCOD_color_t TCOD_darker_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_darker_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_darker_pink; +extern TCODLIB_API const TCOD_color_t TCOD_darker_crimson; + +/* darkest colors */ +extern TCODLIB_API const TCOD_color_t TCOD_darkest_red; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_flame; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_orange; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_amber; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_lime; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_green; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_sea; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_sky; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_azure; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_blue; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_han; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_violet; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_purple; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_pink; +extern TCODLIB_API const TCOD_color_t TCOD_darkest_crimson; + +/* light colors */ +extern TCODLIB_API const TCOD_color_t TCOD_light_red; +extern TCODLIB_API const TCOD_color_t TCOD_light_flame; +extern TCODLIB_API const TCOD_color_t TCOD_light_orange; +extern TCODLIB_API const TCOD_color_t TCOD_light_amber; +extern TCODLIB_API const TCOD_color_t TCOD_light_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_light_lime; +extern TCODLIB_API const TCOD_color_t TCOD_light_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_light_green; +extern TCODLIB_API const TCOD_color_t TCOD_light_sea; +extern TCODLIB_API const TCOD_color_t TCOD_light_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_light_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_light_sky; +extern TCODLIB_API const TCOD_color_t TCOD_light_azure; +extern TCODLIB_API const TCOD_color_t TCOD_light_blue; +extern TCODLIB_API const TCOD_color_t TCOD_light_han; +extern TCODLIB_API const TCOD_color_t TCOD_light_violet; +extern TCODLIB_API const TCOD_color_t TCOD_light_purple; +extern TCODLIB_API const TCOD_color_t TCOD_light_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_light_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_light_pink; +extern TCODLIB_API const TCOD_color_t TCOD_light_crimson; + +/* lighter colors */ +extern TCODLIB_API const TCOD_color_t TCOD_lighter_red; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_flame; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_orange; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_amber; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_lime; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_green; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_sea; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_sky; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_azure; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_blue; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_han; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_violet; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_purple; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_pink; +extern TCODLIB_API const TCOD_color_t TCOD_lighter_crimson; + +/* lightest colors */ +extern TCODLIB_API const TCOD_color_t TCOD_lightest_red; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_flame; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_orange; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_amber; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_lime; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_green; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_sea; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_sky; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_azure; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_blue; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_han; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_violet; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_purple; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_pink; +extern TCODLIB_API const TCOD_color_t TCOD_lightest_crimson; + +/* desaturated */ +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_red; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_flame; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_orange; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_amber; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_yellow; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_lime; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_chartreuse; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_green; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_sea; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_turquoise; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_cyan; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_sky; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_azure; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_blue; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_han; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_violet; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_purple; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_fuchsia; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_magenta; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_pink; +extern TCODLIB_API const TCOD_color_t TCOD_desaturated_crimson; + +/* metallic */ +extern TCODLIB_API const TCOD_color_t TCOD_brass; +extern TCODLIB_API const TCOD_color_t TCOD_copper; +extern TCODLIB_API const TCOD_color_t TCOD_gold; +extern TCODLIB_API const TCOD_color_t TCOD_silver; + +/* miscellaneous */ +extern TCODLIB_API const TCOD_color_t TCOD_celadon; +extern TCODLIB_API const TCOD_color_t TCOD_peach; + +#endif diff --git a/tcod/tcod_sys/libtcod/include/color.hpp b/tcod/tcod_sys/libtcod/include/color.hpp new file mode 100644 index 00000000..035dce6a --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/color.hpp @@ -0,0 +1,690 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_COLOR_HPP +#define _TCOD_COLOR_HPP + +// color constants uses to generate @ColorTable +/** + @ColorCategory STANDARD COLORS + @Color red 255,0,0 + @Color flame 255,63,0 + @Color orange 255,127,0 + @Color amber 255,191,0 + @Color yellow 255,255,0, + @Color lime 191,255,0 + @Color chartreuse 127,255,0 + @Color green 0,255,0 + @Color sea 0,255,127 + @Color turquoise 0,255,191 + @Color cyan 0,255,255 + @Color sky 0,191,255 + @Color azure 0,127,255 + @Color blue 0,0,255 + @Color han 63,0,255 + @Color violet 127,0,255 + @Color purple 191,0,255 + @Color fuchsia 255,0,255 + @Color magenta 255,0,191 + @Color pink 255,0,127 + @Color crimson 255,0,63 + @ColorCategory METALLIC COLORS + @Color brass 191,151,96 + @Color copper 196,136,124 + @Color gold 229,191,0 + @Color silver 203,203,203 + @ColorCategory MISCELLANEOUS COLORS + @Color celadon 172,255,175 + @Color peach 255,159,127 + @ColorCategory GREYSCALE & SEPIA + @Color grey 127,127,127 + @Color sepia 127,101,63 + @ColorCategory BLACK AND WHITE + @Color black 0,0,0 + @Color white 255,255,255 +*/ + +/** + @PageName color + @PageCategory Core + @PageTitle Colors + @PageDesc The Doryen library uses 32bits colors. Thus, your OS desktop must use 32bits colors. +A color is defined by its red, green and blue component between 0 and 255. +You can use the following predefined colors (hover over a color to see its full name and R,G,B values): + @ColorTable + @CppEx + TCODColor::desaturatedRed + TCODColor::lightestRed + TCODColor::lighterRed + TCODColor::lightRed + TCODColor::red + TCODColor::darkRed + TCODColor::darkerRed + TCODColor::darkestRed + @CEx + TCOD_desaturated_red + TCOD_lightest_red + TCOD_lighter_red + TCOD_light_red + TCOD_red + TCOD_dark_red + TCOD_darker_red + TCOD_darkest_red + @PyEx + libtcod.desaturated_red + libtcod.lightest_red + libtcod.lighter_red + libtcod.light_red + libtcod.red + libtcod.dark_red + libtcod.darker_red + libtcod.darkest_red + @C#Ex + TCODColor::desaturatedRed + TCODColor::lightestRed + TCODColor::lighterRed + TCODColor::lightRed + TCODColor::red + TCODColor::darkRed + TCODColor::darkerRed + TCODColor::darkestRed + @LuaEx + tcod.color.desaturatedRed + tcod.color.lightestRed + tcod.color.lighterRed + tcod.color.lightRed + tcod.color.red + tcod.color.darkRed + tcod.color.darkerRed + tcod.color.darkestRed + */ + +class TCODLIB_API TCODColor { +public : + uint8 r,g,b; + + TCODColor() : r(0),g(0),b(0) {} + /** + @PageName color + @FuncTitle Create your own colors + @FuncDesc You can create your own colours using a set of constructors, both for RGB and HSV values. + @CppEx + TCODColor myColor(24,64,255); //RGB + TCODColor myOtherColor(321.0f,0.7f,1.0f); //HSV + @CEx + TCOD_color_t my_color={24,64,255}; /* RGB */ + TCOD_color_t my_other_color = TCOD_color_RGB(24,64,255); /* RGB too */ + TCOD_color_t my_yet_another_color = TCOD_color_HSV(321.0f,0.7f,1.0f); /* HSV */ + @PyEx my_color=libtcod.Color(24,64,255) + @C#Ex TCODColor myColor = new TCODColor(24,64,255); //RGB + TCODColor myColor = new TCODColor(321.0f,0.7f,1.0f); //HSV + @LuaEx myColor = tcod.Color(24,24,255) + */ + TCODColor(uint8 r, uint8 g, uint8 b): r(r), g(g), b(b) {} + TCODColor(int r, int g, int b): r(r), g(g), b(b) {} + TCODColor(const TCOD_color_t &col): r(col.r), g(col.g), b(col.b) {} + TCODColor(float h, float s, float v); + + /** + @PageName color + @FuncTitle Compare two colors + @CppEx + if (myColor == TCODColor::yellow) { ... } + if (myColor != TCODColor::white) { ... } + @CEx + if (TCOD_color_equals(my_color,TCOD_yellow)) { ... } + if (!TCOD_color_equals(my_color,TCOD_white)) { ... } + @PyEx + if my_color == libtcod.yellow : ... + if my_color != litbcod.white : ... + @C#Ex + if (myColor.Equal(TCODColor.yellow)) { ... } + if (myColor.NotEqual(TCODColor.white)) { ... } + @LuaEx + if myColor == tcod.color.yellow then ... end + */ + bool operator == (const TCODColor & c) const { + return (c.r == r && c.g == g && c.b == b); + } + bool operator != (const TCODColor & c) const { + return (c.r != r || c.g != g || c.b != b); + } + + /** + @PageName color + @FuncTitle Multiply two colors + @FuncDesc c1 = c2 * c3 => + c1.r = c2.r * c3.r / 255 + c1.g = c2.g * c3.g / 255 + c1.b = c2.b * c3.b / 255 + darkishRed = darkGrey * red +
    + @CppEx TCODColor myDarkishRed = TCODColor::darkGrey * TCODColor::lightRed; + @CEx TCOD_color_t my_darkish_red = TCOD_color_multiply(TCOD_dark_grey, TCOD_light_red); + @PyEx my_darkish_red = libtcod.dark_grey * libtcod.light_red + @C#Ex TCODColor myDarkishRed = TCODColor.darkGrey.Multiply(TCODColor.lightRed); + @LuaEx myDarkishRed = tcod.color.darkGrey * tcod.color.lightRed + */ + TCODColor operator * (const TCODColor & a) const { + TCODColor ret; + ret.r=(uint8)(((int)r)*a.r/255); + ret.g=(uint8)(((int)g)*a.g/255); + ret.b=(uint8)(((int)b)*a.b/255); + return ret; + } + + /** + @PageName color + @FuncTitle Multiply a color by a float + @FuncDesc c1 = c2 * v => + c1.r = CLAMP(0, 255, c2.r * v) + c1.g = CLAMP(0, 255, c2.g * v) + c1.b = CLAMP(0, 255, c2.b * v) + darkishRed = red * 0.5 +
    + + @CppEx TCODColor myDarkishRed = TCODColor::lightRed * 0.5f; + @CEx TCOD_color_t my_darkish_red = TCOD_color_multiply_scalar(TCOD_light_red, 0.5f); + @PyEx myDarkishRed = litbcod.light_red * 0.5 + @C#Ex TCODColor myDarkishRed = TCODColor.lightRed.Multiply(0.5f); + @LuaEx myDarkishRed = tcod.color.lightRed * 0.5 + */ + TCODColor operator *(float value) const { + TCOD_color_t ret; + int r,g,b; + r = (int)(this->r * value); + g = (int)(this->g * value); + b = (int)(this->b * value); + r = CLAMP(0,255,r); + g = CLAMP(0,255,g); + b = CLAMP(0,255,b); + ret.r=(uint8)r; + ret.g=(uint8)g; + ret.b=(uint8)b; + return ret; + } + + /** + @PageName color + @FuncTitle Adding two colors + @FuncDesc c1 = c1 + c2 => c1.r = MIN(255, c1.r + c2.r) + c1.g = MIN(255, c1.g + c2.g) + c1.b = MIN(255, c1.b + c2.b) + lightishRed = red + darkGrey +
    + @CppEx TCODColor myLightishRed = TCODColor::red + TCODColor::darkGrey + @CEx TCOD_color_t my_lightish_red = TCOD_color_add(TCOD_red, TCOD_dark_grey); + @PyEx myLightishRed = libtcod.red + libtcod.dark_grey + @C#Ex TCODColor myLightishRed = TCODColor.red.Plus(TCODColor.darkGrey) + @LuaEx myLightishRed = tcod.color.red + tcod.color.darkGrey + */ + TCODColor operator + (const TCODColor & a) const { + TCODColor ret; + int r=(int)(this->r)+a.r; + int g=(int)(this->g)+a.g; + int b=(int)(this->b)+a.b; + r = MIN(255,r); + g = MIN(255,g); + b = MIN(255,b); + ret.r=(uint8)r; + ret.g=(uint8)g; + ret.b=(uint8)b; + return ret; + } + + /** + @PageName color + @FuncTitle Subtract two colors + @FuncDesc c1 = c1 - c2 => c1.r = MAX(0, c1.r - c2.r) + c1.g = MAX(0, c1.g - c2.g) + c1.b = MAX(0, c1.b - c2.b) + redish = red - darkGrey +
    + @CppEx TCODColor myRedish = TCODColor::red - TCODColor::darkGrey + @CEx TCOD_color_t my_redish = TCOD_color_subtract(TCOD_red, TCOD_dark_grey); + @PyEx myRedish = libtcod.red - libtcod.dark_grey + @C#Ex TCODColor myRedish = TCODColor.red.Minus(TCODColor.darkGrey) + @LuaEx myRedish = tcod.color.red - tcod.color.darkGrey + */ + TCODColor operator - (const TCODColor & a) const { + TCODColor ret; + int r=(int)(this->r)-a.r; + int g=(int)(this->g)-a.g; + int b=(int)(this->b)-a.b; + r = MAX(0,r); + g = MAX(0,g); + b = MAX(0,b); + ret.r=(uint8)r; + ret.g=(uint8)g; + ret.b=(uint8)b; + return ret; + } + + /** + @PageName color + @FuncTitle Interpolate between two colors + @FuncDesc c1 = lerp (c2, c3, coef) => c1.r = c2.r + (c3.r - c2.r ) * coef + c1.g = c2.g + (c3.g - c2.g ) * coef + c1.b = c2.b + (c3.b - c2.b ) * coef +coef should be between 0.0 and 1.0 but you can as well use other values + + + + + +
    coef == 0.0f
    coef == 0.25f
    coef == 0.5f
    coef == 0.75f
    coef == 1.0f
    + @CppEx TCODColor myColor = TCODColor::lerp ( TCODColor::darkGrey, TCODColor::lightRed,coef ); + @CEx TCOD_color_t my_color = TCOD_color_lerp ( TCOD_dark_grey, TCOD_light_red,coef); + @PyEx my_color = libtcod.color_lerp ( libtcod.dark_grey, litbcod.light_red,coef) + @C#Ex TCODColor myColor = TCODColor.Interpolate( TCODColor.darkGrey, TCODColor.lightRed, coef ); + @LuaEx myColor = tcod.color.Interpolate( tcod.color.darkGrey, tcod.color.lightRed, coef ) + */ + static TCODColor lerp(const TCODColor &a, const TCODColor &b, float coef) { + TCODColor ret; + ret.r=(uint8)(a.r+(b.r-a.r)*coef); + ret.g=(uint8)(a.g+(b.g-a.g)*coef); + ret.b=(uint8)(a.b+(b.b-a.b)*coef); + return ret; + } + + /** + @PageName color + @FuncTitle Define a color by its hue, saturation and value + @FuncDesc After this function is called, the r,g,b fields of the color are calculated according to the h,s,v parameters. + @Cpp void TCODColor::setHSV(float h, float s, float v) + @C void TCOD_color_set_HSV(TCOD_color_t *c,float h, float s, float v) + @Py color_set_hsv(c,h,s,v) + @C# void TCODColor::setHSV(float h, float s, float v) + @Lua Color:setHSV( h, s ,v ) + @Param c In the C and python versions, the color to modify + @Param h,s,v Color components in the HSV space + 0.0 <= h < 360.0 + 0.0 <= s <= 1.0 + 0.0 <= v <= 1.0 + */ + void setHSV(float h, float s, float v); + + /** + @PageName color + @FuncTitle Define a color's hue, saturation or lightness + @FuncDesc These functions set only a single component in the HSV color space. + @Cpp + void TCODColor::setHue (float h) + void TCODColor::setSaturation (float s) + void TCODColor::setValue (float v) + @C + void TCOD_color_set_hue (TCOD_color_t *c, float h) + void TCOD_color_set_saturation (TCOD_color_t *c, float s) + void TCOD_color_set_value (TCOD_color_t *c, float v) + @Lua + Color:setHue(h) + Color:setSaturation(s) + Color:setValue(v) + @Param h,s,v Color components in the HSV space + @Param c In the C and python versions, the color to modify + */ + void setHue (float h); + void setSaturation (float s); + void setValue (float v); + + /** + @PageName color + @FuncTitle Get a color hue, saturation and value components + @Cpp void TCODColor::getHSV(float *h, float *s, float *v) const + @C void TCOD_color_get_HSV(TCOD_color_t c,float * h, float * s, float * v) + @Py color_get_HSV(c) # returns [h,s,v] + @C# void TCODColor::getHSV(out float h, out float s, out float v) + @Lua Color:getHSV() -- returns h,s,v + @Param c In the C and python versions, the TCOD_color_t from which to read. + @Param h,s,v Color components in the HSV space + 0.0 <= h < 360.0 + 0.0 <= s <= 1.0 + 0.0 <= v <= 1.0 + */ + void getHSV(float *h, float *s, float *v) const; + + /** + @PageName color + @FuncTitle Get a color's hue, saturation or value + @FuncDesc Should you need to extract only one of the HSV components, these functions are what you should call. Note that if you need all three values, it's way less burdensome for the CPU to call TCODColor::getHSV(). + @Cpp + float TCODColor::getHue () + float TCODColor::getSaturation () + float TCODColor::getValue () + @C + float TCOD_color_get_hue (TCOD_color_t c) + float TCOD_color_get_saturation (TCOD_color_t c) + float TCOD_color_get_value (TCOD_color_t c) + @Lua + Color:getHue() + Color:getSaturation() + Color:getValue() + @C# + float TCODColor::getHue() + float TCODColor::getSaturation() + float TCODColor::getValue() + @Param c the TCOD_color_t from which to read + */ + float getHue (); + float getSaturation (); + float getValue (); + + /** + @PageName color + @FuncTitle Shift a color's hue up or down + @FuncDesc The hue shift value is the number of grades the color's hue will be shifted. The value can be negative for shift left, or positive for shift right. + Resulting values H < 0 and H >= 360 are handled automatically. + @Cpp void TCODColor::shiftHue (float hshift) + @C void TCOD_color_shift_hue (TCOD_color_t *c, float hshift) + @C# TCODColor::shiftHue(float hshift) + @Lua Color:shiftHue(hshift) + @Param c The color to modify + @Param hshift The hue shift value + */ + void shiftHue (float hshift); + + /** + @PageName color + @FuncTitle Scale a color's saturation and value + @Cpp void TCODColor::scaleHSV (float sscale, float vscale) + @C void TCOD_color_scale_HSV (TCOD_color_t *c, float scoef, float vcoef) + @Py color_scale_HSV(c, scoef, vcoef) + @C# TCODColor::scaleHSV (float sscale, float vscale) + @Lua Color:scaleHSV(sscale,vscale) + @Param c The color to modify + @Param sscale saturation multiplier (1.0f for no change) + @Param vscale value multiplier (1.0f for no change) + */ + void scaleHSV (float sscale, float vscale); + + /** + @PageName color + @FuncTitle Generate a smooth color map + @FuncDesc You can define a color map from an array of color keys. Colors will be interpolated between the keys. + 0 -> black + 4 -> red + 8 -> white + Result : + + + + + + + + + + + + +
    map[0]
     black
    map[1]
     
    map[2]
     
    map[3]
     
    map[4]
     red
    map[5]
     
    map[6]
     
    map[7]
     
    map[8]
     white
    + @Cpp static void genMap(TCODColor *map, int nbKey, TCODColor const *keyColor, int const *keyIndex) + @C void TCOD_gen_map(TCOD_color_t *map, int nb_key, TCOD_color_t const *key_color, int const *key_index) + @Py color_gen_map(keyColor,keyIndex) # returns an array of colors + @Param map An array of colors to be filled by the function. + @Param nbKey Number of color keys + @Param keyColor Array of nbKey colors containing the color of each key + @Param keyIndex Array of nbKey integers containing the index of each key. + If you want to fill the map array, keyIndex[0] must be 0 and keyIndex[nbKey-1] is the number of elements in map minus 1 but you can also use the function to fill only a part of the map array. + @CppEx + int idx[] = { 0, 4, 8 }; // indexes of the keys + TCODColor col[] = { TCODColor( 0,0,0 ), TCODColor(255,0,0), TCODColor(255,255,255) }; // colors : black, red, white + TCODColor map[9]; + TCODColor::genMap(map,3,col,idx); + @CEx + int idx[] = { 0, 4, 8 }; // indexes of the keys + TCOD_color_t col[] = { { 0,0,0 }, {255,0,0}, {255,255,255} }; // colors : black, red, white + TCOD_color_t map[9]; + TCOD_color_gen_map(map,3,col,idx); + @PyEx + idx = [ 0, 4, 8 ] # indexes of the keys + col = [ libtcod.Color( 0,0,0 ), libtcod.Color( 255,0,0 ), libtcod.Color(255,255,255) ] # colors : black, red, white + map=libtcod.color_gen_map(col,idx) + */ + static void genMap(TCODColor *map, int nbKey, TCODColor const *keyColor, int const *keyIndex); + + // color array + static const TCODColor colors[TCOD_COLOR_NB][TCOD_COLOR_LEVELS]; + + // grey levels + static const TCODColor black; + static const TCODColor darkestGrey; + static const TCODColor darkerGrey; + static const TCODColor darkGrey; + static const TCODColor grey; + static const TCODColor lightGrey; + static const TCODColor lighterGrey; + static const TCODColor lightestGrey; + static const TCODColor white; + + //sepia + static const TCODColor darkestSepia; + static const TCODColor darkerSepia; + static const TCODColor darkSepia; + static const TCODColor sepia; + static const TCODColor lightSepia; + static const TCODColor lighterSepia; + static const TCODColor lightestSepia; + + // standard colors + static const TCODColor red; + static const TCODColor flame; + static const TCODColor orange; + static const TCODColor amber; + static const TCODColor yellow; + static const TCODColor lime; + static const TCODColor chartreuse; + static const TCODColor green; + static const TCODColor sea; + static const TCODColor turquoise; + static const TCODColor cyan; + static const TCODColor sky; + static const TCODColor azure; + static const TCODColor blue; + static const TCODColor han; + static const TCODColor violet; + static const TCODColor purple; + static const TCODColor fuchsia; + static const TCODColor magenta; + static const TCODColor pink; + static const TCODColor crimson; + + // dark colors + static const TCODColor darkRed; + static const TCODColor darkFlame; + static const TCODColor darkOrange; + static const TCODColor darkAmber; + static const TCODColor darkYellow; + static const TCODColor darkLime; + static const TCODColor darkChartreuse; + static const TCODColor darkGreen; + static const TCODColor darkSea; + static const TCODColor darkTurquoise; + static const TCODColor darkCyan; + static const TCODColor darkSky; + static const TCODColor darkAzure; + static const TCODColor darkBlue; + static const TCODColor darkHan; + static const TCODColor darkViolet; + static const TCODColor darkPurple; + static const TCODColor darkFuchsia; + static const TCODColor darkMagenta; + static const TCODColor darkPink; + static const TCODColor darkCrimson; + + // darker colors + static const TCODColor darkerRed; + static const TCODColor darkerFlame; + static const TCODColor darkerOrange; + static const TCODColor darkerAmber; + static const TCODColor darkerYellow; + static const TCODColor darkerLime; + static const TCODColor darkerChartreuse; + static const TCODColor darkerGreen; + static const TCODColor darkerSea; + static const TCODColor darkerTurquoise; + static const TCODColor darkerCyan; + static const TCODColor darkerSky; + static const TCODColor darkerAzure; + static const TCODColor darkerBlue; + static const TCODColor darkerHan; + static const TCODColor darkerViolet; + static const TCODColor darkerPurple; + static const TCODColor darkerFuchsia; + static const TCODColor darkerMagenta; + static const TCODColor darkerPink; + static const TCODColor darkerCrimson; + + // darkest colors + static const TCODColor darkestRed; + static const TCODColor darkestFlame; + static const TCODColor darkestOrange; + static const TCODColor darkestAmber; + static const TCODColor darkestYellow; + static const TCODColor darkestLime; + static const TCODColor darkestChartreuse; + static const TCODColor darkestGreen; + static const TCODColor darkestSea; + static const TCODColor darkestTurquoise; + static const TCODColor darkestCyan; + static const TCODColor darkestSky; + static const TCODColor darkestAzure; + static const TCODColor darkestBlue; + static const TCODColor darkestHan; + static const TCODColor darkestViolet; + static const TCODColor darkestPurple; + static const TCODColor darkestFuchsia; + static const TCODColor darkestMagenta; + static const TCODColor darkestPink; + static const TCODColor darkestCrimson; + + // light colors + static const TCODColor lightRed; + static const TCODColor lightFlame; + static const TCODColor lightOrange; + static const TCODColor lightAmber; + static const TCODColor lightYellow; + static const TCODColor lightLime; + static const TCODColor lightChartreuse; + static const TCODColor lightGreen; + static const TCODColor lightSea; + static const TCODColor lightTurquoise; + static const TCODColor lightCyan; + static const TCODColor lightSky; + static const TCODColor lightAzure; + static const TCODColor lightBlue; + static const TCODColor lightHan; + static const TCODColor lightViolet; + static const TCODColor lightPurple; + static const TCODColor lightFuchsia; + static const TCODColor lightMagenta; + static const TCODColor lightPink; + static const TCODColor lightCrimson; + + //lighter colors + static const TCODColor lighterRed; + static const TCODColor lighterFlame; + static const TCODColor lighterOrange; + static const TCODColor lighterAmber; + static const TCODColor lighterYellow; + static const TCODColor lighterLime; + static const TCODColor lighterChartreuse; + static const TCODColor lighterGreen; + static const TCODColor lighterSea; + static const TCODColor lighterTurquoise; + static const TCODColor lighterCyan; + static const TCODColor lighterSky; + static const TCODColor lighterAzure; + static const TCODColor lighterBlue; + static const TCODColor lighterHan; + static const TCODColor lighterViolet; + static const TCODColor lighterPurple; + static const TCODColor lighterFuchsia; + static const TCODColor lighterMagenta; + static const TCODColor lighterPink; + static const TCODColor lighterCrimson; + + // lightest colors + static const TCODColor lightestRed; + static const TCODColor lightestFlame; + static const TCODColor lightestOrange; + static const TCODColor lightestAmber; + static const TCODColor lightestYellow; + static const TCODColor lightestLime; + static const TCODColor lightestChartreuse; + static const TCODColor lightestGreen; + static const TCODColor lightestSea; + static const TCODColor lightestTurquoise; + static const TCODColor lightestCyan; + static const TCODColor lightestSky; + static const TCODColor lightestAzure; + static const TCODColor lightestBlue; + static const TCODColor lightestHan; + static const TCODColor lightestViolet; + static const TCODColor lightestPurple; + static const TCODColor lightestFuchsia; + static const TCODColor lightestMagenta; + static const TCODColor lightestPink; + static const TCODColor lightestCrimson; + + // desaturated colors + static const TCODColor desaturatedRed; + static const TCODColor desaturatedFlame; + static const TCODColor desaturatedOrange; + static const TCODColor desaturatedAmber; + static const TCODColor desaturatedYellow; + static const TCODColor desaturatedLime; + static const TCODColor desaturatedChartreuse; + static const TCODColor desaturatedGreen; + static const TCODColor desaturatedSea; + static const TCODColor desaturatedTurquoise; + static const TCODColor desaturatedCyan; + static const TCODColor desaturatedSky; + static const TCODColor desaturatedAzure; + static const TCODColor desaturatedBlue; + static const TCODColor desaturatedHan; + static const TCODColor desaturatedViolet; + static const TCODColor desaturatedPurple; + static const TCODColor desaturatedFuchsia; + static const TCODColor desaturatedMagenta; + static const TCODColor desaturatedPink; + static const TCODColor desaturatedCrimson; + + // metallic + static const TCODColor brass; + static const TCODColor copper; + static const TCODColor gold; + static const TCODColor silver; + + // miscellaneous + static const TCODColor celadon; + static const TCODColor peach; +}; + +TCODLIB_API TCODColor operator *(float value, const TCODColor &c); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/console.h b/tcod/tcod_sys/libtcod/include/console.h new file mode 100644 index 00000000..35997f13 --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/console.h @@ -0,0 +1,125 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_CONSOLE_H +#define _TCOD_CONSOLE_H + +#include "console_types.h" + +#define TCOD_BKGND_ALPHA(alpha) ((TCOD_bkgnd_flag_t)(TCOD_BKGND_ALPH|(((uint8)(alpha*255))<<8))) +#define TCOD_BKGND_ADDALPHA(alpha) ((TCOD_bkgnd_flag_t)(TCOD_BKGND_ADDA|(((uint8)(alpha*255))<<8))) + +typedef void * TCOD_console_t; + +TCODLIB_API void TCOD_console_init_root(int w, int h, const char * title, bool fullscreen, TCOD_renderer_t renderer); +TCODLIB_API void TCOD_console_set_window_title(const char *title); +TCODLIB_API void TCOD_console_set_fullscreen(bool fullscreen); +TCODLIB_API bool TCOD_console_is_fullscreen(); +TCODLIB_API bool TCOD_console_is_window_closed(); +TCODLIB_API bool TCOD_console_has_mouse_focus(); +TCODLIB_API bool TCOD_console_is_active(); + +TCODLIB_API void TCOD_console_set_custom_font(const char *fontFile, int flags,int nb_char_horiz, int nb_char_vertic); +TCODLIB_API void TCOD_console_map_ascii_code_to_font(int asciiCode, int fontCharX, int fontCharY); +TCODLIB_API void TCOD_console_map_ascii_codes_to_font(int asciiCode, int nbCodes, int fontCharX, int fontCharY); +TCODLIB_API void TCOD_console_map_string_to_font(const char *s, int fontCharX, int fontCharY); + +TCODLIB_API void TCOD_console_set_dirty(int x, int y, int w, int h); +TCODLIB_API void TCOD_console_set_default_background(TCOD_console_t con,TCOD_color_t col); +TCODLIB_API void TCOD_console_set_default_foreground(TCOD_console_t con,TCOD_color_t col); +TCODLIB_API void TCOD_console_clear(TCOD_console_t con); +TCODLIB_API void TCOD_console_set_char_background(TCOD_console_t con,int x, int y, TCOD_color_t col, TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_set_char_foreground(TCOD_console_t con,int x, int y, TCOD_color_t col); +TCODLIB_API void TCOD_console_set_char(TCOD_console_t con,int x, int y, int c); +TCODLIB_API void TCOD_console_put_char(TCOD_console_t con,int x, int y, int c, TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_put_char_ex(TCOD_console_t con,int x, int y, int c, TCOD_color_t fore, TCOD_color_t back); + +TCODLIB_API void TCOD_console_set_background_flag(TCOD_console_t con,TCOD_bkgnd_flag_t flag); +TCODLIB_API TCOD_bkgnd_flag_t TCOD_console_get_background_flag(TCOD_console_t con); +TCODLIB_API void TCOD_console_set_alignment(TCOD_console_t con,TCOD_alignment_t alignment); +TCODLIB_API TCOD_alignment_t TCOD_console_get_alignment(TCOD_console_t con); +TCODLIB_API void TCOD_console_print(TCOD_console_t con,int x, int y, const char *fmt, ...); +TCODLIB_API void TCOD_console_print_ex(TCOD_console_t con,int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...); +TCODLIB_API int TCOD_console_print_rect(TCOD_console_t con,int x, int y, int w, int h, const char *fmt, ...); +TCODLIB_API int TCOD_console_print_rect_ex(TCOD_console_t con,int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const char *fmt, ...); +TCODLIB_API int TCOD_console_get_height_rect(TCOD_console_t con,int x, int y, int w, int h, const char *fmt, ...); + +TCODLIB_API void TCOD_console_rect(TCOD_console_t con,int x, int y, int w, int h, bool clear, TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_hline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_vline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag); +TCODLIB_API void TCOD_console_print_frame(TCOD_console_t con,int x,int y,int w,int h, bool empty, TCOD_bkgnd_flag_t flag, const char *fmt, ...); + +#ifndef NO_UNICODE +/* unicode support */ +TCODLIB_API void TCOD_console_map_string_to_font_utf(const wchar_t *s, int fontCharX, int fontCharY); +TCODLIB_API void TCOD_console_print_utf(TCOD_console_t con,int x, int y, const wchar_t *fmt, ...); +TCODLIB_API void TCOD_console_print_ex_utf(TCOD_console_t con,int x, int y, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...); +TCODLIB_API int TCOD_console_print_rect_utf(TCOD_console_t con,int x, int y, int w, int h, const wchar_t *fmt, ...); +TCODLIB_API int TCOD_console_print_rect_ex_utf(TCOD_console_t con,int x, int y, int w, int h, TCOD_bkgnd_flag_t flag, TCOD_alignment_t alignment, const wchar_t *fmt, ...); +TCODLIB_API int TCOD_console_get_height_rect_utf(TCOD_console_t con,int x, int y, int w, int h, const wchar_t *fmt, ...); +#endif + + +TCODLIB_API TCOD_color_t TCOD_console_get_default_background(TCOD_console_t con); +TCODLIB_API TCOD_color_t TCOD_console_get_default_foreground(TCOD_console_t con); +TCODLIB_API TCOD_color_t TCOD_console_get_char_background(TCOD_console_t con,int x, int y); +TCODLIB_API TCOD_color_t TCOD_console_get_char_foreground(TCOD_console_t con,int x, int y); +TCODLIB_API int TCOD_console_get_char(TCOD_console_t con,int x, int y); + +TCODLIB_API void TCOD_console_set_fade(uint8 val, TCOD_color_t fade); +TCODLIB_API uint8 TCOD_console_get_fade(); +TCODLIB_API TCOD_color_t TCOD_console_get_fading_color(); + +TCODLIB_API void TCOD_console_flush(); + +TCODLIB_API void TCOD_console_set_color_control(TCOD_colctrl_t con, TCOD_color_t fore, TCOD_color_t back); + +TCODLIB_API TCOD_key_t TCOD_console_check_for_keypress(int flags); +TCODLIB_API TCOD_key_t TCOD_console_wait_for_keypress(bool flush); +TCODLIB_API void TCOD_console_set_keyboard_repeat(int initial_delay, int interval); +TCODLIB_API void TCOD_console_disable_keyboard_repeat(); +TCODLIB_API bool TCOD_console_is_key_pressed(TCOD_keycode_t key); + +/* ASCII paint file support */ +TCODLIB_API TCOD_console_t TCOD_console_from_file(const char *filename); +TCODLIB_API bool TCOD_console_load_asc(TCOD_console_t con, const char *filename); +TCODLIB_API bool TCOD_console_load_apf(TCOD_console_t con, const char *filename); +TCODLIB_API bool TCOD_console_save_asc(TCOD_console_t con, const char *filename); +TCODLIB_API bool TCOD_console_save_apf(TCOD_console_t con, const char *filename); + +TCODLIB_API TCOD_console_t TCOD_console_new(int w, int h); +TCODLIB_API int TCOD_console_get_width(TCOD_console_t con); +TCODLIB_API int TCOD_console_get_height(TCOD_console_t con); +TCODLIB_API void TCOD_console_set_key_color(TCOD_console_t con,TCOD_color_t col); +TCODLIB_API void TCOD_console_blit(TCOD_console_t src,int xSrc, int ySrc, int wSrc, int hSrc, TCOD_console_t dst, int xDst, int yDst, float foreground_alpha, float background_alpha); +TCODLIB_API void TCOD_console_delete(TCOD_console_t console); + +TCODLIB_API void TCOD_console_credits(); +TCODLIB_API void TCOD_console_credits_reset(); +TCODLIB_API bool TCOD_console_credits_render(int x, int y, bool alpha); + +#endif diff --git a/tcod/tcod_sys/libtcod/include/console.hpp b/tcod/tcod_sys/libtcod/include/console.hpp new file mode 100644 index 00000000..21cccb2c --- /dev/null +++ b/tcod/tcod_sys/libtcod/include/console.hpp @@ -0,0 +1,1770 @@ +/* +* libtcod 1.5.2 +* Copyright (c) 2008,2009,2010,2012 Jice & Mingos +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * The name of Jice or Mingos may not be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _TCOD_CONSOLE_HPP +#define _TCOD_CONSOLE_HPP + +#include "console_types.h" + +/** + @PageName console + @PageCategory Core + @PageTitle Console + @PageDesc The console emulator handles the rendering of the game screen and the keyboard input. +Classic real time game loop: + @Cpp + TCODConsole::initRoot(80,50,"my game",false); + TCODSystem::setFps(25); // limit framerate to 25 frames per second + while (!endGame && !TCODConsole::isWindowClosed()) { + TCOD_key_t key; + TCODSystem::checkForEvent(TCOD_EVENT_KEY_PRESS,&key,NULL); + updateWorld (key, TCODSystem::getLastFrameLength()); + // updateWorld(TCOD_key_t key, float elapsed) (using key if key.vk != TCODK_NONE) + // use elapsed to scale any update that is time dependant. + // ... draw world+GUI on TCODConsole::root + TCODConsole::flush(); + } + @Lua + tcod.console.initRoot(80,50,"my game", false) + root=libtcod.TCODConsole_root + tcod.system.setFps(25) + while not tcod.console.isWindowClosed() do + -- ... draw on root + tcod.console.flush() + key=tcod.console.checkForKeypress() + -- ... update world, using key and tcod.system.getLastFrameLength + end + +*/ +/** + @PageName console + @FuncDesc Classic turn by turn game loop: + @Cpp + TCODConsole::initRoot(80,50,"my game",false); + while (!endGame && !TCODConsole::isWindowClosed()) { + // ... draw on TCODConsole::root + TCODConsole::flush(); + TCOD_key_t key; + TCODConsole::waitForEvent(TCOD_EVENT_KEY_PRESS,&key,NULL,true); + //... update world, using key + } +*/ + +class TCODLIB_API TCODConsole { +public : + /** + @PageName console_init + @PageTitle Initializing the console + @PageFather console + */ + + static TCODConsole *root; + + /** + @PageName console_init_root + @PageTitle Creating the game window + @PageFather console_init + @Cpp static void TCODConsole::initRoot (int w, int h, const char * title, bool fullscreen = false, TCOD_renderer_t renderer = TCOD_RENDERER_SDL) + @C void TCOD_console_init_root (int w, int h, const char * title, bool fullscreen, TCOD_renderer_t renderer) + @Py console_init_root (w, h, title, fullscreen = False, renderer = RENDERER_SDL) + @C# + static void TCODConsole::initRoot(int w, int h, string title) + static void TCODConsole::initRoot(int w, int h, string title, bool fullscreen) + static void TCODConsole::initRoot(int w, int h, string title, bool fullscreen, TCODRendererType renderer) + @Lua + tcod.console.initRoot(w,h,title) -- fullscreen = false, renderer = SDL + tcod.console.initRoot(w,h,title,fullscreen) -- renderer = SDL + tcod.console.initRoot(w,h,title,fullscreen,renderer) + -- renderers : tcod.GLSL, tcod.OpenGL, tcod.SDL + @Param w,h size of the console(in characters). The default font in libtcod (./terminal.png) uses 8x8 pixels characters. + You can change the font by calling TCODConsole::setCustomFont before calling initRoot. + @Param title title of the window. It's not visible when you are in fullscreen. + Note 1 : you can dynamically change the window title with TCODConsole::setWindowTitle + @Param fullscreen wether you start in windowed or fullscreen mode. + Note 1 : you can dynamically change this mode with TCODConsole::setFullscreen + Note 2 : you can get current mode with TCODConsole::isFullscreen + @Param renderer which renderer to use. Possible values are : + * TCOD_RENDERER_GLSL : works only on video cards with pixel shaders + * TCOD_RENDERER_OPENGL : works on all video cards supporting OpenGL 1.4 + * TCOD_RENDERER_SDL : should work everywhere! + Note 1: if you select a renderer that is not supported by the player's machine, libtcod scan the lower renderers until it finds a working one. + Note 2: on recent video cards, GLSL results in up to 900% increase of framerates in the true color sample compared to SDL renderer. + Note 3: whatever renderer you use, it can always be overriden by the player through the libtcod.cfg file. + Note 4: you can dynamically change the renderer after calling initRoot with TCODSystem::setRenderer. + Note 5: you can get current renderer with TCODSystem::getRenderer. It might be different from the one you set in initRoot in case it's not supported on the player's computer. + @CppEx TCODConsole::initRoot(80, 50, "The Chronicles Of Doryen v0.1"); + @CEx TCOD_console_init_root(80, 50, "The Chronicles Of Doryen v0.1", false, TCOD_RENDERER_OPENGL); + @PyEx libtcod.console_init_root(80, 50, 'The Chronicles Of Doryen v0.1') + @LuaEx tcod.console.initRoot(80,50,"The Chronicles Of Doryen v0.1") + */ + static void initRoot(int w, int h, const char * title, bool fullscreen = false, TCOD_renderer_t renderer=TCOD_RENDERER_SDL); + + /** + @PageName console_set_custom_font + @PageTitle Using a custom bitmap font + @PageFather console_init + @FuncTitle setCustomFont + @FuncDesc This function allows you to use a bitmap font (png or bmp) with custom character size or layout. + It should be called before initializing the root console with initRoot. + Once this function is called, you can define your own custom mappings using mapping functions +